diff options
Diffstat (limited to 'openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api')
3 files changed, 50 insertions, 73 deletions
diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/api/AbstractFactory.java b/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/api/AbstractFactory.java index 12956417dd..87da8fc6e4 100644 --- a/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/api/AbstractFactory.java +++ b/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/api/AbstractFactory.java @@ -7,9 +7,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -17,20 +17,15 @@ * limitations under the License. * ============LICENSE_END========================================================= */ - package org.openecomp.core.factory.api; import org.openecomp.core.factory.impl.AbstractFactoryBase; /** - * This class provides generic implementation of an abstract factory. Components exposed as Java - * interfaces should have their own concrete factories derived from the given class. This assures - * code alignment and consistency across all Service Management components. - * The class actually - * uses singleton pattern to instantiate and reuse just one instance of a factory. Therefore, each - * factory implementation has to be <i>thread-safe</i>. - * In a general case, the hierarchy of - * factory objects for an Java interface <tt>IUknown</tt> may look as follows: + * This class provides generic implementation of an abstract factory. Components exposed as Java interfaces should have their own concrete factories + * derived from the given class. This assures code alignment and consistency across all Service Management components. The class actually uses + * singleton pattern to instantiate and reuse just one instance of a factory. Therefore, each factory implementation has to be <i>thread-safe</i>. In + * a general case, the hierarchy of factory objects for an Java interface <tt>IUknown</tt> may look as follows: * <pre> * AbstractFactory<IUnknown> * ^ @@ -42,12 +37,10 @@ import org.openecomp.core.factory.impl.AbstractFactoryBase; * | | * BaselineFactoryImpl CustomFactoryImpl * </pre> - * Where the classes responsibility is: <ul> <li>Abstract factory - common logic to retrieve the - * implementation class name from a central repository.</li> <li>Concrete factory - abstract class - * that only exposes to application layer the type specific API such as: <ul> <li><tt>public static - * ConcreteFactory getInstance()</tt></li> </ul> <li>Baseline factory - out of the box - * implementation of concrete factory (that can be replaced by a custom one depending on customer - * needs) which actually implements method: <ul> <li><tt>public IUnknown createInterface()</tt></li> + * Where the classes responsibility is: <ul> <li>Abstract factory - common logic to retrieve the implementation class name from a central + * repository.</li> <li>Concrete factory - abstract class that only exposes to application layer the type specific API such as: <ul> <li><tt>public + * static ConcreteFactory getInstance()</tt></li> </ul> <li>Baseline factory - out of the box implementation of concrete factory (that can be replaced + * by a custom one depending on customer needs) which actually implements method: <ul> <li><tt>public IUnknown createInterface()</tt></li> * </ul> </ul> The normal concrete factory class may look like: * <pre> * public abstract class ConcreteFactory extends AbstractFactory<IUnknown> { @@ -64,18 +57,15 @@ import org.openecomp.core.factory.impl.AbstractFactoryBase; */ public abstract class AbstractFactory<I> extends AbstractFactoryBase { - - /** - * Returns the interface implementor instance. - * <b>Note</b>: It's up to the concrete factory to decide on the actual - * implementation of the returned interface. Therefore, the call can get the - * same instance per each call in case of singleton implementation or new - * instance otherwise. However, the API consumer may not assume anything - * regarding the underlying logic and has always go through the factory to - * obtain the reference. - * - * @return Implementor of the exposed Java interface. - */ - public abstract I createInterface(); - + /** + * Returns the interface implementor instance. + * <b>Note</b>: It's up to the concrete factory to decide on the actual + * implementation of the returned interface. Therefore, the call can get the same instance per each call in case of singleton implementation or + * new instance otherwise. However, the API consumer may not assume anything regarding the underlying logic and has always go through the factory + * to obtain the reference. + * + * @return Implementor of the exposed Java interface. + */ + public abstract I createInterface(); } // End of class + diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/impl/AbstractFactoryBase.java b/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/impl/AbstractFactoryBase.java index 3a117ef063..41bfeab826 100644 --- a/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/impl/AbstractFactoryBase.java +++ b/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/impl/AbstractFactoryBase.java @@ -13,30 +13,30 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.openecomp.core.factory.impl; public abstract class AbstractFactoryBase { - /** - * Instantiates the configured implementation of an abstract factory. - * - * @param <F> Type specific abstract factory for concrete Java interface - * @param factoryType Java class of type specific abstract factory - * @return Instance of implementation class - */ - public static <F extends AbstractFactoryBase> F getInstance(Class<F> factoryType) { - return FactoryManager.getInstance().getFactoryInstance(factoryType); - } + /** + * Instantiates the configured implementation of an abstract factory. + * + * @param <F> Type specific abstract factory for concrete Java interface + * @param factoryType Java class of type specific abstract factory + * @return Instance of implementation class + */ + public static <F extends AbstractFactoryBase> F getInstance(Class<F> factoryType) { + return FactoryManager.getInstance().getFactoryInstance(factoryType); + } + + protected void init() { + // allows custom initialization - protected void init() { - // allows custom initialization - // noop by default - } + // noop by default + } - protected void stop() { - // allows custom shutdown - // noop by default - } + protected void stop() { + // allows custom shutdown + // noop by default + } } diff --git a/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/impl/FactoryManager.java b/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/impl/FactoryManager.java index ec2d93f35b..26816aaafe 100644 --- a/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/impl/FactoryManager.java +++ b/openecomp-be/lib/openecomp-core-lib/openecomp-facade-lib/openecomp-facade-api/src/main/java/org/openecomp/core/factory/impl/FactoryManager.java @@ -16,7 +16,6 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ - package org.openecomp.core.factory.impl; import com.amdocs.zusammen.utils.facade.impl.FactoryConfig; @@ -33,9 +32,8 @@ public class FactoryManager { private static final FactoryManager instance = new FactoryManager(); private static final String ERROR_CODE_E0001 = "E0001"; /** - * Temporary registry of default implementations. The map keeps class names rather then class - * types to allow unloading of those classes from memory by garbage collector if factory is not - * actually used. + * Temporary registry of default implementations. The map keeps class names rather then class types to allow unloading of those classes from + * memory by garbage collector if factory is not actually used. */ private final Map<String, String> factoryRegistry = new ConcurrentHashMap<>(); /** @@ -43,7 +41,6 @@ public class FactoryManager { */ private final Map<String, AbstractFactoryBase> factoryInstanceMap = new ConcurrentHashMap<>(); - private FactoryManager() { initializeFactoryRegistry(); } @@ -54,17 +51,13 @@ public class FactoryManager { private void initializeFactoryRegistry() { final Map<String, String> factoryMap = FactoryConfig.getFactoriesMap(); - for (final Map.Entry<String, String> entry : factoryMap.entrySet()) { final String abstractClassName = entry.getKey(); final String concreteTypeName = entry.getValue(); - if (StringUtils.isEmpty(concreteTypeName)) { throw new CoreException( - new ErrorCode.ErrorCodeBuilder().withId("E0003") - .withMessage("Missing configuration value:" + concreteTypeName + ".") + new ErrorCode.ErrorCodeBuilder().withId("E0003").withMessage("Missing configuration value:" + concreteTypeName + ".") .withCategory(ErrorCategory.SYSTEM).build()); - } registerFactory(abstractClassName, concreteTypeName); } @@ -80,32 +73,26 @@ public class FactoryManager { @SuppressWarnings("unchecked") public <F extends AbstractFactoryBase> F getFactoryInstance(Class<F> factoryType) { if (factoryType == null) { - throw new CoreException( - new ErrorCode.ErrorCodeBuilder().withId(ERROR_CODE_E0001) - .withMessage("Mandatory input factory type.").withCategory(ErrorCategory.SYSTEM) - .build()); - + throw new CoreException(new ErrorCode.ErrorCodeBuilder().withId(ERROR_CODE_E0001).withMessage("Mandatory input factory type.") + .withCategory(ErrorCategory.SYSTEM).build()); } final String factoryTypeName = factoryType.getName(); // Check if the factory is already cached if (factoryInstanceMap.get(factoryTypeName) == null) { //if not, create a new one and cache it + // Get the implementation class name final String implName = factoryRegistry.get(factoryTypeName); - if (StringUtils.isEmpty(implName)) { throw new CoreException( - new ErrorCode.ErrorCodeBuilder().withId(ERROR_CODE_E0001) - .withMessage("Mandatory input factory implementation.") + new ErrorCode.ErrorCodeBuilder().withId(ERROR_CODE_E0001).withMessage("Mandatory input factory implementation.") .withCategory(ErrorCategory.SYSTEM).build()); } - F factory = CommonMethods.newInstance(implName, factoryType); factory.init(); // Cache the instantiated singleton factoryInstanceMap.putIfAbsent(factoryTypeName, factory); } - return (F) factoryInstanceMap.get(factoryTypeName); } @@ -115,6 +102,7 @@ public class FactoryManager { /** * Unregister factory and removes the cached instance if any. + * * @param factoryName the factory name to unregister */ public void unregisterFactory(final String factoryName) { @@ -134,10 +122,9 @@ public class FactoryManager { public <F extends AbstractFactoryBase> void removeFactoryInstance(Class<F> factory) { if (factory == null) { throw new CoreException( - new ErrorCode.ErrorCodeBuilder().withId(ERROR_CODE_E0001).withMessage("Mandatory input factory.") - .withCategory(ErrorCategory.SYSTEM).build()); + new ErrorCode.ErrorCodeBuilder().withId(ERROR_CODE_E0001).withMessage("Mandatory input factory.").withCategory(ErrorCategory.SYSTEM) + .build()); } - factoryInstanceMap.remove(factory.getName()); } |