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