You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by jo...@apache.org on 2014/11/04 14:05:38 UTC

svn commit: r1636573 [1/2] - in /commons/sandbox/commons-inject/trunk: ./ .settings/ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/commons/ src/main/java/org/apache/commons/inject/ src/main/java/org...

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