You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@onami.apache.org by da...@apache.org on 2012/12/07 01:11:37 UTC

svn commit: r1418140 [6/8] - in /incubator/onami/trunk/autobind: aop/src/main/java/org/apache/ aop/src/main/java/org/nnsoft/ aop/src/test/java/org/apache/ aop/src/test/java/org/apache/onami/ aop/src/test/java/org/nnsoft/ configuration/src/main/java/org...

Added: incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/features/WebServletBindingFeature.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/features/WebServletBindingFeature.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/features/WebServletBindingFeature.java (added)
+++ incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/features/WebServletBindingFeature.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,80 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.enterprise.features;
+
+import java.lang.annotation.Annotation;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.inject.Singleton;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+
+import org.apache.onami.autobind.install.BindingStage;
+import org.apache.onami.autobind.scanner.features.BindingScannerFeature;
+
+import com.google.inject.servlet.ServletModule;
+
+
+@Singleton
+public class WebServletBindingFeature extends BindingScannerFeature {
+	private static Logger LOGGER = Logger.getLogger(WebServletBindingFeature.class.getName());
+	
+	@Override
+	public BindingStage accept(Class<Object> annotatedClass, Map<String, Annotation> annotations) {
+		if (annotations.containsKey(WebServlet.class.getName())) {
+			return BindingStage.BINDING;
+		}
+		return BindingStage.IGNORE;
+	}
+
+	@Override
+	public void process(final Class<Object> annotatedClass,
+			final Map<String, Annotation> annotations) {
+		final WebServlet annotation = (WebServlet) annotations.get(WebServlet.class.getName());
+		
+		String[] patterns = annotation.value();
+		final String value;
+		final String[] values;
+		if(patterns.length > 0){
+			final PropertiesResolver resolver = new PropertiesResolver(patterns[0]);
+			resolver.setInjector(injector);
+			value = resolver.get();
+			if(patterns.length > 1){
+				values = new String[patterns.length-1];
+				
+				for(int i=1;i<patterns.length;i++){
+					final PropertiesResolver patternResolver = new PropertiesResolver(patterns[i]);
+					patternResolver.setInjector(injector);
+					values[i-1] = patternResolver.get();
+				}				
+			}else{
+				values = null;
+			}
+		}else{
+			// failure
+			LOGGER.info("Ignoring Servlet \""+annotatedClass+"\", because no Values for URLs were specified.");
+			return;
+		}
+
+		_binder.install(new ServletModule(){
+			@Override
+			protected void configureServlets() {
+				serve(value).with(annotatedClass.asSubclass(HttpServlet.class));
+			}
+		});
+	}
+}

Propchange: incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/
------------------------------------------------------------------------------
    bugtraq:number = true

Added: incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Alternatives.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Alternatives.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Alternatives.java (added)
+++ incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Alternatives.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,37 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.enterprise.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+
+
+@XmlAccessorType(XmlAccessType.FIELD)
+public class Alternatives {
+    @XmlElement(name = "class", namespace = "http://java.sun.com/xml/ns/javaee")
+    protected List<String> classes;
+
+    public List<String> getClasses() {
+        if (classes == null) {
+        	classes = new ArrayList<String>();
+        }
+        return this.classes;
+    }
+}

Added: incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Beans.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Beans.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Beans.java (added)
+++ incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Beans.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,66 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.enterprise.model;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlRootElement(name = "beans", namespace = "http://java.sun.com/xml/ns/javaee")
+public class Beans {
+	@XmlElement(name="interceptors", namespace = "http://java.sun.com/xml/ns/javaee")
+    protected Interceptors interceptors;
+    @XmlElement(name="decorators", namespace = "http://java.sun.com/xml/ns/javaee")
+    protected Decorators decorators;
+    @XmlElement(name="alternatives", namespace = "http://java.sun.com/xml/ns/javaee")
+    protected Alternatives alternatives;
+
+    public Interceptors getInterceptors() {
+    	if(interceptors == null){
+    		interceptors = new Interceptors();
+    	}
+        return interceptors;
+    }
+
+    public void setInterceptors(Interceptors value) {
+        this.interceptors = value;
+    }
+
+    public Decorators getDecorators() {
+    	if(decorators == null){
+    		decorators = new Decorators();
+    	}
+        return decorators;
+    }
+
+    public void setDecorators(Decorators value) {
+        this.decorators = value;
+    }
+
+    
+    public Alternatives getAlternatives() {
+    	if(alternatives == null){
+    		alternatives = new Alternatives();
+    	}
+        return alternatives;
+    }
+
+    public void setAlternatives(Alternatives value) {
+        this.alternatives = value;
+    }
+}

Added: incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Decorators.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Decorators.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Decorators.java (added)
+++ incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Decorators.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,38 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.enterprise.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+
+
+
+@XmlAccessorType(XmlAccessType.FIELD)
+public class Decorators {
+    @XmlElement(name = "class", namespace = "http://java.sun.com/xml/ns/javaee")
+    protected List<String> classes;
+
+    public List<String> getClasses() {
+        if (classes == null) {
+            classes = new ArrayList<String>();
+        }
+        return this.classes;
+    }
+}

Added: incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Interceptors.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Interceptors.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Interceptors.java (added)
+++ incubator/onami/trunk/autobind/integrations/enterprise/src/main/java/org/apache/onami/autobind/enterprise/model/Interceptors.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,38 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.enterprise.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+
+
+@XmlAccessorType(XmlAccessType.FIELD)
+public class Interceptors {
+    @XmlElement(name = "class", namespace = "http://java.sun.com/xml/ns/javaee")
+    protected List<String> classes;
+
+    public List<String> getClasses() {
+        if (classes == null) {
+        	classes = new ArrayList<String>();
+        }
+        return this.classes;
+    }
+
+}

Propchange: incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/tests/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/tests/enterprise/
------------------------------------------------------------------------------
    bugtraq:number = true

Added: incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/tests/enterprise/AllTests.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/tests/enterprise/AllTests.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/tests/enterprise/AllTests.java (added)
+++ incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/tests/enterprise/AllTests.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,24 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.integrations.tests.enterprise;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses( { EnterpriseTests.class })
+public class AllTests {
+}

