Author: andygumbrecht
Date: Tue Sep 23 12:51:46 2014
New Revision: 1626990

URL: http://svn.apache.org/r1626990
Log:
TOMEE-1359 - Returns a better resolution if found multiple times. Works for 
known failing tests in tribestream
This is for review - Test case in TomEE to follow.

Modified:
    
tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEInjectionEnricher.java

Modified: 
tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEInjectionEnricher.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEInjectionEnricher.java?rev=1626990&r1=1626989&r2=1626990&view=diff
==============================================================================
--- 
tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEInjectionEnricher.java
 (original)
+++ 
tomee/tomee/branches/tomee-1.7.x/arquillian/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEInjectionEnricher.java
 Tue Sep 23 12:51:46 2014
@@ -28,6 +28,10 @@ import org.jboss.arquillian.test.spi.Tes
 import org.jboss.arquillian.test.spi.TestEnricher;
 
 import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -46,13 +50,90 @@ public class TomEEInjectionEnricher impl
 
     private AppContext getAppContext(final String className) {
         final ContainerSystem containerSystem = 
SystemInstance.get().getComponent(ContainerSystem.class);
-        for (final AppContext app : containerSystem.getAppContexts()) {
+        final List<AppContext> appContexts = containerSystem.getAppContexts();
+
+        final int size = appContexts.size();
+        if (size == 1) {
+            return appContexts.get(0);
+        }
+
+        final List<AppContext> found = new ArrayList<AppContext>(size);
+
+        for (final AppContext app : appContexts) {
             final BeanContext context = 
containerSystem.getBeanContext(app.getId() + "_" + className);
             if (context != null) {
-                return app;
+                found.add(app);
             }
         }
 
+        if (found.size() > 0) {
+
+            Collections.sort(found, new Comparator<AppContext>() {
+
+                /**
+                 * If multiple apps are found that contain the test class then 
a best guess effort needs to be made
+                 * to find the context that best matches the test class 
application.
+                 *
+                 * @param ac1 AppContext
+                 * @param ac2 AppContext
+                 * @return int
+                 */
+                @Override
+                public int compare(final AppContext ac1, final AppContext ac2) 
{
+                    int c = 0;
+
+                    if (isBeanManagerInUse(ac1) && !isBeanManagerInUse(ac2)) {
+                        c--;
+                    } else if (!isBeanManagerInUse(ac1) && 
isBeanManagerInUse(ac2)) {
+                        c++;
+                    }
+
+                    if (ac1.isCdiEnabled() && !ac2.isCdiEnabled()) {
+                        c--;
+                    } else if (!ac1.isCdiEnabled() && ac2.isCdiEnabled()) {
+                        c++;
+                    }
+
+                    int size1 = ac1.getBeanContexts().size();
+                    int size2 = ac2.getBeanContexts().size();
+                    if (size1 > size2) {
+                        c--;
+                    } else if (size2 > size1) {
+                        c++;
+                    }
+
+                    size1 = ac1.getBindings().size();
+                    size2 = ac2.getBindings().size();
+                    if (size1 > size2) {
+                        c--;
+                    } else if (size2 > size1) {
+                        c++;
+                    }
+
+                    size1 = ac1.getWebContexts().size();
+                    size2 = ac2.getWebContexts().size();
+                    if (size1 > size2) {
+                        c--;
+                    } else if (size2 > size1) {
+                        c++;
+                    }
+
+                    return c;
+                }
+
+                private boolean isBeanManagerInUse(final AppContext ac) {
+                    try {
+                        return 
ac.getWebBeansContext().getBeanManagerImpl().isInUse();
+                    } catch (final Exception e) {
+                        return false;
+                    }
+                }
+            });
+
+            //Return the most likely candidate
+            return found.get(0);
+        }
+
         
Logger.getLogger(TomEEInjectionEnricher.class.getName()).log(Level.WARNING, 
"Failed to find AppContext for: " + className);
 
         return null;


Reply via email to