You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2011/04/18 15:32:27 UTC

svn commit: r1094564 - in /myfaces/extensions/cdi/trunk: core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ jee-modules/jsf-module/impl/src/main/ja...

Author: gpetracek
Date: Mon Apr 18 13:32:26 2011
New Revision: 1094564

URL: http://svn.apache.org/viewvc?rev=1094564&view=rev
Log:
EXTCDI-170

Added:
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/CustomViewConfigExtractor.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/resources/
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/resources/META-INF/
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/resources/META-INF/services/
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/resources/META-INF/services/org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigExtractor
Modified:
    myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ProjectStageProducer.java
    myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ClassDeactivation.java
    myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/CodiUtils.java
    myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ConfiguredArtifactUtils.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigExtension.java

Modified: myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ProjectStageProducer.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ProjectStageProducer.java?rev=1094564&r1=1094563&r2=1094564&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ProjectStageProducer.java (original)
+++ myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ProjectStageProducer.java Mon Apr 18 13:32:26 2011
@@ -130,7 +130,8 @@ public class ProjectStageProducer implem
             return;
         }
 
-        projectStageProducer = CodiUtils.lookupFromEnvironment(ProjectStageProducer.class);
+        ProjectStageProducer defaultProjectStageProducer = new ProjectStageProducer();
+        projectStageProducer = CodiUtils.lookupFromEnvironment(ProjectStageProducer.class, defaultProjectStageProducer);
 
         if(projectStageProducer == null)
         {
@@ -144,7 +145,7 @@ public class ProjectStageProducer implem
         {
             // if we still didn't find a customised ProjectStageProducer,
             // then we take the default one.
-            projectStageProducer = new ProjectStageProducer();
+            projectStageProducer = defaultProjectStageProducer;
         }
         projectStageProducer.initProjectStage();
     }