Added: incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/tests/enterprise/EnterpriseTests.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/tests/enterprise/EnterpriseTests.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/tests/enterprise/EnterpriseTests.java (added)
+++ incubator/onami/trunk/autobind/integrations/enterprise/src/test/java/org/apache/onami/autobind/integrations/tests/enterprise/EnterpriseTests.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,146 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.integrations.tests.enterprise;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import javax.enterprise.inject.Alternative;
+
+import org.apache.onami.autobind.annotations.Bind;
+import org.apache.onami.autobind.annotations.To;
+import org.apache.onami.autobind.annotations.To.Type;
+import org.apache.onami.autobind.configuration.StartupModule;
+import org.apache.onami.autobind.enterprise.BeansXMLFeature;
+import org.apache.onami.autobind.scanner.PackageFilter;
+import org.apache.onami.autobind.scanner.asm.ASMClasspathScanner;
+import org.junit.Test;
+
+import com.google.inject.ConfigurationException;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+
+public class EnterpriseTests {
+	@Test
+	public void createDynamicModule() {
+		Injector injector = Guice.createInjector(StartupModule.create(ASMClasspathScanner.class,
+			PackageFilter.create(EnterpriseTests.class)));
+		assertNotNull(injector);
+	}
+
+	@Test
+	public void testWithWrongPackage() {
+		Injector injector = Guice.createInjector(StartupModule.create(ASMClasspathScanner.class,
+			PackageFilter.create("java", false)));
+		assertNotNull(injector);
+
+		try {
+			SecondTestInterface testInstance = injector.getInstance(SecondTestInterface.class);
+			fail("The Scanner scanned the wrong package, so no Implementation should be bound to this Interface. Instance null? "
+					+ (testInstance == null));
+		} catch (ConfigurationException e) {
+			// ok
+		}
+	}
+
+	@Test
+	public void createTestInterface() {
+		Injector injector = Guice.createInjector(StartupModule.create(ASMClasspathScanner.class,
+			PackageFilter.create(EnterpriseTests.class)));
+		assertNotNull(injector);
+
+		try {
+			TestInterface testInstance = injector.getInstance(TestInterface.class);
+			fail("Instance implements TestInterface, but was not bound to. Instance may be null? "
+					+ (testInstance == null));
+		} catch (ConfigurationException e) {
+			// ok
+		}
+	}
+
+	@Test
+	public void createSecondTestInterface() {
+		Injector injector = Guice.createInjector(StartupModule.create(ASMClasspathScanner.class,
+			PackageFilter.create(EnterpriseTests.class)));
+		assertNotNull(injector);
+
+		SecondTestInterface sameInstance = injector.getInstance(SecondTestInterface.class);
+		assertNotNull(sameInstance);
+		assertTrue(sameInstance.fireEvent().equals(TestInterfaceImplementation.EVENT));
+		assertTrue(sameInstance instanceof TestInterfaceImplementation);
+		assertTrue(sameInstance instanceof TestInterface);
+	}
+	
+	@Test
+	public void cdiTest() {
+		StartupModule startup = StartupModule.create(ASMClasspathScanner.class,
+			PackageFilter.create(EnterpriseTests.class), PackageFilter.create(BeansXMLFeature.class));
+		startup.addFeature(BeansXMLFeature.class);
+		
+		Injector injector = Guice.createInjector(startup);
+		
+		assertNotNull(injector);
+
+		SecondTestInterface sameInstance = injector.getInstance(SecondTestInterface.class);
+		assertNotNull(sameInstance);
+		assertTrue(sameInstance.fireEvent().equals(AlternativeImplementation.EVENT));
+		assertTrue(sameInstance instanceof AlternativeImplementation);
+		assertTrue(sameInstance instanceof TestInterface);
+	}
+
+	public static interface TestInterface {
+		String sayHello();
+	}
+
+	public static interface SecondTestInterface {
+		String fireEvent();
+	}
+
+	@Bind(to = @To(value=Type.CUSTOM, customs={SecondTestInterface.class}))
+	public static class TestInterfaceImplementation implements TestInterface, SecondTestInterface {
+		public static final String TEST = "test";
+		public static final String EVENT = "event";
+
+		@Override
+		public String sayHello() {
+			return TEST;
+		}
+
+		@Override
+		public String fireEvent() {
+			return EVENT;
+		}
+	}
+	
+	@Alternative
+	@Bind(to = @To(value=Type.CUSTOM, customs={SecondTestInterface.class}))
+	public static class AlternativeImplementation implements TestInterface, SecondTestInterface {
+		public static final String TEST = "alternative_test";
+		public static final String EVENT = "alternative_event";
+
+		@Override
+		public String sayHello() {
+			return TEST;
+		}
+
+		@Override
+		public String fireEvent() {
+			return EVENT;
+		}
+	}
+}

Modified: incubator/onami/trunk/autobind/integrations/enterprise/src/test/resources/META-INF/beans.xml
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/enterprise/src/test/resources/META-INF/beans.xml?rev=1418140&r1=1418139&r2=1418140&view=diff
==============================================================================
--- incubator/onami/trunk/autobind/integrations/enterprise/src/test/resources/META-INF/beans.xml (original)
+++ incubator/onami/trunk/autobind/integrations/enterprise/src/test/resources/META-INF/beans.xml Fri Dec  7 00:11:06 2012
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee beans_1_0.xsd ">
 	<alternatives>
-		<class>de.devsurf.injection.guice.integrations.tests.enterprise.EnterpriseTests$AlternativeImplementation</class>
+		<class>org.apache.onami.autobind.integrations.tests.enterprise.EnterpriseTests$AlternativeImplementation</class>
 	</alternatives>
 </beans>

Modified: incubator/onami/trunk/autobind/integrations/enterprise/src/test/resources/beans.xml
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/enterprise/src/test/resources/beans.xml?rev=1418140&r1=1418139&r2=1418140&view=diff
==============================================================================
--- incubator/onami/trunk/autobind/integrations/enterprise/src/test/resources/beans.xml (original)
+++ incubator/onami/trunk/autobind/integrations/enterprise/src/test/resources/beans.xml Fri Dec  7 00:11:06 2012
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee beans_1_0.xsd ">
 	<alternatives>
