AT&T 1712 and 1802 release code
[so.git] / common / src / main / java / org / openecomp / mso / client / RestPropertiesLoader.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.mso.client;
22
23 import java.util.Iterator;
24 import java.util.ServiceLoader;
25
26 public class RestPropertiesLoader {
27
28         private final ServiceLoader<RestProperties> services;
29         private RestPropertiesLoader() {
30                 services = ServiceLoader.load(RestProperties.class);
31         }
32         
33         private static class Helper {
34                 private static final RestPropertiesLoader INSTANCE = new RestPropertiesLoader();
35         }
36         
37         public static RestPropertiesLoader getInstance() {
38                 return Helper.INSTANCE;
39         }
40         
41         public <T> T getNewImpl(Class<? extends RestProperties> clazz) {
42                 return this.getImpl(clazz, true);
43         }
44         public <T> T getImpl(Class<? extends RestProperties> clazz) {
45                 return this.getImpl(clazz, false);
46         }
47         
48         private <T> T getImpl(Class<? extends RestProperties> clazz, boolean forceNewInstance) {
49                 T result = null;
50                 Iterator<RestProperties> propertyImpls = services.iterator();
51                 RestProperties item;
52                 while (propertyImpls.hasNext()) {
53                         item = propertyImpls.next();
54                         if (clazz.isAssignableFrom(item.getClass())) {
55                                 try {
56                                         if (forceNewInstance) { 
57                                                 result = (T)item.getClass().newInstance();
58                                         } else {
59                                                 result = (T)item;
60                                         }
61                                 } catch (InstantiationException | IllegalAccessException e) {
62                                         /* all spi implementations must provide a public
63                                          * no argument constructor
64                                          */
65                                         
66                                 }
67                                 //break;
68                         }
69                 }
70                 
71                 return result;
72         }
73 }