re base code
[sdc.git] / openecomp-be / lib / openecomp-core-lib / openecomp-facade-lib / openecomp-facade-core / src / main / java / org / openecomp / core / factory / api / AbstractComponentFactory.java
1 /*
2  * Copyright © 2016-2017 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.openecomp.core.factory.api;
18
19 import org.apache.commons.lang3.StringUtils;
20 import org.openecomp.core.factory.FactoryConfig;
21 import org.openecomp.core.factory.impl.AbstractFactoryBase;
22 import org.openecomp.sdc.common.errors.CoreException;
23 import org.openecomp.sdc.common.errors.ErrorCategory;
24 import org.openecomp.sdc.common.errors.ErrorCode;
25
26 import java.util.Map;
27
28 public abstract class AbstractComponentFactory<I> extends AbstractFactory<I> {
29
30   static {
31     Registry registry = new RegistryImpl();
32     InitializationHelper.registerFactoryMapping(registry);
33   }
34
35   @FunctionalInterface
36   interface Registry {
37     void register(String factory, String impl);
38   }
39
40   private static class RegistryImpl implements Registry {
41     @Override
42     public void register(String factory, String impl) {
43       AbstractFactoryBase.registerFactory(factory, impl);
44     }
45   }
46
47   static class InitializationHelper {
48
49
50     private static boolean isRegistered = false;
51
52     private InitializationHelper() {
53     }
54
55     static synchronized void registerFactoryMapping(Registry registry) {
56       if (!isRegistered) {
57         registerFactoryMappingImpl(registry);
58         isRegistered = true;
59       }
60     }
61
62     private static void registerFactoryMappingImpl(Registry registry) {
63       Map<String, String> factoryMap = FactoryConfig.getFactoriesMap();
64
65         for (Map.Entry<String, String> entry : factoryMap.entrySet()) {
66           String abstractClassName = entry.getKey();
67           String concreteTypeName = entry.getValue();
68
69           if (StringUtils.isEmpty(concreteTypeName)) {
70             throw new CoreException(
71                 new ErrorCode.ErrorCodeBuilder().withId("E0003")
72                     .withMessage("Missing configuration value:" + concreteTypeName + ".")
73                     .withCategory(ErrorCategory.SYSTEM).build());
74
75           }
76           registry.register(abstractClassName, concreteTypeName);
77         }
78     }
79   }
80
81 }