-		<class>de.devsurf.injection.guice.integrations.tests.enterprise.EnterpriseTests$AlternativeImplementation</class>
+		<class>org.apache.onami.autobind.integrations.tests.enterprise.EnterpriseTests$AlternativeImplementation</class>
 	</alternatives>
 </beans>

Propchange: incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/
------------------------------------------------------------------------------
    bugtraq:number = true

Added: incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/AutomaticGuiceManager.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/AutomaticGuiceManager.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/AutomaticGuiceManager.java (added)
+++ incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/AutomaticGuiceManager.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,67 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.integrations.metro;
+
+import javax.xml.ws.WebServiceContext;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.sun.istack.NotNull;
+import com.sun.xml.ws.api.message.Packet;
+import com.sun.xml.ws.api.server.ResourceInjector;
+import com.sun.xml.ws.api.server.WSEndpoint;
+import com.sun.xml.ws.api.server.WSWebServiceContext;
+import com.sun.xml.ws.server.AbstractMultiInstanceResolver;
+
+public class AutomaticGuiceManager<T> extends AbstractMultiInstanceResolver<T> {
+	private static Module startup;
+	protected static Injector injector;
+	protected ResourceInjector resourceInjector;
+	protected WSWebServiceContext webServiceContext;
+
+	public AutomaticGuiceManager(@NotNull final Class<T> clazz) throws IllegalAccessException,
+			InstantiationException {
+		super(clazz);
+	}
+
+	@Override
+	public T resolve(@NotNull final Packet packet) {
+		final T instance = injector.getInstance(this.clazz);
+		resourceInjector.inject(this.webServiceContext, instance);
+		return instance;
+	}
+
+	@SuppressWarnings("rawtypes")
+	@Override
+	public synchronized void start(WSWebServiceContext wsc, WSEndpoint endpoint) {
+		resourceInjector = getResourceInjector(endpoint);
+		webServiceContext = wsc;
+		if(injector == null){
+			injector = Guice.createInjector(startup, new AbstractModule() {
+				@Override
+				protected void configure() {
+					bind(WebServiceContext.class).toInstance(webServiceContext);
+				}
+			});
+		}
+	}
+	
+	public static void inject(Module startup){
+		AutomaticGuiceManager.startup = startup;
+	}
+}

Added: incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceContextListener.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceContextListener.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceContextListener.java (added)
+++ incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceContextListener.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,62 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.integrations.metro;
+
+import javax.servlet.ServletContextAttributeEvent;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import com.google.inject.Module;
+import com.sun.xml.ws.transport.http.servlet.WSServletContextListener;
+
+public abstract class GuiceContextListener implements ServletContextListener{
+	private WSServletContextListener delegate = new WSServletContextListener();
+
+	public void attributeAdded(ServletContextAttributeEvent event) {
+		delegate.attributeAdded(event);
+	}
+
+	public void attributeRemoved(ServletContextAttributeEvent event) {
+		delegate.attributeRemoved(event);
+	}
+
+	public void attributeReplaced(ServletContextAttributeEvent event) {
+		delegate.attributeReplaced(event);
+	}
+
+	public void contextDestroyed(ServletContextEvent event) {
+		delegate.contextDestroyed(event);
+	}
+
+	public void contextInitialized(ServletContextEvent event) {
+		AutomaticGuiceManager.inject(getModule());
+		delegate.contextInitialized(event);
+	}
+
+	public boolean equals(Object obj) {
+		return delegate.equals(obj);
+	}
+
+	public int hashCode() {
+		return delegate.hashCode();
+	}
+
+	public String toString() {
+		return delegate.toString();
+	}
+	
+	protected abstract Module getModule();
+}

Added: incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceManaged.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceManaged.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceManaged.java (added)
+++ incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceManaged.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,35 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.integrations.metro;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.xml.ws.spi.WebServiceFeatureAnnotation;
+
+import com.sun.xml.ws.api.server.InstanceResolverAnnotation;
+
+@Retention(RUNTIME)
+@Target(TYPE)
+@Documented
+@WebServiceFeatureAnnotation(id = GuiceManagedFeature.ID, bean = GuiceManagedFeature.class)
+@InstanceResolverAnnotation(AutomaticGuiceManager.class)
+public @interface GuiceManaged {
+}

Added: incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceManagedFeature.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceManagedFeature.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceManagedFeature.java (added)
+++ incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/GuiceManagedFeature.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,36 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.integrations.metro;
+
+import javax.xml.ws.WebServiceFeature;
+
+import com.sun.xml.ws.api.FeatureConstructor;
+
+/**
+ * @author Daniel Manzke
+ */
+public class GuiceManagedFeature extends WebServiceFeature {
+	public static final String ID = "automatic.managed.feature";
+
+	@FeatureConstructor
+	public GuiceManagedFeature() {
+		this.enabled = true;
+	}
+
+	public String getID() {
+		return ID;
+	}
+}

