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


Reply via email to