Author: jochen Date: Tue Nov 4 13:05:37 2014 New Revision: 1636573 URL: http://svn.apache.org/r1636573 Log: Adding Commons Inject to the Sandbox.
Added: commons/sandbox/commons-inject/trunk/.classpath (with props) commons/sandbox/commons-inject/trunk/.gitignore commons/sandbox/commons-inject/trunk/.project (with props) commons/sandbox/commons-inject/trunk/.settings/ commons/sandbox/commons-inject/trunk/.settings/org.eclipse.core.resources.prefs (with props) commons/sandbox/commons-inject/trunk/.settings/org.eclipse.jdt.core.prefs (with props) commons/sandbox/commons-inject/trunk/.settings/org.eclipse.m2e.core.prefs (with props) commons/sandbox/commons-inject/trunk/pom.xml (with props) commons/sandbox/commons-inject/trunk/src/ commons/sandbox/commons-inject/trunk/src/main/ commons/sandbox/commons-inject/trunk/src/main/java/ commons/sandbox/commons-inject/trunk/src/main/java/org/ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/AbstractLoggerInjectingModule.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsInject.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsLoggingLoggerModule.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IBinding.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjector.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjectorBuilder.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IKey.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleController.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleListener.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IPoint.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IProvider.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/InjLogger.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Key.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Log4jLoggerModule.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/NoSuchBindingException.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/PostConstructModule.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Slf4JLoggerModule.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IAnnotatedBindingBuilder.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IBinder.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/ILinkedBindingBuilder.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IModule.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IScopedBindingBuilder.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/Scopes.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBaseProvider.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBindingSet.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractInjector.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractScopedProvider.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/BindingProxy.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjector.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjectorBuilder.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultLifecycleController.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultProvider.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FactoryMethodProvider.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FieldPoint.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IInjectorAware.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IMutableBindingSource.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/ImmutableBindingSet.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/Introspector.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/ListPoint.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/MethodPoint.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/MutableBindingSet.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/ResolvableBindingSet.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/bind/ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/bind/DefaultBinding.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/bind/DefaultBindingBuilder.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/bind/EagerSingletonProvider.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/bind/LazySingletonProvider.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/bind/PerCallProvider.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/util/ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/util/Exceptions.java (with props) commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/util/Generics.java (with props) commons/sandbox/commons-inject/trunk/src/main/resources/ commons/sandbox/commons-inject/trunk/src/test/ commons/sandbox/commons-inject/trunk/src/test/java/ commons/sandbox/commons-inject/trunk/src/test/java/org/ commons/sandbox/commons-inject/trunk/src/test/java/org/apache/ commons/sandbox/commons-inject/trunk/src/test/java/org/apache/commons/ commons/sandbox/commons-inject/trunk/src/test/java/org/apache/commons/impl/ commons/sandbox/commons-inject/trunk/src/test/java/org/apache/commons/impl/ListenerTest.java (with props) commons/sandbox/commons-inject/trunk/src/test/java/org/apache/commons/impl/Log4jLoggerModuleTest.java (with props) commons/sandbox/commons-inject/trunk/src/test/java/org/apache/commons/impl/SimpleInjectorTest.java (with props) commons/sandbox/commons-inject/trunk/src/test/java/org/apache/commons/impl/TckTest.java (with props) commons/sandbox/commons-inject/trunk/src/test/java/org/apache/commons/impl/TimeRecordingObject.java (with props) commons/sandbox/commons-inject/trunk/src/test/resources/ Modified: commons/sandbox/commons-inject/trunk/ (props changed) Propchange: commons/sandbox/commons-inject/trunk/ ------------------------------------------------------------------------------ --- svn:ignore (added) +++ svn:ignore Tue Nov 4 13:05:37 2014 @@ -0,0 +1 @@ +target Added: commons/sandbox/commons-inject/trunk/.classpath URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/.classpath?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/.classpath (added) +++ commons/sandbox/commons-inject/trunk/.classpath Tue Nov 4 13:05:37 2014 @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" output="target/classes" path="src/main/java"> + <attributes> + <attribute name="optional" value="true"/> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="src" output="target/test-classes" path="src/test/java"> + <attributes> + <attribute name="optional" value="true"/> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"> + <attributes> + <attribute name="maven.pomderived" value="true"/> + </attributes> + </classpathentry> + <classpathentry kind="output" path="target/classes"/> +</classpath> Propchange: commons/sandbox/commons-inject/trunk/.classpath ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/.gitignore URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/.gitignore?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/.gitignore (added) +++ commons/sandbox/commons-inject/trunk/.gitignore Tue Nov 4 13:05:37 2014 @@ -0,0 +1 @@ +/target/ Added: commons/sandbox/commons-inject/trunk/.project URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/.project?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/.project (added) +++ commons/sandbox/commons-inject/trunk/.project Tue Nov 4 13:05:37 2014 @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>commons-inject</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.m2e.core.maven2Builder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>org.eclipse.m2e.core.maven2Nature</nature> + </natures> +</projectDescription> Propchange: commons/sandbox/commons-inject/trunk/.project ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/.settings/org.eclipse.core.resources.prefs URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/.settings/org.eclipse.core.resources.prefs?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/.settings/org.eclipse.core.resources.prefs (added) +++ commons/sandbox/commons-inject/trunk/.settings/org.eclipse.core.resources.prefs Tue Nov 4 13:05:37 2014 @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=iso-8859-1 +encoding//src/main/resources=1.6 +encoding//src/test/java=iso-8859-1 +encoding//src/test/resources=1.6 +encoding/<project>=1.6 Propchange: commons/sandbox/commons-inject/trunk/.settings/org.eclipse.core.resources.prefs ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/.settings/org.eclipse.jdt.core.prefs URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/.settings/org.eclipse.jdt.core.prefs?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/.settings/org.eclipse.jdt.core.prefs (added) +++ commons/sandbox/commons-inject/trunk/.settings/org.eclipse.jdt.core.prefs Tue Nov 4 13:05:37 2014 @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 Propchange: commons/sandbox/commons-inject/trunk/.settings/org.eclipse.jdt.core.prefs ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/.settings/org.eclipse.m2e.core.prefs URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/.settings/org.eclipse.m2e.core.prefs?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/.settings/org.eclipse.m2e.core.prefs (added) +++ commons/sandbox/commons-inject/trunk/.settings/org.eclipse.m2e.core.prefs Tue Nov 4 13:05:37 2014 @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 Propchange: commons/sandbox/commons-inject/trunk/.settings/org.eclipse.m2e.core.prefs ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/pom.xml URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/pom.xml?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/pom.xml (added) +++ commons/sandbox/commons-inject/trunk/pom.xml Tue Nov 4 13:05:37 2014 @@ -0,0 +1,128 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.commons</groupId> + <artifactId>commons-sandbox-parent</artifactId> + <version>10</version> + </parent> + <artifactId>commons-inject</artifactId> + <version>0.0.1-SNAPSHOT</version> + <name>Apache Commons Inject</name> + <description>A JSR 330 compliant dependency injection framework.</description> + <build> + <pluginManagement> + <plugins> + <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.--> + <plugin> + <groupId>org.eclipse.m2e</groupId> + <artifactId>lifecycle-mapping</artifactId> + <version>1.0.0</version> + <configuration> + <lifecycleMappingMetadata> + <pluginExecutions> + <pluginExecution> + <pluginExecutionFilter> + <groupId> + org.apache.felix + </groupId> + <artifactId> + maven-bundle-plugin + </artifactId> + <versionRange> + [2.3.7,) + </versionRange> + <goals> + <goal>manifest</goal> + </goals> + </pluginExecutionFilter> + <action> + <execute/> + </action> + </pluginExecution> + <pluginExecution> + <pluginExecutionFilter> + <groupId> + org.apache.maven.plugins + </groupId> + <artifactId> + maven-antrun-plugin + </artifactId> + <versionRange> + [1.7,) + </versionRange> + <goals> + <goal>run</goal> + </goals> + </pluginExecutionFilter> + <action> + <execute/> + </action> + </pluginExecution> + <pluginExecution> + <pluginExecutionFilter> + <groupId> + org.apache.maven.plugins + </groupId> + <artifactId> + maven-remote-resources-plugin + </artifactId> + <versionRange> + [1.4,) + </versionRange> + <goals> + <goal>process</goal> + </goals> + </pluginExecutionFilter> + <action> + <execute/> + </action> + </pluginExecution> + </pluginExecutions> + </lifecycleMappingMetadata> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + <properties> + <maven.compile.target>1.6</maven.compile.target> + <maven.compile.source>1.6</maven.compile.source> + <project.build.sourceEncoding>1.6</project.build.sourceEncoding> + </properties> + <dependencies> + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + <version>1</version> + </dependency> + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject-tck</artifactId> + <version>1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.google.inject</groupId> + <artifactId>guice</artifactId> + <version>4.0-beta5</version> + </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>1.2.17</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>1.7.7</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + <version>1.2</version> + <scope>provided</scope> + </dependency> + </dependencies> +</project> \ No newline at end of file Propchange: commons/sandbox/commons-inject/trunk/pom.xml ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/AbstractLoggerInjectingModule.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/AbstractLoggerInjectingModule.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/AbstractLoggerInjectingModule.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/AbstractLoggerInjectingModule.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,67 @@ +package org.apache.commons.inject.api; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.inject.api.bind.IBinder; +import org.apache.commons.inject.api.bind.IModule; +import org.apache.commons.inject.api.bind.IBinder.IInjectionParticipator; +import org.apache.commons.inject.util.Exceptions; + +public abstract class AbstractLoggerInjectingModule<Log> implements IModule { + + @Override + public void configure(IBinder pBinder) { + pBinder.add(new IInjectionParticipator() { + @Override + public List<IPoint<Object>> getPoints(IKey<?> pKey, Class<?> pType) { + final List<IPoint<Object>> points = new ArrayList<IPoint<Object>>(); + final Field[] fields = pType.getDeclaredFields(); + final Class<? extends Annotation> annotationClass = getAnnotationClass(); + for (final Field f : fields) { + if (f.isAnnotationPresent(annotationClass)) { + final Annotation annotation = f.getAnnotation(annotationClass); + String id = getId(annotation, f.getDeclaringClass()); + if (id == null || id.length() == 0) { + id = f.getDeclaringClass().getName(); + } + final Log logger = newLogger(id); + points.add(new IPoint<Object>(){ + @Override + public void injectTo(Object pInstance, + IInjector pInjector) { + try { + if (!f.isAccessible()) { + f.setAccessible(true); + } + f.set(pInstance, logger); + } catch (Throwable t) { + throw Exceptions.show(t); + } + } + }); + } + } + return points; + } + }); + } + + protected abstract Log newLogger(String pId); + + protected Class<? extends Annotation> getAnnotationClass() { + return InjLogger.class; + } + + protected String getId(Annotation pAnnotation, Class<?> pClass) { + final InjLogger injLogger = (InjLogger) pAnnotation; + final String id = injLogger.id(); + if (id == null || id.length() == 0) { + return pClass.getName(); + } else { + return id; + } + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/AbstractLoggerInjectingModule.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsInject.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsInject.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsInject.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsInject.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,29 @@ +package org.apache.commons.inject.api; + +import java.util.Arrays; +import java.util.Collection; + +import org.apache.commons.inject.api.bind.IModule; +import org.apache.commons.inject.impl.DefaultInjectorBuilder; + +public class CommonsInject { + public static IInjector build(IModule... pModules) { + if (pModules == null) { + throw new NullPointerException("The module list must not be null."); + } + final Collection<IModule> modules = Arrays.asList(pModules); + return build(modules); + } + public static IInjector build(Collection<IModule> pModules) { + if (pModules == null) { + throw new NullPointerException("The module list must not be null."); + } + if (pModules.isEmpty()) { + throw new IllegalArgumentException("The module list must not be empty."); + } + return new DefaultInjectorBuilder(pModules).build(); + } + public static IInjectorBuilder newBuilder() { + return new DefaultInjectorBuilder(); + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsInject.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsLoggingLoggerModule.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsLoggingLoggerModule.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsLoggingLoggerModule.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsLoggingLoggerModule.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,11 @@ +package org.apache.commons.inject.api; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class CommonsLoggingLoggerModule extends AbstractLoggerInjectingModule<Log> { + @Override + protected Log newLogger(String pId) { + return LogFactory.getLog(pId); + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/CommonsLoggingLoggerModule.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IBinding.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IBinding.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IBinding.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IBinding.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,6 @@ +package org.apache.commons.inject.api; + +public interface IBinding<T> { + IProvider<T> getProvider(); + IPoint<T> getPoint(); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IBinding.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjector.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjector.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjector.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjector.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,13 @@ +package org.apache.commons.inject.api; + +public interface IInjector { + <T> T getInstance(Class<T> pType); + <T> T getInstance(Class<T> pType, String pName); + <T> T getInstance(IKey<T> pKey); + + <T> T requireInstance(Class<T> pType) throws NoSuchBindingException; + <T> T requireInstance(Class<T> pType, String pName) throws NoSuchBindingException; + <T> T requireInstance(IKey<T> pKey) throws NoSuchBindingException; + + void injectMembers(Object pInstance); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjector.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjectorBuilder.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjectorBuilder.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjectorBuilder.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjectorBuilder.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,10 @@ +package org.apache.commons.inject.api; + +import java.util.Collection; + +import org.apache.commons.inject.api.bind.IModule; + +public interface IInjectorBuilder { + IInjectorBuilder modules(IModule... pModules); + IInjectorBuilder modules(Collection<IModule> pModules); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IInjectorBuilder.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IKey.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IKey.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IKey.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IKey.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,9 @@ +package org.apache.commons.inject.api; + +import java.lang.annotation.Annotation; + +public interface IKey<T> { + Class<T> getType(); + String getName(); + Annotation[] getAnnotations(); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IKey.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleController.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleController.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleController.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleController.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,6 @@ +package org.apache.commons.inject.api; + +public interface ILifecycleController extends ILifecycleListener { + boolean add(ILifecycleListener pListener); + boolean remove(ILifecycleListener pListener); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleController.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleListener.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleListener.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleListener.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleListener.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,6 @@ +package org.apache.commons.inject.api; + +public interface ILifecycleListener { + void start(); + void shutdown(); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/ILifecycleListener.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IPoint.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IPoint.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IPoint.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IPoint.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,5 @@ +package org.apache.commons.inject.api; + +public interface IPoint<T> { + void injectTo(T pInstance, IInjector pInjector); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IPoint.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IProvider.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IProvider.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IProvider.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IProvider.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,8 @@ +package org.apache.commons.inject.api; + +import javax.inject.Provider; + +public interface IProvider<T> extends Provider<T> { + Class<? extends T> getType(); + T get(IInjector pInjector); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/IProvider.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/InjLogger.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/InjLogger.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/InjLogger.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/InjLogger.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,5 @@ +package org.apache.commons.inject.api; + +public @interface InjLogger { + String id(); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/InjLogger.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Key.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Key.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Key.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Key.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,80 @@ +package org.apache.commons.inject.api; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Array; + +public class Key<T> implements IKey<T> { + public static final String NO_NAME = ""; + public static final Annotation[] NO_ANNOTATIONS = (Annotation[]) Array.newInstance(Annotation.class, 0); + private final Class<T> type; + private final String name; + private final Annotation[] annotations; + + public Key(Class<T> pType, String pName, Annotation[] pAnnotations) { + if (pType == null) { + throw new NullPointerException("The keys type must not be null."); + } + this.type = pType; + if (pName == null) { + name = NO_NAME; + } else { + name = pName; + } + if (pAnnotations == null) { + annotations = NO_ANNOTATIONS; + } else { + annotations = pAnnotations; + } + } + + public Key(Class<T> pType, String pName) { + this(pType, pName, NO_ANNOTATIONS); + } + + public Key(Class<T> pType) { + this(pType, NO_NAME, NO_ANNOTATIONS); + } + + @Override + public Class<T> getType() { + return type; + } + + @Override + public String getName() { + return name; + } + + @Override + public Annotation[] getAnnotations() { + return annotations; + } + + @Override + public String toString() { + return toString(this); + } + + public static String toString(IKey<?> pKey) { + final StringBuilder sb = new StringBuilder(); + sb.append("Type="); + sb.append(pKey.getType().getName()); + final String name = pKey.getName(); + if (name.length() > 0) { + sb.append(", Name="); + sb.append(name); + } + final Annotation[] annotations = pKey.getAnnotations(); + if (annotations.length > 0) { + sb.append(", Annotations=["); + for (int i = 0; i < annotations.length; i++) { + if (i > 0) { + sb.append(","); + } + sb.append(annotations[i]); + } + sb.append("]"); + } + return sb.toString(); + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Key.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Log4jLoggerModule.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Log4jLoggerModule.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Log4jLoggerModule.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Log4jLoggerModule.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,10 @@ +package org.apache.commons.inject.api; + +import org.apache.log4j.Logger; + +public class Log4jLoggerModule extends AbstractLoggerInjectingModule<Logger> { + @Override + protected Logger newLogger(String pId) { + return Logger.getLogger(pId); + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Log4jLoggerModule.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/NoSuchBindingException.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/NoSuchBindingException.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/NoSuchBindingException.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/NoSuchBindingException.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,18 @@ +package org.apache.commons.inject.api; + +public class NoSuchBindingException extends RuntimeException { + private static final long serialVersionUID = -2705857473161808565L; + + public NoSuchBindingException(String message) { + super(message); + } + + public NoSuchBindingException(Throwable cause) { + super(cause); + } + + public NoSuchBindingException(String message, Throwable cause) { + super(message, cause); + } + +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/NoSuchBindingException.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/PostConstructModule.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/PostConstructModule.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/PostConstructModule.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/PostConstructModule.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,88 @@ +package org.apache.commons.inject.api; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; + +import org.apache.commons.inject.api.bind.IBinder; +import org.apache.commons.inject.api.bind.IModule; +import org.apache.commons.inject.api.bind.IBinder.IInjectionListener; +import org.apache.commons.inject.impl.DefaultLifecycleController; +import org.apache.commons.inject.util.Exceptions; + +public class PostConstructModule implements IModule { + private ILifecycleController controller; + + public ILifecycleController getLifecycleController() { + if (controller == null) { + controller = new DefaultLifecycleController(); + } + return controller; + } + + public void setLifecycleController(ILifecycleController pController) { + controller = pController; + } + + @Override + public void configure(IBinder pBinder) { + pBinder.add(new IInjectionListener() { + @Override + public void initialized(IKey<?> pKey, Object pObject) { + final ILifecycleListener listener = getListenerFor(pObject); + if (listener != null && listener != controller) { + controller.add(listener); + } + } + }); + pBinder.bind(ILifecycleController.class).toInstance(controller); + } + + protected ILifecycleListener getListenerFor(final Object pObject) { + if (pObject instanceof ILifecycleListener) { + return (ILifecycleListener) pObject; + } + final Method postConstructMethod = findMethod(PostConstruct.class, pObject.getClass()); + final Method preDestroyMethod = findMethod(PreDestroy.class, pObject.getClass()); + if (postConstructMethod == null && preDestroyMethod == null) { + return null; + } + return new ILifecycleListener(){ + @Override + public void start() { + invoke(postConstructMethod, pObject); + } + + @Override + public void shutdown() { + invoke(preDestroyMethod, pObject); + } + + private void invoke(Method pMethod, Object pObject) { + if (pMethod == null) { + return; + } + try { + if (!pMethod.isAccessible()) { + pMethod.setAccessible(true); + } + pMethod.invoke(pObject); + } catch (Throwable t) { + throw Exceptions.show(t); + } + } + }; + } + + private Method findMethod(Class<? extends Annotation> pAnnotationClass, Class<?> pType) { + final Method[] methods = pType.getDeclaredMethods(); + for (Method method : methods) { + if (method.isAnnotationPresent(pAnnotationClass)) { + return method; + } + } + return null; + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/PostConstructModule.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Slf4JLoggerModule.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Slf4JLoggerModule.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Slf4JLoggerModule.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Slf4JLoggerModule.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,11 @@ +package org.apache.commons.inject.api; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Slf4JLoggerModule extends AbstractLoggerInjectingModule<Logger> { + @Override + protected Logger newLogger(String pId) { + return LoggerFactory.getLogger(pId); + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/Slf4JLoggerModule.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IAnnotatedBindingBuilder.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IAnnotatedBindingBuilder.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IAnnotatedBindingBuilder.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IAnnotatedBindingBuilder.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,8 @@ +package org.apache.commons.inject.api.bind; + +import java.lang.annotation.Annotation; + +public interface IAnnotatedBindingBuilder<T> extends ILinkedBindingBuilder<T> { + ILinkedBindingBuilder<T> annotatedWith(Annotation pAnnotation); + ILinkedBindingBuilder<T> annotatedWith(Class<? extends Annotation> pAnnotation); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IAnnotatedBindingBuilder.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IBinder.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IBinder.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IBinder.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IBinder.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,25 @@ +package org.apache.commons.inject.api.bind; + +import java.util.List; + +import org.apache.commons.inject.api.IInjector; +import org.apache.commons.inject.api.IKey; +import org.apache.commons.inject.api.IPoint; + +public interface IBinder { + public interface IInjectionParticipator { + List<IPoint<Object>> getPoints(IKey<?> pKey, Class<?> pType); + } + public interface IInjectionListener { + void initialized(IKey<?> pKey, Object pObject); + } + public interface IInjectorBuildListener { + void created(IInjector pInjector); + } + <T> IAnnotatedBindingBuilder<T> bind(Class<T> pType); + <T> IAnnotatedBindingBuilder<T> bind(Class<T> pType, String pName); + <T> ILinkedBindingBuilder<T> bind(IKey<T> pKey); + boolean add(IInjectionListener pListener); + boolean add(IInjectorBuildListener pListener); + boolean add(IInjectionParticipator pParticipator); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IBinder.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/ILinkedBindingBuilder.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/ILinkedBindingBuilder.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/ILinkedBindingBuilder.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/ILinkedBindingBuilder.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,17 @@ +package org.apache.commons.inject.api.bind; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +import org.apache.commons.inject.api.IProvider; + +import com.google.inject.Provider; + +public interface ILinkedBindingBuilder<T> extends IScopedBindingBuilder<T> { + void toInstance(T pInstance); + IScopedBindingBuilder<T> to(Class<? extends T> pImplClass); + IScopedBindingBuilder<T> to(Constructor<? extends T> pConstructor); + IScopedBindingBuilder<T> to(Method pFactoryMethod); + <S extends T> IScopedBindingBuilder<T> to(Class<S> pType, Provider<S> pProvider); + IScopedBindingBuilder<T> to(IProvider<? extends T> pProvider); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/ILinkedBindingBuilder.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IModule.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IModule.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IModule.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IModule.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,5 @@ +package org.apache.commons.inject.api.bind; + +public interface IModule { + void configure(IBinder pBinder); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IModule.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IScopedBindingBuilder.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IScopedBindingBuilder.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IScopedBindingBuilder.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IScopedBindingBuilder.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,7 @@ +package org.apache.commons.inject.api.bind; + +public interface IScopedBindingBuilder<T> { + void scope(Scopes pScope); + void asEagerSingleton(); + void asLazySingleton(); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/IScopedBindingBuilder.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/Scopes.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/Scopes.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/Scopes.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/Scopes.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,7 @@ +package org.apache.commons.inject.api.bind; + +public enum Scopes { + PER_CALL, + EAGER_SINGLETON, + LAZY_SINGLETON +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/api/bind/Scopes.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBaseProvider.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBaseProvider.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBaseProvider.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBaseProvider.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,27 @@ +package org.apache.commons.inject.impl; + +import org.apache.commons.inject.api.IInjector; +import org.apache.commons.inject.api.IPoint; +import org.apache.commons.inject.api.IProvider; + +public abstract class AbstractBaseProvider<T> implements IProvider<T> { + private final Class<T> type; + private final IPoint<T> point; + + protected AbstractBaseProvider(Class<T> pType, IPoint<T> pPoint) { + type = pType; + point = pPoint; + } + + @Override + public T get(IInjector pInjector) { + final T t = get(); + point.injectTo(t, pInjector); + return t; + } + + @Override + public Class<T> getType() { + return type; + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBaseProvider.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBindingSet.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBindingSet.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBindingSet.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBindingSet.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,144 @@ +package org.apache.commons.inject.impl; + +import java.lang.annotation.Annotation; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.inject.api.IBinding; +import org.apache.commons.inject.api.IKey; +import org.apache.commons.inject.api.Key; + + +public class AbstractBindingSet { + public static class MappedKey<T> extends Key<T> { + private final Class<? extends Annotation> annotationType; + public MappedKey(Class<T> pType, String pName, Annotation[] pAnnotations, Class<? extends Annotation> pAnnotationType) { + super(pType, pName, pAnnotations); + annotationType = null; + } + + public Class<? extends Annotation> getAnnotationType() { + return annotationType; + } + } + protected static class BindingAndKey<T> { + private IBinding<T> binding; + private final MappedKey<T> key; + + BindingAndKey(IBinding<T> pBinding, MappedKey<T> pKey) { + binding = pBinding; + key = pKey; + } + + public IBinding<T> getBinding() { + return binding; + } + + public void setBinding(IBinding<T> pBinding) { + binding = pBinding; + } + + public MappedKey<T> getKey() { + return key; + } + } + protected static class ReducedKey<T> { + private final Class<T> type; + private final String name; + ReducedKey(Class<T> pType, String pName) { + type = pType; + name = pName; + } + public Class<T> getType() { + return type; + } + public String getName() { + return name; + } + @Override + public int hashCode() { + return 31 * (31 + name.hashCode()) + type.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ReducedKey<?> other = (ReducedKey<?>) obj; + return getType() == other.getType() && getName().equals(other.getName()); + } + + + } + + protected final Map<ReducedKey<?>, List<BindingAndKey<?>>> map; + + protected AbstractBindingSet(Map<ReducedKey<?>, List<BindingAndKey<?>>> pMap) { + map = pMap; + } + + protected AbstractBindingSet() { + this(new HashMap<ReducedKey<?>, List<BindingAndKey<?>>>()); + } + + + protected <T> ReducedKey<T> newReducedKey(IKey<T> pKey) { + return new ReducedKey<T>(pKey.getType(), pKey.getName()); + } + + protected List<BindingAndKey<?>> findOrCreateList(ReducedKey<?> pKey) { + List<BindingAndKey<?>> list = map.get(pKey); + if (list == null) { + list = new ArrayList<BindingAndKey<?>>(); + map.put(pKey, list); + } + return list; + } + + protected boolean isMatching(IKey<?> pSearchKey, MappedKey<?> pMapKey) { + // No need to compare type and name. They are matching, because + // we did a lookup with a ReducedKey to find the list of + // bindings and keys, from which pMapKey was taken. + if (!hasAnnotations(pMapKey.getAnnotations(), pSearchKey) + || !hasAnnotations(pSearchKey.getAnnotations(), pMapKey)) { + return false; + } + final Class<? extends Annotation> mappedAnnotationType = pMapKey.getAnnotationType(); + if (mappedAnnotationType != null) { + boolean found = false; + for (Annotation searchAnnotation : pSearchKey.getAnnotations()) { + if (searchAnnotation != null && mappedAnnotationType == searchAnnotation.getClass()) { + found = true; + break; + } + } + if (!found) { + return false; + } + + } + return true; + } + + private boolean hasAnnotations(Annotation[] pAnnotations, IKey<?> pKey) { + for (Annotation annotation : pAnnotations) { + boolean found = false; + for (Annotation ann : pKey.getAnnotations()) { + if (annotation.equals(ann)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + return true; + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractBindingSet.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractInjector.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractInjector.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractInjector.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractInjector.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,69 @@ +package org.apache.commons.inject.impl; + +import org.apache.commons.inject.api.IBinding; +import org.apache.commons.inject.api.IInjector; +import org.apache.commons.inject.api.IKey; +import org.apache.commons.inject.api.Key; +import org.apache.commons.inject.api.NoSuchBindingException; + +public abstract class AbstractInjector implements IInjector { + protected abstract <T> IBinding<T> getBinding(IKey<T> pKey); + protected abstract <T> IBinding<T> requireBinding(IKey<T> pKey); + + @Override + public <T> T getInstance(Class<T> pType) { + final IKey<T> key = new Key<T>(pType); + return getInstance(key); + } + + @Override + public <T> T getInstance(Class<T> pType, String pName) { + final IKey<T> key = new Key<T>(pType, pName); + return getInstance(key); + } + + @Override + public <T> T getInstance(IKey<T> pKey) { + final IBinding<T> binding = getBinding(pKey); + if (binding == null) { + return null; + } else { + return binding.getProvider().get(); + } + } + + @Override + public <T> T requireInstance(Class<T> pType) throws NoSuchBindingException { + final IKey<T> key = new Key<T>(pType); + return requireInstance(key); + } + + @Override + public <T> T requireInstance(Class<T> pType, String pName) + throws NoSuchBindingException { + final IKey<T> key = new Key<T>(pType, pName); + return requireInstance(key); + } + + @Override + public <T> T requireInstance(IKey<T> pKey) throws NoSuchBindingException { + final IBinding<T> binding = getBinding(pKey); + if (binding == null) { + throw new NoSuchBindingException("No binding registered for key: " + pKey); + } else { + return binding.getProvider().get(); + } + } + + @Override + public void injectMembers(Object pInstance) { + if (pInstance == null) { + throw new NullPointerException("The instance must not be null."); + } + @SuppressWarnings("unchecked") + final Class<Object> cl = (Class<Object>) pInstance.getClass(); + final IKey<Object> key = new Key<Object>(cl); + IBinding<Object> binding = requireBinding(key); + binding.getPoint().injectTo(pInstance, this); + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractInjector.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractScopedProvider.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractScopedProvider.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractScopedProvider.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractScopedProvider.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,44 @@ +package org.apache.commons.inject.impl; + +import org.apache.commons.inject.api.IInjector; +import org.apache.commons.inject.api.IProvider; + +public abstract class AbstractScopedProvider<T> implements IProvider<T>, IInjectorAware { + private final IProvider<T> baseProvider; + private IInjector injector; + + public AbstractScopedProvider(IProvider<T> pBaseProvider) { + baseProvider = pBaseProvider; + } + + protected IInjector getInjector() { + if (injector == null) { + throw new IllegalStateException("The Injector has not been initialized."); + } + return injector; + } + + @Override + public T get() { + final T t = baseProvider.get(getInjector()); + return t; + } + + @Override + public Class<? extends T> getType() { + return baseProvider.getType(); + } + + @Override + public T get(IInjector pInjector) { + return get(); + } + + @Override + public void init(IInjector pInjector) { + injector = pInjector; + if (baseProvider instanceof IInjectorAware) { + ((IInjectorAware) baseProvider).init(pInjector); + } + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/AbstractScopedProvider.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/BindingProxy.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/BindingProxy.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/BindingProxy.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/BindingProxy.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,52 @@ +package org.apache.commons.inject.impl; + +import org.apache.commons.inject.api.IBinding; +import org.apache.commons.inject.api.IInjector; +import org.apache.commons.inject.api.IPoint; +import org.apache.commons.inject.api.IProvider; + +public class BindingProxy<T> implements IBinding<T>, IInjectorAware { + private IBinding<T> binding; + private boolean initialized; + private final String cause; + private final RuntimeException rte = new RuntimeException(); + + public BindingProxy(String pCause) { + cause = pCause; + } + + @Override + public synchronized IProvider<T> getProvider() { + if (!initialized) { + throw new IllegalStateException("This Binding hasn't been initialized.", rte); + } + return binding.getProvider(); + } + + @Override + public IPoint<T> getPoint() { + if (!initialized) { + throw new IllegalStateException("This Binding hasn't been initialized."); + } + return binding.getPoint(); + } + + public synchronized void setBinding(IBinding<T> pBinding) { + if (pBinding == null) { + throw new NullPointerException("The proxied binding must not be null."); + } + binding = pBinding; + initialized = true; + } + + public String getCause() { + return cause; + } + + @Override + public void init(IInjector pInjector) { + if (binding != null && binding instanceof IInjectorAware) { + ((IInjectorAware) binding).init(pInjector); + } + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/BindingProxy.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjector.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjector.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjector.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjector.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,57 @@ +package org.apache.commons.inject.impl; + +import org.apache.commons.inject.api.IBinding; +import org.apache.commons.inject.api.IKey; +import org.apache.commons.inject.api.IPoint; +import org.apache.commons.inject.api.IProvider; +import org.apache.commons.inject.api.NoSuchBindingException; +import org.apache.commons.inject.impl.AbstractBindingSet.MappedKey; +import org.apache.commons.inject.impl.AbstractBindingSet.ReducedKey; +import org.apache.commons.inject.impl.bind.DefaultBinding; + +public class DefaultInjector extends AbstractInjector { + private final ImmutableBindingSet bindings; + + public DefaultInjector(ImmutableBindingSet pBindings) { + bindings = pBindings; + } + + protected <T> IBinding<T> getBinding(IKey<T> pKey) { + synchronized(bindings) { + return bindings.getBinding(pKey); + } + } + + protected <T> IBinding<T> requireBinding(IKey<T> pKey) { + synchronized(bindings) { + IBinding<T> binding; + binding = bindings.getBinding(pKey); + if (binding == null) { + final IMutableBindingSource bindingSource = getBindingSource(); + final Class<T> cl = pKey.getType(); + final IPoint<T> point = Introspector.getInstance().getPoint(cl, bindingSource); + final IProvider<T> provider = Introspector.getInstance().getProvider(cl, point, bindingSource); + binding = new DefaultBinding<T>(provider, point); + final ReducedKey<T> rkey = new ReducedKey<T>(cl, pKey.getName()); + final MappedKey<T> key = new MappedKey<T>(cl, pKey.getName(), null, null); + bindings.add(rkey, key, binding); + } + return binding; + } + } + + protected IMutableBindingSource getBindingSource() { + return new IMutableBindingSource() { + @Override + public <T> IBinding<T> requireBinding(IKey<T> pKey, String pCause) { + final IBinding<T> binding = bindings.getBinding(pKey); + if (binding == null) { + throw new NoSuchBindingException("No binding registered for key: " + pKey); + } + return binding; + } + + }; + } + +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjector.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjectorBuilder.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjectorBuilder.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjectorBuilder.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjectorBuilder.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,137 @@ +package org.apache.commons.inject.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import org.apache.commons.inject.api.IBinding; +import org.apache.commons.inject.api.IInjector; +import org.apache.commons.inject.api.IInjectorBuilder; +import org.apache.commons.inject.api.IKey; +import org.apache.commons.inject.api.bind.IAnnotatedBindingBuilder; +import org.apache.commons.inject.api.bind.IBinder; +import org.apache.commons.inject.api.bind.ILinkedBindingBuilder; +import org.apache.commons.inject.api.bind.IModule; +import org.apache.commons.inject.api.bind.IBinder.IInjectionListener; +import org.apache.commons.inject.api.bind.IBinder.IInjectionParticipator; +import org.apache.commons.inject.api.bind.IBinder.IInjectorBuildListener; +import org.apache.commons.inject.impl.bind.DefaultBindingBuilder; + +public class DefaultInjectorBuilder implements IInjectorBuilder { + private final Collection<IModule> modules; + private final List<IInjectionListener> injectionListeners = new ArrayList<IInjectionListener>(); + private final List<IInjectionParticipator> injectionParticipators = new ArrayList<IInjectionParticipator>(); + private final List<IInjectorBuildListener> injectorBuildListeners = new ArrayList<IInjectorBuildListener>(); + + public DefaultInjectorBuilder(Collection<IModule> pModules) { + modules = pModules; + } + + public DefaultInjectorBuilder() { + modules = new ArrayList<IModule>(); + } + + public IInjector build() { + final MutableBindingSet mutableBindings = new MutableBindingSet(); + configure(mutableBindings); + final ResolvableBindingSet resolvableBindings = new ResolvableBindingSet(mutableBindings); + resolve(resolvableBindings); + final ImmutableBindingSet immutableBindings = new ImmutableBindingSet(resolvableBindings); + final DefaultInjector injector = new DefaultInjector(immutableBindings); + for (IBinding<?> binding : immutableBindings.getAllBindings()) { + if (binding instanceof IInjectorAware) { + ((IInjectorAware) binding).init(injector); + } else { + throw new IllegalStateException("No InjectorAware: " + binding); + } + } + for (IInjectorBuildListener listener : injectorBuildListeners) { + listener.created(injector); + } + return injector; + } + + protected void resolve(ResolvableBindingSet pBindings) { + pBindings.resolve(); + } + + protected void configure(final MutableBindingSet mutableBindings) { + final List<DefaultBindingBuilder<?>> builders = new ArrayList<DefaultBindingBuilder<?>>(); + final IBinder binder = newBinder(builders); + for (IModule module : modules) { + module.configure(binder); + } + for (DefaultBindingBuilder<?> builder : builders) { + builder.build(mutableBindings, injectionListeners, injectionParticipators); + } + } + + private IBinder newBinder(final List<DefaultBindingBuilder<?>> builders) { + return new IBinder(){ + @Override + public <T> IAnnotatedBindingBuilder<T> bind(Class<T> pType) { + final DefaultBindingBuilder<T> builder = new DefaultBindingBuilder<T>(pType); + builders.add(builder); + return builder; + } + + @Override + public <T> IAnnotatedBindingBuilder<T> bind(Class<T> pType, + String pName) { + final DefaultBindingBuilder<T> builder = new DefaultBindingBuilder<T>(pType, pName); + builders.add(builder); + return builder; + } + + @Override + public <T> ILinkedBindingBuilder<T> bind(IKey<T> pKey) { + final DefaultBindingBuilder<T> builder = new DefaultBindingBuilder<T>(pKey); + builders.add(builder); + return builder; + } + + @Override + public boolean add(IInjectionParticipator pParticipator) { + if (pParticipator == null) { + throw new NullPointerException("The participator must not be null."); + } + return injectionParticipators.add(pParticipator); + } + + @Override + public boolean add(IInjectionListener pListener) { + if (pListener == null) { + throw new NullPointerException("The listener must not be null."); + } + return injectionListeners.add(pListener); + } + + @Override + public boolean add(IInjectorBuildListener pListener) { + if (pListener == null) { + throw new NullPointerException("The listener must not be null."); + } + return injectorBuildListeners.add(pListener); + } + }; + } + + @Override + public IInjectorBuilder modules(IModule... pModules) { + if (pModules == null) { + throw new NullPointerException("The module list must not be null."); + } + modules.addAll(Arrays.asList(pModules)); + return this; + } + + @Override + public IInjectorBuilder modules(Collection<IModule> pModules) { + if (pModules == null) { + throw new NullPointerException("The module list must not be null."); + } + modules.addAll(pModules); + return this; + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultInjectorBuilder.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultLifecycleController.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultLifecycleController.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultLifecycleController.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultLifecycleController.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,82 @@ +package org.apache.commons.inject.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.inject.api.ILifecycleController; +import org.apache.commons.inject.api.ILifecycleListener; +import org.apache.commons.inject.util.Exceptions; + +public class DefaultLifecycleController implements ILifecycleController { + private static enum State { + NOT_STARTED, + STARTED, + TERMINATED + } + private State state = State.NOT_STARTED; + private List<ILifecycleListener> listeners = new ArrayList<ILifecycleListener>(); + + @Override + public void start() { + if (state == State.NOT_STARTED) { + for (ILifecycleListener listener : listeners) { + try { + listener.start(); + } catch (Throwable t) { + throw Exceptions.show(t); + } + } + state = State.STARTED; + } + } + + @Override + public void shutdown() { + if (state == State.STARTED) { + Throwable th = null; + // Shutdown in reverse order. + for (int i = listeners.size()-1; i >= 0; i--) { + final ILifecycleListener listener = listeners.get(i); + try { + listener.shutdown(); + listeners.remove(i); + } catch (Throwable t) { + if (th == null) { + th = t; + } + } + if (th != null) { + throw Exceptions.show(th); + } + } + state = State.TERMINATED; + } + } + + @Override + public boolean add(ILifecycleListener pListener) { + if (state == State.STARTED) { + try { + pListener.start(); + } catch (Throwable t) { + throw Exceptions.show(t); + } + } + return listeners.add(pListener); + } + + @Override + public boolean remove(ILifecycleListener pListener) { + boolean result = listeners.remove(pListener); + if (state == State.STARTED) { + try { + pListener.shutdown(); + } catch (Throwable t) { + throw Exceptions.show(t); + } + } + return result; + + } + +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultLifecycleController.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultProvider.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultProvider.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultProvider.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultProvider.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,19 @@ +package org.apache.commons.inject.impl; + +import org.apache.commons.inject.api.IPoint; +import org.apache.commons.inject.util.Exceptions; + +public class DefaultProvider<T> extends AbstractBaseProvider<T> { + public DefaultProvider(Class<T> pType, IPoint<T> pPoint) { + super(pType, pPoint); + } + + @Override + public T get() { + try { + return getType().newInstance(); + } catch (Throwable t) { + throw Exceptions.show(t); + } + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/DefaultProvider.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FactoryMethodProvider.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FactoryMethodProvider.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FactoryMethodProvider.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FactoryMethodProvider.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,62 @@ +package org.apache.commons.inject.impl; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +import org.apache.commons.inject.api.IBinding; +import org.apache.commons.inject.api.IInjector; +import org.apache.commons.inject.api.IPoint; +import org.apache.commons.inject.util.Exceptions; + +public class FactoryMethodProvider<T> extends AbstractBaseProvider<T> implements IInjectorAware { + private final Constructor<T> constructor; + private final Method method; + private final IBinding<Object>[] parameterBindings; + + public FactoryMethodProvider(Constructor<T> pConstructor, IPoint<T> pPoint, IBinding<Object>[] pBindings) { + super(pConstructor.getDeclaringClass(), pPoint); + constructor = pConstructor; + method = null; + parameterBindings = pBindings; + } + + @SuppressWarnings("unchecked") + public FactoryMethodProvider(Method pMethod, IBinding<Object>[] pBindings, IPoint<T> pPoint) { + super((Class<T>) pMethod.getReturnType(), pPoint); + constructor = null; + method = pMethod; + parameterBindings = pBindings; + + } + + @Override + public T get() { + try { + final Object[] parameters = new Object[parameterBindings.length]; + for (int i = 0; i < parameters.length; i++) { + parameters[i] = parameterBindings[i].getProvider().get(); + } + if (constructor == null) { + @SuppressWarnings("unchecked") + final T instance = (T) method.invoke(null, parameters); + return instance; + } else { + if (!constructor.isAccessible()) { + constructor.setAccessible(true); + } + return constructor.newInstance(parameters); + } + } catch (Throwable t) { + throw Exceptions.show(t); + } + } + + @Override + public void init(IInjector pInjector) { + for (IBinding<Object> binding : parameterBindings) { + if (binding instanceof IInjectorAware) { + ((IInjectorAware) binding).init(pInjector); + } + } + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FactoryMethodProvider.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FieldPoint.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FieldPoint.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FieldPoint.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FieldPoint.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,30 @@ +package org.apache.commons.inject.impl; + +import java.lang.reflect.Field; + +import org.apache.commons.inject.api.IBinding; +import org.apache.commons.inject.api.IInjector; +import org.apache.commons.inject.api.IPoint; +import org.apache.commons.inject.util.Exceptions; + +public class FieldPoint<T> implements IPoint<T> { + private final IBinding<Object> binding; + private final Field f; + + FieldPoint(IBinding<Object> pBinding, Field pF) { + binding = pBinding; + f = pF; + } + + @Override + public void injectTo(T pInstance, IInjector pInjector) { + try { + if (!f.isAccessible()) { + f.setAccessible(true); + } + f.set(pInstance, binding.getProvider().get()); + } catch (Throwable t) { + throw Exceptions.show(t); + } + } +} \ No newline at end of file Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/FieldPoint.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IInjectorAware.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IInjectorAware.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IInjectorAware.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IInjectorAware.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,7 @@ +package org.apache.commons.inject.impl; + +import org.apache.commons.inject.api.IInjector; + +public interface IInjectorAware { + void init(IInjector pInjector); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IInjectorAware.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IMutableBindingSource.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IMutableBindingSource.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IMutableBindingSource.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IMutableBindingSource.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,8 @@ +package org.apache.commons.inject.impl; + +import org.apache.commons.inject.api.IBinding; +import org.apache.commons.inject.api.IKey; + +public interface IMutableBindingSource { + <T> IBinding<T> requireBinding(IKey<T> pKey, String pCause); +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/IMutableBindingSource.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/ImmutableBindingSet.java URL: http://svn.apache.org/viewvc/commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/ImmutableBindingSet.java?rev=1636573&view=auto ============================================================================== --- commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/ImmutableBindingSet.java (added) +++ commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/ImmutableBindingSet.java Tue Nov 4 13:05:37 2014 @@ -0,0 +1,46 @@ +package org.apache.commons.inject.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.commons.inject.api.IBinding; +import org.apache.commons.inject.api.IKey; + +public class ImmutableBindingSet extends AbstractBindingSet { + public ImmutableBindingSet(ResolvableBindingSet pResolvableBindings) { + super(pResolvableBindings.map); + } + + <T> IBinding<T> getBinding(IKey<T> pKey) { + final ReducedKey<T> rkey = new ReducedKey<T>(pKey.getType(), pKey.getName()); + final List<BindingAndKey<?>> list = map.get(rkey); + if (list != null) { + for (BindingAndKey<?> bak : list) { + if (isMatching(pKey, bak.getKey())) { + @SuppressWarnings("unchecked") + final IBinding<T> binding = (IBinding<T>) bak.getBinding(); + return binding; + } + } + } + return null; + } + + <T> void add(ReducedKey<T> pRKey, MappedKey<T> pMKey, IBinding<T> pBinding) { + final List<BindingAndKey<?>> list = findOrCreateList(pRKey); + final BindingAndKey<T> bak = new BindingAndKey<T>(pBinding, pMKey); + list.add(bak); + } + + Iterable<IBinding<?>> getAllBindings() { + final List<IBinding<?>> list = new ArrayList<IBinding<?>>(); + for (Map.Entry<ReducedKey<?>,List<BindingAndKey<?>>> en : map.entrySet()) { + final List<BindingAndKey<?>> baklist = en.getValue(); + for (BindingAndKey<?> bak : baklist) { + list.add(bak.getBinding()); + } + } + return list; + } +} Propchange: commons/sandbox/commons-inject/trunk/src/main/java/org/apache/commons/inject/impl/ImmutableBindingSet.java ------------------------------------------------------------------------------ svn:mime-type = text/plain