Added: incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/InjectorProvider.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/InjectorProvider.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/InjectorProvider.java (added)
+++ incubator/onami/trunk/autobind/integrations/metro/src/main/java/org/apache/onami/autobind/integrations/metro/InjectorProvider.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,23 @@
+/**
+ * Copyright (C) 2010 Daniel Manzke <da...@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.onami.autobind.integrations.metro;
+
+import com.google.inject.Injector;
+import com.google.inject.Provider;
+
+public interface InjectorProvider extends Provider<Injector>{
+
+}

Modified: incubator/onami/trunk/autobind/integrations/metro/src/test/resources/jndi.properties
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/metro/src/test/resources/jndi.properties?rev=1418140&r1=1418139&r2=1418140&view=diff
==============================================================================
--- incubator/onami/trunk/autobind/integrations/metro/src/test/resources/jndi.properties (original)
+++ incubator/onami/trunk/autobind/integrations/metro/src/test/resources/jndi.properties Fri Dec  7 00:11:06 2012
@@ -1,3 +1,2 @@
-java.naming.factory.initial = de.devsurf.injection.guice.integrations.guicyfruit.jndi.GuicyInitialContextFactory
-guice.classpath.scanner = de.devsurf.injection.guice.scanner.asm.ASMClasspathScanner
-guice.classpath.packages =de.devsurf.injection.guice.integrations.test.guicyfruit.jndi;de.devsurf.injection.guice.integrations.guicyfruit
\ No newline at end of file
+guice.classpath.scanner=org.apache.onami.autobind.scanner.asm.ASMClasspathScanner
+guice.classpath.packages=org.apache.onami.autobind.integrations.test
\ No newline at end of file

Modified: incubator/onami/trunk/autobind/integrations/pom.xml
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/integrations/pom.xml?rev=1418140&r1=1418139&r2=1418140&view=diff
==============================================================================
--- incubator/onami/trunk/autobind/integrations/pom.xml (original)
+++ incubator/onami/trunk/autobind/integrations/pom.xml Fri Dec  7 00:11:06 2012
@@ -32,10 +32,10 @@
   <packaging>pom</packaging>
 
   <modules>
-    <!--
-    TODO UPGRADE ROCOTO TO CURRENT VERSION
     <module>commons.configurations</module>
-    <module>enterprise</module>                -->
+    <!-- PropertiesResolver is not available anymore
+    <module>enterprise</module>
+    -->               
     <module>metro</module>
   </modules>
 

Modified: incubator/onami/trunk/autobind/scanner/asm/pom.xml
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/scanner/asm/pom.xml?rev=1418140&r1=1418139&r2=1418140&view=diff
==============================================================================
--- incubator/onami/trunk/autobind/scanner/asm/pom.xml (original)
+++ incubator/onami/trunk/autobind/scanner/asm/pom.xml Fri Dec  7 00:11:06 2012
@@ -35,6 +35,13 @@
       <artifactId>onami-autobind-core</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.onami.autobind</groupId>
+      <artifactId>onami-autobind-configuration</artifactId>
+      <version>${project.version}</version>
+      <type>jar</type>
+      <!--scope>test</scope-->
+    </dependency>
   </dependencies>
 
   <!-- build>

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/
------------------------------------------------------------------------------
    bugtraq:number = true

Added: incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/ASMClasspathScanner.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/ASMClasspathScanner.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/ASMClasspathScanner.java (added)
+++ incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/ASMClasspathScanner.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,431 @@
+package org.apache.onami.autobind.scanner.asm;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import static java.lang.Runtime.getRuntime;
+import static java.lang.String.format;
+import static java.lang.System.getProperty;
+import static java.util.Collections.synchronizedSet;
+import static java.util.concurrent.Executors.newFixedThreadPool;
+import static java.util.logging.Level.FINE;
+import static java.util.logging.Level.INFO;
+import static java.util.logging.Level.SEVERE;
+import static java.util.logging.Level.WARNING;
+import static java.util.logging.Logger.getLogger;
+import static java.util.regex.Pattern.compile;
+import static org.apache.onami.autobind.scanner.asm.AnnotationCollector.ASM_FLAGS;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.JarURLConnection;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.regex.Pattern;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.onami.autobind.scanner.ClasspathScanner;
+import org.apache.onami.autobind.scanner.PackageFilter;
+import org.apache.onami.autobind.scanner.features.ScannerFeature;
+import org.objectweb.asm.ClassReader;
+
+/**
+ * This Implementation only uses the ASM-API to read all recognized classes. It
+ * doesn't depend on any further 3rd-Party libraries.
+ */
+public class ASMClasspathScanner
+    implements ClasspathScanner
+{
+
+    private static final String LINE_SEPARATOR = getProperty( "line.separator" );
+
+    private final Logger _logger = getLogger( getClass().getName() );
+
+    @Inject
+    @Named( "classpath" )
+    private URL[] classPath;
+
+    private List<Pattern> patterns = new ArrayList<Pattern>();
+
+    private final Set<String> visited;
+
+    private final BlockingQueue<AnnotationCollector> collectors;
+
+    @Inject
+    public ASMClasspathScanner( Set<ScannerFeature> listeners, @Named( "packages" ) PackageFilter... filter )
+    {
+        int cores = getRuntime().availableProcessors();
+        this.collectors = new ArrayBlockingQueue<AnnotationCollector>( cores );
+
+        for ( int i = 0; i < cores; i++ )
+        {
+            try
+            {
+                collectors.put( new AnnotationCollector() );
+            }
+            catch ( InterruptedException e )
+            {
+                // ignore
+            }
+        }
+        for ( PackageFilter p : filter )
+        {
+            includePackage( p );
+        }
+
+        for ( ScannerFeature listener : listeners )
+        {
+            addFeature( listener );
+        }
+        visited = synchronizedSet( new HashSet<String>() );
+    }
+
+    @Override
+    public void addFeature( ScannerFeature feature )
+    {
+        for ( AnnotationCollector collector : collectors )
+        {
+            collector.addScannerFeature( feature );
+        }
+    }
+
+    @Override
+    public void removeFeature( ScannerFeature feature )
+    {
+        for ( AnnotationCollector collector : collectors )
+        {
+            collector.addScannerFeature( feature );
+        }
+    }
+
+    @Override
+    public List<ScannerFeature> getFeatures()
+    {
+        List<ScannerFeature> features;
+        try
+        {
+            AnnotationCollector collector = collectors.take();
+            features = collector.getScannerFeatures();
+            collectors.put( collector );
+        }
+        catch ( InterruptedException e )
+        {
+            // ignore
+            features = Collections.emptyList();
+        }
+        return features;
+    }
+
+    @Override
+    public void includePackage( final PackageFilter filter )
+    {
+        String packageName = filter.getPackage();
+        String pattern = ".*" + packageName.replace( ".", "/" );
+
+        if ( filter.deep() )
+        {
+            pattern = pattern + "/(?:\\w|/)*([A-Z](?:\\w|\\$)+)\\.class$";
+        }
+        else
+        {
+            pattern = pattern + "/([A-Z](?:\\w|\\$)+)\\.class$";
+        }
+
+        if ( _logger.isLoggable( FINE ) )
+        {
+            _logger.fine( format( "Including Package for scanning: %s generating Pattern: %s", packageName,  pattern ) );
+        }
+        patterns.add( compile( pattern ) );
+    }
+
+    @Override
+    public void excludePackage( final PackageFilter filter )
+    {
+        // TODO Could use Predicate of Google
+    }
+
+    public void scan()
+        throws IOException
+    {
+        ExecutorService pool = newFixedThreadPool( getRuntime().availableProcessors() );
+
+        if ( _logger.isLoggable( INFO ) )
+        {
+            StringBuilder builder = new StringBuilder();
+            builder.append( "Using Root-Path for Classpath scanning:" ).append( LINE_SEPARATOR );
+            for ( URL url : classPath )
+            {
+                builder.append( url.toString() ).append( LINE_SEPARATOR );
+            }
+            _logger.log( INFO, builder.toString() );
+        }
+
+        List<Future<?>> futures = new ArrayList<Future<?>>();
+        for ( final URL url : classPath )
+        {
+            Future<?> task = pool.submit( new Runnable()
+            {
+                @Override
+                public void run()
+                {
+                    try
+                    {
+                        if ( url.toString().startsWith( "jar:" ) )
+                        {
+                            visitJar( url );
+                            return;
+                        }
+                        URI uri;
+                        File entry;
+                        try
+                        {
+                            uri = url.toURI();
+                            entry = new File( uri );
+                            if ( !entry.exists() )
+                            {
+                                if ( _logger.isLoggable( FINE ) )
+                                {
+                                    _logger.log( FINE, format( "Skipping Entry %s, because it doesn't exists.", entry ) );
+                                }
+                                return;
+                            }
+                        }
+                        catch ( URISyntaxException e )
+                        {
+                            // ignore
+                            _logger.log( WARNING, format( "Using invalid URL for Classpath Scanning: %s", url ), e );
+                            return;
+                        }
+                        catch ( Throwable e )
+                        {
+                            // ignore
+                            _logger.log( SEVERE, format( "Using invalid URL for Classpath Scanning: ", url ), e );
+                            return;
+                        }
+
+                        if ( entry.isDirectory() )
+                        {
+                            visitFolder( entry );
+                        }
+                        else
+                        {
+                            String path = uri.toString();
+                            if ( matches( path ) )
+                            {
+                                if ( !visited.contains( entry.getAbsolutePath() ) )
+                                {
+                                    visitClass( new FileInputStream( entry ) );
+                                    visited.add( entry.getAbsolutePath() );
+                                }
+                            }
+                            else if ( path.endsWith( ".jar" ) )
+                            {
+                                visitJar( entry );
+                            }
+                        }
+                    }
+                    catch ( FileNotFoundException e )
+                    {
+                        if ( _logger.isLoggable( FINE ) )
+                        {
+                            _logger.log( FINE, format( "Skipping Entry %s, because it doesn't exists.", url ), e );
+                        }
+                    }
+                    catch ( IOException e )
+                    {
+                        if ( _logger.isLoggable( FINE ) )
+                        {
+                            _logger.log( FINE, format( "Skipping Entry %s, because it couldn't be scanned.", url ),  e );
+                        }
+                    }
+                    catch ( Throwable e )
+                    {
+                        _logger.log( WARNING, format( "Skipping Entry %s, because it couldn't be scanned.", url ),  e );
+                    }
+                }
+            } );
+            futures.add( task );
+        }
+        for ( Future<?> future : futures )
+        {
+            try
+            {
+                future.get();
+            }
+            catch ( InterruptedException e )
+            {
+                throw new RuntimeException( e );
+            }
+            catch ( ExecutionException e )
+            {
+                _logger.log( SEVERE, e.getMessage(), e );
+            }
+        }
+        pool.shutdown();
+        destroy();
+    }
+
+    public void destroy()
+    {
+        classPath = null;
+        collectors.clear();
+        patterns.clear();
+        patterns = null;
+        visited.clear();
+    }
+
+    private void visitFolder( File folder )
+        throws IOException
+    {
+        if ( _logger.isLoggable( FINE ) )
+        {
+            _logger.log( FINE, format( "Scanning Folder: %s...", folder.getAbsolutePath() ) );
+        }
+
+        File[] files = folder.listFiles();
+        for ( File file : files )
+        {
+            if ( file.isDirectory() )
+            {
+                visitFolder( file );
+            }
+            else
+            {
+                String path = file.toURI().toString();
+                if ( matches( path ) )
+                {
+                    if ( !visited.contains( file.getAbsolutePath() ) )
+                    {
+                        visitClass( new FileInputStream( file ) );
+                        visited.add( file.getAbsolutePath() );
+                    }
+                }
+                else if ( path.endsWith( ".jar" ) )
+                {
+                    visitJar( file );
+                }
+            }
+        }
+    }
+
+    private void visitJar( URL url )
+        throws IOException
+    {
+        if ( _logger.isLoggable( FINE ) )
+        {
+            _logger.log( FINE, format( "Scanning JAR-File: %s", url ) );
+        }
+
+        JarURLConnection conn = (JarURLConnection) url.openConnection();
+        _visitJar( conn.getJarFile() );
+    }
+
+    private void visitJar( File file )
+        throws IOException
+    {
+        if ( _logger.isLoggable( FINE ) )
+        {
+            _logger.log( FINE, format( "Scanning JAR-File: %s", file.getAbsolutePath() ) );
+        }
+
+        JarFile jarFile = new JarFile( file );
+        _visitJar( jarFile );
+    }
+
+    private void _visitJar( JarFile jarFile )
+        throws IOException
+    {
+        Enumeration<JarEntry> jarEntries = jarFile.entries();
+        for ( JarEntry jarEntry = null; jarEntries.hasMoreElements(); )
+        {
+            jarEntry = jarEntries.nextElement();
+            String name = jarEntry.getName();
+
+            if ( !jarEntry.isDirectory() && matches( name ) )
+            {
+                if ( !visited.contains( name ) )
+                {
+                    visitClass( jarFile.getInputStream( jarEntry ) );
+                    visited.add( name );
+                }
+            }
+        }
+    }
+
+    private void visitClass( InputStream in )
+        throws IOException
+    {
+        ClassReader reader = new ClassReader( new BufferedInputStream( in ) );
+        try
+        {
+            AnnotationCollector collector = collectors.take();
+            reader.accept( collector, ASM_FLAGS );
+            collectors.put( collector );
+        }
+        catch ( InterruptedException e )
+        {
+            // ignore
+        }
+    }
+
+    private boolean matches( String name )
+    {
+        boolean returned = false;
+        try
+        {
+            for ( Pattern pattern : patterns )
+            {
+                if ( pattern.matcher( name ).matches() )
+                {
+                    return ( returned = true );
+                }
+            }
+            return returned;
+        }
+        finally
+        {
+            if ( _logger.isLoggable( Level.FINE ) )
+            {
+                _logger.log( FINE, format( "%s.matches(..) - \"%s\" -> %s",
+                                           getClass().getSimpleName(), name, returned ) );
+            }
+        }
+    }
+
+}

