/* * JacORB - a free Java ORB * * Copyright (C) 1999-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.jacorb.notification.container; import java.lang.reflect.Constructor; import org.slf4j.Logger; import org.jacorb.notification.engine.ConfigurablePushTaskExecutorFactory; import org.jacorb.notification.engine.DefaultTaskFactory; import org.jacorb.notification.engine.DefaultTaskProcessor; import org.jacorb.notification.engine.PushTaskExecutorFactory; import org.jacorb.notification.filter.impl.DefaultETCLEvaluator; import org.jacorb.notification.impl.DefaultEvaluationContextFactory; import org.jacorb.notification.impl.DefaultMessageFactory; import org.jacorb.notification.impl.PoolingEvaluationContextFactory; import org.jacorb.notification.interfaces.EvaluationContextFactory; import org.jacorb.orb.ORB; import org.picocontainer.ComponentAdapter; import org.picocontainer.MutablePicoContainer; import org.picocontainer.Parameter; import org.picocontainer.PicoContainer; import org.picocontainer.defaults.BasicComponentParameter; import org.picocontainer.defaults.CachingComponentAdapter; import org.picocontainer.defaults.CachingComponentAdapterFactory; import org.picocontainer.defaults.ComponentAdapterFactory; import org.picocontainer.defaults.ConstructorInjectionComponentAdapter; import org.picocontainer.defaults.ConstructorInjectionComponentAdapterFactory; import org.picocontainer.defaults.DefaultPicoContainer; /** * @author Alphonse Bendt */ public class PicoContainerFactory { public static MutablePicoContainer createRootContainer(ORB orb) { return createRootContainer(null, orb); } public static MutablePicoContainer createRootContainer(MutablePicoContainer optionalParent, ORB orb) { final org.jacorb.config.Configuration _config = orb.getConfiguration(); final Logger _logger = _config.getLogger(PicoContainerFactory.class.getName()); final MutablePicoContainer _container; if (optionalParent == null) { _container = createContainer(_logger); } else { _container = createContainer(optionalParent, _logger); } // register existing orb _container.registerComponentInstance(org.omg.CORBA.ORB.class, orb); registerORBServices(_container); registerCoreServices(_container); return _container; } private static void registerCoreServices(final MutablePicoContainer container) { container.registerComponent(new CachingComponentAdapter( new PushTaskExecutorFactoryComponentAdapter( new ConstructorInjectionComponentAdapter(PushTaskExecutorFactory.class, ConfigurablePushTaskExecutorFactory.class)))); // etcl evaluator container.registerComponentImplementation(DefaultETCLEvaluator.class); // message factory container.registerComponentImplementation(DefaultMessageFactory.class); // taskprocessor container.registerComponentImplementation(DefaultTaskFactory.class); container.registerComponentImplementation(DefaultTaskProcessor.class); registerEvaluationContextFactory(container); } private static void registerEvaluationContextFactory(final MutablePicoContainer container) { // PoolingEvaluationContextFactory depends on DefaultEvaluationContextFactory. // however both implement the same interface users depend on which causes an ambiguity. // therefore DefaultEvaluationContextFactory should be only visible to PoolingEvaluationContextFactory. final ConstructorInjectionComponentAdapter _serviceCA = new ConstructorInjectionComponentAdapter(DefaultEvaluationContextFactory.class, DefaultEvaluationContextFactory.class); final ConstructorInjectionComponentAdapter _poolingServiceCA = new ConstructorInjectionComponentAdapter(EvaluationContextFactory.class, PoolingEvaluationContextFactory.class, new Parameter[] {BasicComponentParameter.BASIC_DEFAULT, new BasicComponentParameter(DefaultEvaluationContextFactory.class)}); final LocalParameterComponentAdapter _localParamCA = new LocalParameterComponentAdapter(_poolingServiceCA, new ComponentAdapter[] {_serviceCA}); final ComponentAdapter _cachingCA = new CachingComponentAdapter(_localParamCA); container.registerComponent(_cachingCA); } private static void registerORBServices(final MutablePicoContainer container) { // register services that need to be looked up via orb using custom componentadapter // POA container.registerComponent(new CachingComponentAdapter(new BiDirGiopPOAComponentAdapter(new POAComponentAdapter()))); // DynAnyFactory container.registerComponent(new CachingComponentAdapter(new DynAnyFactoryComponentAdapter())); // Configuration container.registerComponent(new CachingComponentAdapter(new ConfigurationComponentAdapter())); // FilterFactory container.registerComponent(new CachingComponentAdapter(new FilterFactoryComponentAdapter())); // IFR container.registerComponent(new CachingComponentAdapter(new RepositoryComponentAdapter())); // CurrentTimeUtil container.registerComponent(new CurrentTimeUtilComponentAdapter()); } private static MutablePicoContainer createContainer(MutablePicoContainer parent, final Logger logger) { final MutablePicoContainer _container; _container = parent.makeChildContainer(); logger.debug("Created Container with Parent"); return _container; } private static MutablePicoContainer createContainer(final Logger logger) { final ConstructorInjectionComponentAdapterFactory _nonCachingCAFactory = new ConstructorInjectionComponentAdapterFactory(); //false, new ConsoleComponentMonitor(System.out)); final ComponentAdapterFactory _cachingCAFactory = new CachingComponentAdapterFactory(_nonCachingCAFactory); final MutablePicoContainer _container = new DefaultPicoContainer(_cachingCAFactory); _container.registerComponentInstance(ComponentAdapterFactory.class, _nonCachingCAFactory); logger.debug("Created Top Level Container"); return _container; } public static MutablePicoContainer createChildContainer(MutablePicoContainer parent) { return parent.makeChildContainer(); } /** * helper method for easier debugging of unresolved dependencies. * * do NOT delete even if method is not referenced. */ public static void dumpDependencies(PicoContainer container, Class clazzToBeCreated) { try { Constructor[] _ctors = clazzToBeCreated.getConstructors(); StringBuffer _buffer = new StringBuffer(); for (int i = 0; i < _ctors.length; i++) { Constructor _ctor = _ctors[i]; _buffer.append(_ctor); _buffer.append("\n"); Class[] _params = _ctor.getParameterTypes(); for (int j = 0; j < _params.length; j++) { Class _param = _params[j]; boolean resolvable = container.getComponentInstanceOfType(_param) != null; _buffer.append(j); _buffer.append(": "); _buffer.append(_param); _buffer.append(" -> "); _buffer.append(resolvable); _buffer.append("\n"); } } System.err.println(_buffer.toString()); } catch (Exception e) { e.printStackTrace(); } } }