| /** |
| * 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. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.atlas.odf.core; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Properties; |
| import java.util.logging.Level; |
| import java.util.logging.Logger; |
| |
| import org.apache.atlas.odf.api.utils.ODFLogConfig; |
| |
| public class ODFInternalFactory { |
| |
| private static Properties defaultImplemenetations = Utils.readConfigProperties("org/apache/atlas/odf/core/internal/odf-default-implementation.properties"); |
| private static ODFImplementations overwrittenImplementations = null; |
| private static Map<Class<?>, Object> singletons = new HashMap<>(); |
| |
| public static String SINGLETON_MARKER = "@singleton"; |
| |
| static { |
| ODFLogConfig.run(); |
| |
| Logger logger = Logger.getLogger(ODFInternalFactory.class.getName()); |
| ClassLoader cl = ODFInternalFactory.class.getClassLoader(); |
| String overwriteConfig = "org/apahe/atlas/odf/odf-implementation.properties"; |
| overwrittenImplementations = new ODFImplementations(overwriteConfig, cl); |
| if (overwrittenImplementations.getImplementations().isEmpty()) { |
| overwrittenImplementations = null; |
| } else { |
| logger.log(Level.INFO, "Found overwritten implementation config: {0}", overwrittenImplementations.getImplementations()); |
| } |
| if (overwrittenImplementations == null) { |
| logger.log(Level.INFO, "Default implementations are used"); |
| } |
| } |
| |
| private Object createObject(Class<?> cl) throws ClassNotFoundException, IllegalAccessException, InstantiationException { |
| String clazz = null; |
| if (overwrittenImplementations != null) { |
| clazz = overwrittenImplementations.getImplementations().get(cl.getName()); |
| } |
| if (clazz == null) { |
| clazz = defaultImplemenetations.getProperty(cl.getName()); |
| } |
| if (clazz == null) { |
| // finally try to instantiate the class as such |
| clazz = cl.getName(); |
| } |
| boolean isSingleton = false; |
| if (clazz.endsWith(SINGLETON_MARKER)) { |
| clazz = clazz.substring(0, clazz.length() - SINGLETON_MARKER.length()); |
| isSingleton = true; |
| } |
| Object o = null; |
| Class<?> implClass = this.getClass().getClassLoader().loadClass(clazz); |
| if (isSingleton) { |
| o = singletons.get(implClass); |
| if (o == null) { |
| o = implClass.newInstance(); |
| singletons.put(implClass, o); |
| } |
| } else { |
| o = implClass.newInstance(); |
| } |
| return o; |
| } |
| |
| @SuppressWarnings("unchecked") |
| public <T> T create(Class<T> cl) { |
| try { |
| return (T) createObject(cl); |
| } catch (ClassNotFoundException e) { |
| throw new RuntimeException(e); |
| } catch (IllegalAccessException e) { |
| throw new RuntimeException(e); |
| } catch (InstantiationException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| } |