Added: incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/AnnotationCollector.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/AnnotationCollector.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/AnnotationCollector.java (added)
+++ incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/AnnotationCollector.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,156 @@
+package org.apache.onami.autobind.scanner.asm;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import static java.util.Collections.unmodifiableList;
+import static java.util.logging.Level.WARNING;
+import static java.util.logging.Logger.getLogger;
+import static org.objectweb.asm.ClassReader.SKIP_CODE;
+import static org.objectweb.asm.ClassReader.SKIP_DEBUG;
+import static org.objectweb.asm.ClassReader.SKIP_FRAMES;
+import static org.objectweb.asm.Opcodes.ASM4;
+
+import java.lang.annotation.Annotation;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import org.apache.onami.autobind.scanner.features.ScannerFeature;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassVisitor;
+
+/**
+ * Visitor implementation to collect field annotation information from class.
+ */
+final class AnnotationCollector
+    extends ClassVisitor
+{
+
+    public static final int ASM_FLAGS = SKIP_CODE | SKIP_DEBUG | SKIP_FRAMES;
+
+    private final Logger _logger = getLogger( getClass().getName() );
+
+    private String _name;
+
+    private Class<?> _class;
+
+    private boolean _ignore;
+
+    private final Map<String, Annotation> _annotations;
+
+    private final List<ScannerFeature> _features;
+
+    public AnnotationCollector()
+    {
+        super( ASM4 );
+        _features = new LinkedList<ScannerFeature>();
+        _annotations = new HashMap<String, Annotation>();
+    }
+
+    public void addScannerFeature( ScannerFeature listener )
+    {
+        _features.add( listener );
+    }
+
+    public void removerScannerFeature( ScannerFeature listener )
+    {
+        _features.remove( listener );
+    }
+
+    public List<ScannerFeature> getScannerFeatures()
+    {
+        return unmodifiableList( _features );
+    }
+
+    public void destroy()
+    {
+        _annotations.clear();
+        _class = null;
+        _features.clear();
+    }
+
+    @Override
+    public void visit( int version, int access, String name, String signature, String superName, String[] interfaces )
+    {
+        _name = name.replace( '/', '.' );
+        for ( String interf : interfaces )
+        {
+            if ( interf.equals( "java/lang/annotation/Annotation" ) )
+            {
+                _ignore = true;
+                return;
+            }
+        }
+    }
+
+    @SuppressWarnings( "unchecked" )
+    public AnnotationVisitor visitAnnotation( String sig, boolean visible )
+    {
+        if ( _ignore )
+        {
+            return null;
+        }
+        String annotationClassStr = sig.replace( '/', '.' ).substring( 1, sig.length() - 1 );
+        if ( _class == null )
+        {
+            try
+            {
+                _class = Thread.currentThread().getContextClassLoader().loadClass( _name );
+            }
+            catch ( ClassNotFoundException e )
+            {
+                _logger.log( WARNING, "Failure while visitAnnotation. Class could not be loaded.", e );
+                return null;
+            }
+        }
+        try
+        {
+            Class<Annotation> annotationClass =
+                (Class<Annotation>) getClass().getClassLoader().loadClass( annotationClassStr );
+            Annotation annotation = _class.getAnnotation( annotationClass );
+            _annotations.put( annotationClassStr, annotation );
+        }
+        catch ( ClassNotFoundException e )
+        {
+            e.printStackTrace();
+            _logger.log( WARNING, "Failure while visitAnnotation. Class could not be loaded.", e );
+        }
+
+        return null;
+    }
+
+    @SuppressWarnings( "unchecked" )
+    @Override
+    public void visitEnd()
+    {
+        if ( !_ignore && _annotations.size() > 0 && !_annotations.containsKey( "javax.enterprise.inject.Alternative" ) )
+        {
+            for ( ScannerFeature listener : _features )
+            {
+                listener.found( (Class<Object>) _class, _annotations );
+            }
+        }
+        _name = null;
+        _class = null;
+        _ignore = false;
+        _annotations.clear();
+    }
+
+}