Modified: myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ClassDeactivation.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ClassDeactivation.java?rev=1094564&r1=1094563&r2=1094564&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ClassDeactivation.java (original)
+++ myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ClassDeactivation.java Mon Apr 18 13:32:26 2011
@@ -67,7 +67,7 @@ public class ClassDeactivation
     private static ClassDeactivator getClassDeactivator()
     {
         ClassDeactivator classDeactivator =
-                CodiUtils.lookupFromEnvironment(ClassDeactivator.class, new ClassDeactivatorAggregator());
+                CodiUtils.lookupFromEnvironment(ClassDeactivator.class, new ClassDeactivatorAggregator(), null);
 
         // use default deactivator
         if (classDeactivator == null)

Modified: myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/CodiUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/CodiUtils.java?rev=1094564&r1=1094563&r2=1094564&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/CodiUtils.java (original)
+++ myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/CodiUtils.java Mon Apr 18 13:32:26 2011
@@ -462,36 +462,43 @@ public abstract class CodiUtils
     /**
      * Resolves resources outside of CDI for the given class.
      * @param targetType target type
+     * @param defaultImplementation default implementation
      * @param <T> current type
      * @return configured artifact or null if there is no result
      */
-    public static <T extends Serializable> T lookupFromEnvironment(Class<T> targetType)
+    public static <T extends Serializable> T lookupFromEnvironment(Class<T> targetType, T... defaultImplementation)
     {
-        return lookupFromEnvironment(targetType, null);
+        return lookupFromEnvironment(targetType, null, defaultImplementation);
     }
 
     /**
      * Resolves resources outside of CDI for the given class.
      * @param targetType target type which is also used as key (the simple name of it)
      * @param aggregatable allows to aggregate multiple results
+     * @param defaultImplementation default implementation
      * @param <T> current type
      * @return configured artifact or an aggregated instance if there are multiple results or null if there is no result
      */
-    public static <T extends Serializable> T lookupFromEnvironment(Class<T> targetType, Aggregatable<T> aggregatable)
+    public static <T extends Serializable> T lookupFromEnvironment(Class<T> targetType,
+                                                                   Aggregatable<T> aggregatable,
+                                                                   T... defaultImplementation)
     {
-        return lookupFromEnvironment(targetType.getSimpleName(), targetType, aggregatable);
+        return lookupFromEnvironment(targetType.getSimpleName(), targetType, aggregatable, defaultImplementation);
     }
 
     /**
      * Resolves resources outside of CDI for the given key and class.
      * @param key key for identifying the resource which has to be resolved
      * @param targetType target type
+     * @param defaultImplementation default implementation
      * @param <T> current type
      * @return configured artifact or null if there is no result
      */
-    public static <T extends Serializable> T lookupFromEnvironment(String key, Class<T> targetType)
+    public static <T extends Serializable> T lookupFromEnvironment(String key,
+                                                                   Class<T> targetType,
+                                                                   T... defaultImplementation)
     {
-        return lookupFromEnvironment(key, targetType, null);
+        return lookupFromEnvironment(key, targetType, null, defaultImplementation);
     }
 
     /**
@@ -499,18 +506,30 @@ public abstract class CodiUtils
      * @param key key for identifying the resource which has to be resolved
      * @param targetType target type
      * @param aggregatable allows to aggregate multiple results
+     * @param defaultImplementation default implementation
      * @param <T> current type
      * @return configured artifact or an aggregated instance if there are multiple results or null if there is no result
      */
     public static <T extends Serializable> T lookupFromEnvironment(String key,
                                                                    Class<T> targetType,
-                                                                   Aggregatable<T> aggregatable)
+                                                                   Aggregatable<T> aggregatable,
+                                                                   T... defaultImplementation)
     {
+        checkDefaultImplementation(defaultImplementation);
+
         List<T> results = ConfiguredArtifactUtils.getCachedArtifact(key, targetType);
 
         if(results == null)
         {
-            results = ConfiguredArtifactUtils.resolveFromEnvironment(key, targetType, aggregatable != null);
+            T defaultInstance = null;
+
+            if(defaultImplementation != null && defaultImplementation.length == 1)
+            {
+                //only one is supported
+                defaultInstance = defaultImplementation[0];
+            }
+            results = ConfiguredArtifactUtils
+                    .resolveFromEnvironment(key, targetType, aggregatable != null, defaultInstance);
 
             if(String.class.isAssignableFrom(targetType))
             {
@@ -541,6 +560,22 @@ public abstract class CodiUtils
         }
     }
 
+    private static void checkDefaultImplementation(Object[] defaultImplementation)
+    {
+        if(defaultImplementation != null && defaultImplementation.length > 1)
+        {
+            StringBuilder foundDefaultImplementations = new StringBuilder();
+
+            for(Object o : defaultImplementation)
+            {
+                foundDefaultImplementations.append(o.getClass()).append("\n");
+            }
+            throw new IllegalStateException(defaultImplementation.length + " default implementations are provided. " +
+                    "CodiUtils#lookupFromEnvironment only allows one default implementation. Found implementations: " +
+                    foundDefaultImplementations.toString());
+        }
+    }
+
     /**
      * Checks if CDI is up and running
      * @return true if CDI was bootstrapped, false otherwise

Modified: myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ConfiguredArtifactUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ConfiguredArtifactUtils.java?rev=1094564&r1=1094563&r2=1094564&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ConfiguredArtifactUtils.java (original)
+++ myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/util/ConfiguredArtifactUtils.java Mon Apr 18 13:32:26 2011
@@ -18,12 +18,14 @@
  */
 package org.apache.myfaces.extensions.cdi.core.impl.util;
 
+import org.apache.myfaces.extensions.cdi.core.api.Advanced;
 import org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils;
 import org.apache.myfaces.extensions.cdi.core.api.config.ConfiguredValueResolver;
 import org.apache.myfaces.extensions.cdi.core.api.config.ConfiguredValueDescriptor;
 import org.apache.myfaces.extensions.cdi.core.api.tools.InvocationOrderComparator;
 
 import javax.enterprise.inject.Typed;
+import java.lang.reflect.Field;
 import java.util.List;
 import java.util.ArrayList;
 import java.util.Set;
@@ -35,6 +37,8 @@ import java.util.ServiceLoader;
 import java.util.Comparator;
 import java.util.concurrent.ConcurrentHashMap;
 import java.io.Serializable;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * @author Gerhard Petracek
@@ -105,7 +109,8 @@ public abstract class ConfiguredArtifact
 
     static <T> List<T> resolveFromEnvironment(final String key,
                                               final Class<T> targetType,
-                                              boolean supportOfMultipleArtifacts)
+                                              boolean supportOfMultipleArtifacts,
+                                              T defaultImplementation)
     {
         List<T> results = new ArrayList<T>();
         List<T> resolverResult = null;
@@ -136,9 +141,40 @@ public abstract class ConfiguredArtifact
                 });
             }
 
+            Field defaultInjectionPoint;
             if(resolverResult != null && !resolverResult.isEmpty())
             {
-                results.addAll(resolverResult);
+                for(T currentResult : resolverResult)
+                {
+                    if(defaultImplementation != null && currentResult.getClass().isAnnotationPresent(Advanced.class))
+                    {
+                        defaultInjectionPoint = findInjectionPointForDefaultImplementation(currentResult, targetType);
+
+                        if(defaultInjectionPoint != null)
+                        {
+                            try
+                            {
+                                //TODO
+                                defaultInjectionPoint.setAccessible(true);
+                                defaultInjectionPoint.set(currentResult, defaultImplementation);
+                            }
+                            catch (Exception e)
+                            {
+                                Logger logger = Logger.getLogger(ConfiguredArtifactUtils.class.getName());
+
+                                if(logger.isLoggable(Level.SEVERE))
+                                {
+                                    logger.log(Level.SEVERE, currentResult.getClass().getName() + " is annotated with" +
+                                            Advanced.class.getName() + " but it wasn't possible to inject the default" +
+                                            " implementation into " + defaultInjectionPoint.getName() + "." +
+                                            " Please contact the community or remove the annotation.", e);
+
+                                }
+                            }
+                        }
+                    }
+                    results.add(currentResult);
+                }
             }
         }
 
