You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by mf...@apache.org on 2011/08/15 19:47:19 UTC

svn commit: r1157924 - in /incubator/rave/trunk/rave-shindig/src: main/java/org/apache/rave/inject/ main/java/org/apache/rave/opensocial/model/ test/java/org/apache/rave/inject/

Author: mfranklin
Date: Mon Aug 15 17:47:19 2011
New Revision: 1157924

URL: http://svn.apache.org/viewvc?rev=1157924&view=rev
Log:
Fixed error when registering the same interface twice with Guice.

Added:
    incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/inject/SpringContextProvider.java
Modified:
    incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/inject/SpringBindingModule.java
    incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/opensocial/model/Person.java
    incubator/rave/trunk/rave-shindig/src/test/java/org/apache/rave/inject/SpringBindingModuleTest.java

Modified: incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/inject/SpringBindingModule.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/inject/SpringBindingModule.java?rev=1157924&r1=1157923&r2=1157924&view=diff
==============================================================================
--- incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/inject/SpringBindingModule.java (original)
+++ incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/inject/SpringBindingModule.java Mon Aug 15 17:47:19 2011
@@ -29,6 +29,10 @@ import org.springframework.stereotype.Co
 
 import javax.annotation.PostConstruct;
 import java.lang.reflect.Proxy;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 import java.util.regex.Pattern;
 
 /**
@@ -41,9 +45,11 @@ public class SpringBindingModule extends
 
     private ApplicationContext applicationContext;
     private String basePackage;
+    private Set<Class<?>> mappedClasses;
 
     @Override
     protected void configure() {
+        mappedClasses = new HashSet<Class<?>>();
         bindFromApplicationContext();
     }
 
@@ -59,12 +65,13 @@ public class SpringBindingModule extends
         String fullClassName = Proxy.isProxyClass(bean.getClass()) ? bean.toString() : bean.getClass().getName();
         if (fullClassName.matches(basePackage + ".*")) {
             for (final Class clazz : bean.getClass().getInterfaces()) {
-                bind(clazz).toProvider(new Provider() {
-                    @Override
-                    public Object get() {
-                        return applicationContext.getBean(clazz);
-                    }
-                });
+                //Check to see if we have already bound a provider for this interface.  If we have,
+                //then don't attempt to bind it again as the provider will pull from the application context by type
+                //and any multi-bean errors will be handled at injection time
+                if(!mappedClasses.contains(clazz)) {
+                    bind(clazz).toProvider(new SpringContextProvider(clazz, applicationContext));
+                    mappedClasses.add(clazz);
+                }
             }
         }
     }
@@ -82,4 +89,6 @@ public class SpringBindingModule extends
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         this.applicationContext = applicationContext;
     }
+
+
 }

Added: incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/inject/SpringContextProvider.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/inject/SpringContextProvider.java?rev=1157924&view=auto
==============================================================================
--- incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/inject/SpringContextProvider.java (added)
+++ incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/inject/SpringContextProvider.java Mon Aug 15 17:47:19 2011
@@ -0,0 +1,43 @@
+/*
+ * 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.rave.inject;
+
+import com.google.inject.Provider;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * Provides beans for injection by Guice that are managed by Spring
+ * @param <T> the type of the bean to pull
+ */
+public class SpringContextProvider<T> implements Provider<T> {
+
+    private final Class<T> clazz;
+    private final ApplicationContext context;
+
+    public SpringContextProvider(Class<T> clazz, ApplicationContext context) {
+        this.clazz = clazz;
+        this.context = context;
+    }
+
+    @Override
+    public T get() {
+        return context.getBean(clazz);
+    }
+}

Modified: incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/opensocial/model/Person.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/opensocial/model/Person.java?rev=1157924&r1=1157923&r2=1157924&view=diff
==============================================================================
--- incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/opensocial/model/Person.java (original)
+++ incubator/rave/trunk/rave-shindig/src/main/java/org/apache/rave/opensocial/model/Person.java Mon Aug 15 17:47:19 2011
@@ -20,6 +20,7 @@ package org.apache.rave.opensocial.model
 
 import org.apache.rave.persistence.BasicEntity;
 
+import javax.annotation.Generated;
 import javax.persistence.*;
 import java.util.*;
 
@@ -554,6 +555,7 @@ public class Person implements BasicEnti
     }
 
     @Override
+    @Generated("IDE Generated Method")
     public int hashCode() {
         int result = id != null ? id.hashCode() : 0;
         result = 31 * result + (username != null ? username.hashCode() : 0);
@@ -600,6 +602,7 @@ public class Person implements BasicEnti
     }
 
     @Override
+    @Generated("IDE Generated Method")
     public boolean equals(Object o) {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;

Modified: incubator/rave/trunk/rave-shindig/src/test/java/org/apache/rave/inject/SpringBindingModuleTest.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-shindig/src/test/java/org/apache/rave/inject/SpringBindingModuleTest.java?rev=1157924&r1=1157923&r2=1157924&view=diff
==============================================================================
--- incubator/rave/trunk/rave-shindig/src/test/java/org/apache/rave/inject/SpringBindingModuleTest.java (original)
+++ incubator/rave/trunk/rave-shindig/src/test/java/org/apache/rave/inject/SpringBindingModuleTest.java Mon Aug 15 17:47:19 2011
@@ -21,13 +21,18 @@ package org.apache.rave.inject;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
+import org.apache.rave.opensocial.model.Organization;
 import org.apache.rave.opensocial.service.impl.DefaultPersonService;
+import org.apache.rave.persistence.BasicEntity;
+import org.apache.rave.persistence.jpa.AbstractJpaRepository;
 import org.apache.shindig.social.opensocial.spi.PersonService;
+import org.hamcrest.CoreMatchers;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.orm.jpa.LocalEntityManagerFactoryBean;
+import org.springframework.stereotype.Repository;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@@ -67,4 +72,20 @@ public class SpringBindingModuleTest {
         LocalEntityManagerFactoryBean factory = injector.getInstance(LocalEntityManagerFactoryBean.class);
         assertThat(factory, is(not(nullValue())));
     }
+
+    @Test
+    public void multipleRepositories() {
+        TestRepo repo = injector.getInstance(TestRepo.class);
+        assertThat(repo, is(not(nullValue())));
+    }
+
+    public static interface TestRepo extends org.apache.rave.persistence.Repository<BasicEntity> {}
+
+    @Repository
+    public static class JpaTestRepo extends AbstractJpaRepository<BasicEntity> implements TestRepo {
+
+        protected JpaTestRepo() {
+            super(BasicEntity.class);
+        }
+    }
 }