Added: incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/package-info.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/package-info.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/package-info.java (added)
+++ incubator/onami/trunk/autobind/scanner/asm/src/main/java/org/apache/onami/autobind/scanner/asm/package-info.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,22 @@
+/**
+ * This package includes all annotations which are used to
+ * annotating class like it would be written with the Guice ESL.
+ */
+package org.apache.onami.autobind.scanner.asm;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/
------------------------------------------------------------------------------
    bugtraq:number = true

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/
------------------------------------------------------------------------------
    bugtraq:number = true

Added: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/AllTests.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/AllTests.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/AllTests.java (added)
+++ incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/AllTests.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,46 @@
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.onami.autobind.scanner.asm.tests;
+
+import org.apache.onami.autobind.scanner.asm.tests.autobind.AutobindTests;
+import org.apache.onami.autobind.scanner.asm.tests.autobind.bind.InterfaceAutobindTests;
+import org.apache.onami.autobind.scanner.asm.tests.autobind.duplicate.DuplicateAutobindTests;
+import org.apache.onami.autobind.scanner.asm.tests.autobind.filter.PackageFilterTests;
+import org.apache.onami.autobind.scanner.asm.tests.autobind.multiple.MultibindTests;
+import org.apache.onami.autobind.scanner.asm.tests.autobind.names.NamedAutobindTests;
+import org.apache.onami.autobind.scanner.asm.tests.autobind.only.ImplementationOnlyTests;
+import org.apache.onami.autobind.scanner.asm.tests.autobind.provider.ProviderTest;
+import org.apache.onami.autobind.scanner.asm.tests.autobind.startconfig.StartConfigProviderTest;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith( Suite.class )
+@Suite.SuiteClasses( { AutobindTests.class,
+                       InterfaceAutobindTests.class,
+                       //DuplicateAutobindTests.class,
+                       NamedAutobindTests.class,
+                       MultibindTests.class,
+                       ImplementationOnlyTests.class,
+                       PackageFilterTests.class,
+                       StartConfigProviderTest.class,
+                       ProviderTest.class } )
+public class AllTests
+{
+}

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/
------------------------------------------------------------------------------
    bugtraq:number = true