@@ -147,6 +183,25 @@ public abstract class ConfiguredArtifact
         return results;
     }
 
+    private static <T> Field findInjectionPointForDefaultImplementation(T instance, Class<T> targetType)
+    {
+        Class currentParamClass = instance.getClass();
+        while (currentParamClass != null && !Object.class.getName().equals(currentParamClass.getName()))
+        {
+            for(Field currentField : currentParamClass.getDeclaredFields())
+            {
+                if(currentField.getName().endsWith("default" + targetType.getSimpleName()) &&
+                        targetType.isAssignableFrom(currentField.getType()))
+                {
+                    return currentField;
+                }
+            }
+            currentParamClass = currentParamClass.getSuperclass();
+        }
+
+        return null;
+    }
+
     private static List<ConfiguredValueResolver> getConfiguredValueResolvers()
     {
         ServiceLoader<ConfiguredValueResolver> configuredValueResolvers =

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigExtension.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigExtension.java?rev=1094564&r1=1094563&r2=1094564&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigExtension.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigExtension.java Mon Apr 18 13:32:26 2011
@@ -268,11 +268,13 @@ public class ViewConfigExtension impleme
 
     private ViewConfigExtractor getViewConfigExtractor()
     {
-        ViewConfigExtractor viewConfigExtractor = CodiUtils.lookupFromEnvironment(ViewConfigExtractor.class);
+        ViewConfigExtractor defaultViewConfigExtractor = new DefaultViewConfigExtractor();
+        ViewConfigExtractor viewConfigExtractor =
+                CodiUtils.lookupFromEnvironment(ViewConfigExtractor.class, defaultViewConfigExtractor);
 
         if(viewConfigExtractor == null)
         {
-            viewConfigExtractor = new DefaultViewConfigExtractor();
+            viewConfigExtractor = defaultViewConfigExtractor;
         }
         return viewConfigExtractor;
     }

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/CustomViewConfigExtractor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/CustomViewConfigExtractor.java?rev=1094564&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/CustomViewConfigExtractor.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/java/org/apache/myfaces/extensions/cdi/jsf/test/impl/config/view/CustomViewConfigExtractor.java Mon Apr 18 13:32:26 2011
@@ -0,0 +1,48 @@
+/*
+ * 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.myfaces.extensions.cdi.jsf.test.impl.config.view;
+
+import org.apache.myfaces.extensions.cdi.core.api.Advanced;
+import org.apache.myfaces.extensions.cdi.core.api.config.view.ViewConfig;
+import org.apache.myfaces.extensions.cdi.jsf.api.config.view.ViewConfigDescriptor;
+import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigExtractor;
+
+/**
+ * @author Gerhard Petracek
+ */
+@Advanced
+public class CustomViewConfigExtractor implements ViewConfigExtractor
+{
+    private ViewConfigExtractor defaultViewConfigExtractor;
+
+    public ViewConfigDescriptor extractViewConfig(Class<? extends ViewConfig> viewDefinitionClass)
+    {
+        return defaultViewConfigExtractor.extractViewConfig(viewDefinitionClass);
+    }
+
+    public boolean isInlineViewConfig(Class<? extends ViewConfig> viewDefinitionClass)
+    {
+        return defaultViewConfigExtractor.isInlineViewConfig(viewDefinitionClass);
+    }
+
+    public ViewConfigDescriptor extractInlineViewConfig(Class<? extends ViewConfig> viewDefinitionClass)
+    {
+        return defaultViewConfigExtractor.extractInlineViewConfig(viewDefinitionClass);
+    }
+}

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/resources/META-INF/services/org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigExtractor
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/resources/META-INF/services/org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigExtractor?rev=1094564&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/resources/META-INF/services/org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigExtractor (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/test/resources/META-INF/services/org.apache.myfaces.extensions.cdi.jsf.impl.config.view.spi.ViewConfigExtractor Mon Apr 18 13:32:26 2011
@@ -0,0 +1,20 @@
+#####################################################################################
+# 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.
+#####################################################################################
+
+org.apache.myfaces.extensions.cdi.jsf.test.impl.config.view.CustomViewConfigExtractor
\ No newline at end of file