Added: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/AutobindTests.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/AutobindTests.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/AutobindTests.java (added)
+++ incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/AutobindTests.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,150 @@
+package org.apache.onami.autobind.scanner.asm.tests.autobind;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.apache.onami.autobind.annotations.Bind;
+import org.apache.onami.autobind.configuration.StartupModule;
+import org.apache.onami.autobind.scanner.PackageFilter;
+import org.apache.onami.autobind.scanner.asm.ASMClasspathScanner;
+import org.junit.Test;
+
+import com.google.inject.ConfigurationException;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+public class AutobindTests
+{
+
+    @Test
+    public void createDynamicModule()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class,
+                                                        PackageFilter.create( AutobindTests.class, false ) ) );
+        assertNotNull( injector );
+    }
+
+    @Test
+    public void testWithWrongPackage()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class, PackageFilter.create( "java", false ) ) );
+        assertNotNull( injector );
+
+        TestInterface testInstance;
+        try
+        {
+            testInstance = injector.getInstance( TestInterface.class );
+            fail( "The Scanner scanned the wrong package, so no Implementation should be bound to this Interface. Instance null? "
+                + ( testInstance == null ) );
+        }
+        catch ( ConfigurationException e )
+        {
+            // ok
+        }
+    }
+
+    @Test
+    public void createTestInterface()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class,
+                                                        PackageFilter.create( AutobindTests.class, false ) ) );
+        assertNotNull( injector );
+
+        TestInterface testInstance = injector.getInstance( TestInterface.class );
+        assertNotNull( testInstance );
+        assertTrue( testInstance.sayHello().equals( TestInterfaceImplementation.TEST ) );
+        assertTrue( testInstance instanceof TestInterfaceImplementation );
+        assertTrue( testInstance instanceof SecondTestInterface );
+    }
+
+    @Test
+    public void createSecondTestInterface()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class,
+                                                        PackageFilter.create( AutobindTests.class, false ) ) );
+        assertNotNull( injector );
+
+        SecondTestInterface sameInstance = injector.getInstance( SecondTestInterface.class );
+        assertNotNull( sameInstance );
+        assertTrue( sameInstance.fireEvent().equals( TestInterfaceImplementation.EVENT ) );
+        assertTrue( sameInstance instanceof TestInterfaceImplementation );
+        assertTrue( sameInstance instanceof TestInterface );
+    }
+
+    @Test
+    public void createAllInterfaces()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class,
+                                                        PackageFilter.create( AutobindTests.class, false ) ) );
+        assertNotNull( injector );
+
+        TestInterface testInstance = injector.getInstance( TestInterface.class );
+        assertNotNull( testInstance );
+        assertTrue( testInstance.sayHello().equals( TestInterfaceImplementation.TEST ) );
+        assertTrue( testInstance instanceof TestInterfaceImplementation );
+        assertTrue( testInstance instanceof SecondTestInterface );
+
+        SecondTestInterface sameInstance = injector.getInstance( SecondTestInterface.class );
+        assertNotNull( sameInstance );
+        assertTrue( sameInstance.fireEvent().equals( TestInterfaceImplementation.EVENT ) );
+        assertTrue( sameInstance instanceof TestInterfaceImplementation );
+        assertTrue( testInstance instanceof TestInterface );
+    }
+
+    public static interface TestInterface
+    {
+        String sayHello();
+    }
+
+    public static interface SecondTestInterface
+    {
+        String fireEvent();
+    }
+
+    @Bind
+    public static class TestInterfaceImplementation
+        implements TestInterface, SecondTestInterface
+    {
+        public static final String TEST = "test";
+
+        public static final String EVENT = "event";
+
+        @Override
+        public String sayHello()
+        {
+            return TEST;
+        }
+
+        @Override
+        public String fireEvent()
+        {
+            return EVENT;
+        }
+    }
+
+}

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/bind/
------------------------------------------------------------------------------
    bugtraq:number = true

Added: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/bind/InterfaceAutobindTests.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/bind/InterfaceAutobindTests.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/bind/InterfaceAutobindTests.java (added)
+++ incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/bind/InterfaceAutobindTests.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,135 @@
+package org.apache.onami.autobind.scanner.asm.tests.autobind.bind;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.apache.onami.autobind.annotations.Bind;
+import org.apache.onami.autobind.annotations.To;
+import org.apache.onami.autobind.annotations.To.Type;
+import org.apache.onami.autobind.configuration.StartupModule;
+import org.apache.onami.autobind.scanner.PackageFilter;
+import org.apache.onami.autobind.scanner.asm.ASMClasspathScanner;
+import org.junit.Test;
+
+import com.google.inject.ConfigurationException;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+public class InterfaceAutobindTests
+{
+
+    @Test
+    public void createDynamicModule()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class,
+                                                        PackageFilter.create( InterfaceAutobindTests.class ) ) );
+        assertNotNull( injector );
+    }
+
+    @Test
+    public void testWithWrongPackage()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class, PackageFilter.create( "java", false ) ) );
+        assertNotNull( injector );
+
+        try
+        {
+            SecondTestInterface testInstance = injector.getInstance( SecondTestInterface.class );
+            fail( "The Scanner scanned the wrong package, so no Implementation should be bound to this Interface. Instance null? "
+                + ( testInstance == null ) );
+        }
+        catch ( ConfigurationException e )
+        {
+            // ok
+        }
+    }
+
+    @Test
+    public void createTestInterface()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class,
+                                                        PackageFilter.create( InterfaceAutobindTests.class ) ) );
+        assertNotNull( injector );
+
+        try
+        {
+            TestInterface testInstance = injector.getInstance( TestInterface.class );
+            fail( "Instance implements TestInterface, but was not bound to. Instance may be null? "
+                + ( testInstance == null ) );
+        }
+        catch ( ConfigurationException e )
+        {
+            // ok
+        }
+    }
+
+    @Test
+    public void createSecondTestInterface()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class,
+                                                        PackageFilter.create( InterfaceAutobindTests.class ) ) );
+        assertNotNull( injector );
+
+        SecondTestInterface sameInstance = injector.getInstance( SecondTestInterface.class );
+        assertNotNull( sameInstance );
+        assertTrue( sameInstance.fireEvent().equals( TestInterfaceImplementation.EVENT ) );
+        assertTrue( sameInstance instanceof TestInterfaceImplementation );
+        assertTrue( sameInstance instanceof TestInterface );
+    }
+
+    public static interface TestInterface
+    {
+        String sayHello();
+    }
+
+    public static interface SecondTestInterface
+    {
+        String fireEvent();
+    }
+
+    @Bind( to = @To( value = Type.CUSTOM, customs = { SecondTestInterface.class } ) )
+    public static class TestInterfaceImplementation
+        implements TestInterface, SecondTestInterface
+    {
+        public static final String TEST = "test";
+
+        public static final String EVENT = "event";
+
+        @Override
+        public String sayHello()
+        {
+            return TEST;
+        }
+
+        @Override
+        public String fireEvent()
+        {
+            return EVENT;
+        }
+    }
+
+}

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/duplicate/
------------------------------------------------------------------------------
    bugtraq:number = true

Added: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/duplicate/DuplicateAutobindTests.java
URL: http://svn.apache.org/viewvc/incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/duplicate/DuplicateAutobindTests.java?rev=1418140&view=auto
==============================================================================
--- incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/duplicate/DuplicateAutobindTests.java (added)
+++ incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/duplicate/DuplicateAutobindTests.java Fri Dec  7 00:11:06 2012
@@ -0,0 +1,155 @@
+package org.apache.onami.autobind.scanner.asm.tests.autobind.duplicate;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.apache.onami.autobind.annotations.Bind;
+import org.apache.onami.autobind.annotations.To;
+import org.apache.onami.autobind.annotations.To.Type;
+import org.apache.onami.autobind.configuration.StartupModule;
+import org.apache.onami.autobind.scanner.PackageFilter;
+import org.apache.onami.autobind.scanner.asm.ASMClasspathScanner;
+import org.junit.Test;
+
+import com.google.inject.ConfigurationException;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+public class DuplicateAutobindTests
+{
+
+    @Test
+    public void createDynamicModule()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class,
+                                                        PackageFilter.create( DuplicateAutobindTests.class ) ) );
+        assertNotNull( injector );
+    }
+
+    @Test
+    public void testWithWrongPackage()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class, PackageFilter.create( "java" ) ) );
+        assertNotNull( injector );
+
+        try
+        {
+            SecondTestInterface testInstance = injector.getInstance( SecondTestInterface.class );
+            fail( "The Scanner scanned the wrong package, so no Implementation should be bound to this Interface. Instance null? "
+                + ( testInstance == null ) );
+        }
+        catch ( ConfigurationException e )
+        {
+            // ok
+        }
+    }
+
+    @Test
+    public void createTestInterface()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class,
+                                                        PackageFilter.create( DuplicateAutobindTests.class ) ) );
+        assertNotNull( injector );
+
+        try
+        {
+            TestInterface testInstance = injector.getInstance( TestInterface.class );
+            fail( "Instance implements TestInterface, but was not bound to. Instance may be null? "
+                + ( testInstance == null ) );
+        }
+        catch ( ConfigurationException e )
+        {
+            // ok
+        }
+    }
+
+    @Test
+    public void createSecondTestInterface()
+    {
+        Injector injector =
+            Guice.createInjector( StartupModule.create( ASMClasspathScanner.class,
+                                                        PackageFilter.create( DuplicateAutobindTests.class ) ) );
+        assertNotNull( injector );
+
+        SecondTestInterface sameInstance = injector.getInstance( SecondTestInterface.class );
+        assertNotNull( sameInstance );
+        assertTrue( sameInstance.fireEvent().equals( TestInterfaceImplementation.EVENT ) );
+        assertTrue( sameInstance instanceof TestInterface );
+    }
+
+    public static interface TestInterface
+    {
+        String sayHello();
+    }
+
+    public static interface SecondTestInterface
+    {
+        String fireEvent();
+    }
+
+    @Bind( to = @To( value = Type.CUSTOM, customs = { SecondTestInterface.class } ) )
+    public static class TestInterfaceImplementation
+        implements TestInterface, SecondTestInterface
+    {
+        public static final String TEST = "test";
+
+        public static final String EVENT = "event";
+
+        @Override
+        public String sayHello()
+        {
+            return TEST;
+        }
+
+        @Override
+        public String fireEvent()
+        {
+            return EVENT;
+        }
+    }
+
+    @Bind( to = @To( value = Type.CUSTOM, customs = { SecondTestInterface.class } ) )
+    public static class SecondInterfaceImplementation
+        implements TestInterface, SecondTestInterface
+    {
+        public static final String TEST = "test";
+
+        public static final String EVENT = "event";
+
+        @Override
+        public String sayHello()
+        {
+            return TEST;
+        }
+
+        @Override
+        public String fireEvent()
+        {
+            return EVENT;
+        }
+    }
+
+}

Propchange: incubator/onami/trunk/autobind/scanner/asm/src/test/java/org/apache/onami/autobind/scanner/asm/tests/autobind/filter/
------------------------------------------------------------------------------
    bugtraq:number = true