You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2017/02/16 00:14:17 UTC
svn commit: r1783164 - in /myfaces/core/branches/2.3.x:
api/src/main/java/javax/faces/application/
api/src/main/java/javax/faces/component/ api/src/main/java/javax/faces/model/
impl/src/main/java/org/apache/myfaces/cdi/model/
impl/src/main/java/org/apa...
Author: lu4242
Date: Thu Feb 16 00:14:17 2017
New Revision: 1783164
URL: http://svn.apache.org/viewvc?rev=1783164&view=rev
Log:
MYFACES-4079 Implement CDI changes for JSF 2.3 ( @FacesDataModel )
Added:
myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/model/FacesDataModel.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelBuilder.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelBuilderProxy.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelInfo.java
- copied, changed from r1782426, myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/BehaviorInfo.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DynamicDataModelProducer.java
- copied, changed from r1782426, myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/DynamicBehaviorProducer.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelAnnotationLiteral.java
- copied, changed from r1782426, myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/FacesBehaviorAnnotationLiteral.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelClassBeanHolder.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelExtension.java
- copied, changed from r1782426, myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/FacesBehaviorExtension.java
Modified:
myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/application/ApplicationWrapper.java
myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/UIData.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/ee6/MyFacesContainerInitializer.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java
myfaces/core/branches/2.3.x/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
Modified: myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/application/ApplicationWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/application/ApplicationWrapper.java?rev=1783164&r1=1783163&r2=1783164&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/application/ApplicationWrapper.java (original)
+++ myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/application/ApplicationWrapper.java Thu Feb 16 00:14:17 2017
@@ -33,6 +33,8 @@ import javax.faces.FacesException;
import javax.faces.FacesWrapper;
import javax.faces.component.UIComponent;
import javax.faces.component.behavior.Behavior;
+import javax.faces.component.search.SearchExpressionHandler;
+import javax.faces.component.search.SearchKeywordResolver;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.el.MethodBinding;
@@ -462,4 +464,28 @@ public abstract class ApplicationWrapper
return getWrapped().getFlowHandler();
}
+ @Override
+ public void setSearchExpressionHandler(SearchExpressionHandler searchExpressionHandler)
+ {
+ getWrapped().setSearchExpressionHandler(searchExpressionHandler);
+ }
+
+ @Override
+ public SearchExpressionHandler getSearchExpressionHandler()
+ {
+ return getWrapped().getSearchExpressionHandler();
+ }
+
+ @Override
+ public SearchKeywordResolver getSearchKeywordResolver()
+ {
+ return getWrapped().getSearchKeywordResolver();
+ }
+
+ @Override
+ public void addSearchKeywordResolver(SearchKeywordResolver resolver)
+ {
+ getWrapped().addSearchKeywordResolver(resolver);
+ }
+
}
Modified: myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/UIData.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/UIData.java?rev=1783164&r1=1783163&r2=1783164&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/UIData.java (original)
+++ myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/component/UIData.java Thu Feb 16 00:14:17 2017
@@ -20,6 +20,8 @@ package javax.faces.component;
import java.io.IOException;
import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
@@ -121,6 +123,31 @@ public class UIData extends UIComponentB
public static final String COMPONENT_FAMILY = "javax.faces.Data";
public static final String COMPONENT_TYPE = "javax.faces.Data"; // for unit tests
+ private static final String DATAMODEL_BUILDER_CLASS_NAME = "org.apache.myfaces.cdi.model.DataModelBuilderProxy";
+ private static final Class<?> DATAMODEL_BUILDER_CLASS;
+ private static final Method DATAMODEL_BUILDER_CREATE_DATAMODEL_METHOD;
+
+ static
+ {
+ Class<?> dataModelBuilderClass = null;
+ Method createDataModelMethod = null;
+ try
+ {
+ dataModelBuilderClass = _ClassUtils.classForName(DATAMODEL_BUILDER_CLASS_NAME);
+ if (dataModelBuilderClass != null)
+ {
+ createDataModelMethod = dataModelBuilderClass.getMethod("createDataModel",
+ new Class[]{FacesContext.class, Class.class, Object.class});
+ }
+ }
+ catch(Exception e)
+ {
+ //No Op
+ }
+ DATAMODEL_BUILDER_CLASS = dataModelBuilderClass;
+ DATAMODEL_BUILDER_CREATE_DATAMODEL_METHOD = createDataModelMethod;
+ }
+
private static final String FOOTER_FACET_NAME = "footer";
private static final String HEADER_FACET_NAME = "header";
private static final Class<Object[]> OBJECT_ARRAY_CLASS = Object[].class;
@@ -2084,29 +2111,65 @@ public class UIData extends UIComponentB
{
return (DataModel) value;
}
- else if (value instanceof List)
- {
- return new ListDataModel((List<?>) value);
- }
- else if (OBJECT_ARRAY_CLASS.isAssignableFrom(value.getClass()))
- {
- return new ArrayDataModel((Object[]) value);
- }
- else if (value instanceof ResultSet)
- {
- return new ResultSetDataModel((ResultSet) value);
- }
- else if (value instanceof Result)
- {
- return new ResultDataModel((Result) value);
- }
- else if (value instanceof Collection)
- {
- return new CollectionDataModel((Collection) value);
- }
else
{
- return new ScalarDataModel(value);
+ DataModel dataModel = null;
+ if (DATAMODEL_BUILDER_CLASS != null && value != null)
+ {
+ try
+ {
+ Object dataModelBuilderProxy = DATAMODEL_BUILDER_CLASS.newInstance();
+ dataModel = (DataModel) DATAMODEL_BUILDER_CREATE_DATAMODEL_METHOD.invoke(dataModelBuilderProxy,
+ getFacesContext(), value.getClass(), value);
+ }
+ catch (InstantiationException ex)
+ {
+ //No op
+ }
+ catch (IllegalAccessException ex)
+ {
+ //No op
+ }
+ catch (IllegalArgumentException ex)
+ {
+ //No op
+ }
+ catch (InvocationTargetException ex)
+ {
+ //No op
+ }
+ }
+ if (dataModel == null)
+ {
+ if (value instanceof List)
+ {
+ return new ListDataModel((List<?>) value);
+ }
+ else if (OBJECT_ARRAY_CLASS.isAssignableFrom(value.getClass()))
+ {
+ return new ArrayDataModel((Object[]) value);
+ }
+ else if (value instanceof ResultSet)
+ {
+ return new ResultSetDataModel((ResultSet) value);
+ }
+ else if (value instanceof Result)
+ {
+ return new ResultDataModel((Result) value);
+ }
+ else if (value instanceof Collection)
+ {
+ return new CollectionDataModel((Collection) value);
+ }
+ else
+ {
+ return new ScalarDataModel(value);
+ }
+ }
+ else
+ {
+ return dataModel;
+ }
}
}
Added: myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/model/FacesDataModel.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/model/FacesDataModel.java?rev=1783164&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/model/FacesDataModel.java (added)
+++ myfaces/core/branches/2.3.x/api/src/main/java/javax/faces/model/FacesDataModel.java Thu Feb 16 00:14:17 2017
@@ -0,0 +1,39 @@
+/*
+ * 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 javax.faces.model;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.inject.Qualifier;
+
+/**
+ *
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+@Qualifier
+public @interface FacesDataModel
+{
+ public java.lang.Class<?> forClass() default Object.class;
+}
Added: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelBuilder.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelBuilder.java?rev=1783164&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelBuilder.java (added)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelBuilder.java Thu Feb 16 00:14:17 2017
@@ -0,0 +1,33 @@
+/*
+ * 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.cdi.model;
+
+import javax.faces.context.FacesContext;
+import javax.faces.model.DataModel;
+
+/**
+ *
+ */
+public abstract class DataModelBuilder
+{
+
+ public abstract DataModel createDataModel(FacesContext facesContext, Class<?> forClass, Object value);
+
+}
Added: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelBuilderProxy.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelBuilderProxy.java?rev=1783164&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelBuilderProxy.java (added)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelBuilderProxy.java Thu Feb 16 00:14:17 2017
@@ -0,0 +1,42 @@
+/*
+ * 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.cdi.model;
+
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.CDI;
+import javax.faces.context.FacesContext;
+import javax.faces.model.DataModel;
+import org.apache.myfaces.cdi.util.CDIUtils;
+
+/**
+ *
+ */
+public class DataModelBuilderProxy extends DataModelBuilder
+{
+
+ @Override
+ public DataModel createDataModel(FacesContext facesContext, Class<?> forClass, Object value)
+ {
+ BeanManager beanManager = CDI.current().getBeanManager();
+ FacesDataModelClassBeanHolder holder = CDIUtils.lookup(beanManager, FacesDataModelClassBeanHolder.class);
+ return holder.createDataModel(facesContext, forClass, value);
+ }
+
+}
Copied: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelInfo.java (from r1782426, myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/BehaviorInfo.java)
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelInfo.java?p2=myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelInfo.java&p1=myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/BehaviorInfo.java&r1=1782426&r2=1783164&rev=1783164&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/BehaviorInfo.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DataModelInfo.java Thu Feb 16 00:14:17 2017
@@ -17,7 +17,7 @@
* under the License.
*/
-package org.apache.myfaces.cdi.behavior;
+package org.apache.myfaces.cdi.model;
import java.io.Serializable;
import java.lang.reflect.Type;
@@ -26,32 +26,26 @@ import java.util.Objects;
/**
*
*/
-public class BehaviorInfo implements Serializable
+public class DataModelInfo implements Serializable
{
private Type type;
- private String behaviorId;
+ private Class<?> forClass;
- public BehaviorInfo(Type type, String behaviorId)
+ public DataModelInfo(Type type, Class<?> forClass)
{
this.type = type;
- this.behaviorId = behaviorId;
+ this.forClass = forClass;
}
- /**
- * @return the behaviorId
- */
- public String getBehaviorId()
+ public Class<?> getForClass()
{
- return behaviorId;
+ return forClass;
}
- /**
- * @param behaviorId the behaviorId to set
- */
- public void setBehaviorId(String behaviorId)
+ public void setForClass(Class<?> forClass)
{
- this.behaviorId = behaviorId;
+ this.forClass = forClass;
}
public Type getType()
@@ -67,9 +61,9 @@ public class BehaviorInfo implements Ser
@Override
public int hashCode()
{
- int hash = 7;
- hash = 53 * hash + Objects.hashCode(this.type);
- hash = 53 * hash + Objects.hashCode(this.behaviorId);
+ int hash = 3;
+ hash = 67 * hash + Objects.hashCode(this.type);
+ hash = 67 * hash + Objects.hashCode(this.forClass);
return hash;
}
@@ -84,17 +78,16 @@ public class BehaviorInfo implements Ser
{
return false;
}
- final BehaviorInfo other = (BehaviorInfo) obj;
+ final DataModelInfo other = (DataModelInfo) obj;
if (!Objects.equals(this.type, other.type))
{
return false;
}
- if (!Objects.equals(this.behaviorId, other.behaviorId))
+ if (!Objects.equals(this.forClass, other.forClass))
{
return false;
}
return true;
}
-
}
Copied: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DynamicDataModelProducer.java (from r1782426, myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/DynamicBehaviorProducer.java)
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DynamicDataModelProducer.java?p2=myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DynamicDataModelProducer.java&p1=myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/DynamicBehaviorProducer.java&r1=1782426&r2=1783164&rev=1783164&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/DynamicBehaviorProducer.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/DynamicDataModelProducer.java Thu Feb 16 00:14:17 2017
@@ -17,7 +17,7 @@
* under the License.
*/
-package org.apache.myfaces.cdi.behavior;
+package org.apache.myfaces.cdi.model;
import java.io.Serializable;
import java.lang.annotation.Annotation;
@@ -25,9 +25,8 @@ import java.lang.reflect.Type;
import static java.util.Arrays.asList;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import javax.enterprise.context.Dependent;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.Typed;
@@ -35,24 +34,25 @@ import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.PassivationCapable;
-import javax.faces.FacesException;
-import javax.faces.component.behavior.Behavior;
+import javax.faces.model.DataModel;
+import org.apache.myfaces.cdi.util.CDIUtils;
import org.apache.myfaces.shared.util.ClassUtils;
/**
*
*/
@Typed
-public class DynamicBehaviorProducer implements Bean<Behavior>, Serializable, PassivationCapable
+public class DynamicDataModelProducer implements
+ Bean< Map<Class<?>,Class<? extends DataModel>> >, Serializable, PassivationCapable
{
private static final long serialVersionUID = 1L;
private BeanManager beanManager;
- private BehaviorInfo typeInfo;
+ private DataModelInfo typeInfo;
private Set<Type> types;
private Class<?> beanClass;
- public DynamicBehaviorProducer(BeanManager beanManager, BehaviorInfo typeInfo)
+ public DynamicDataModelProducer(BeanManager beanManager, DataModelInfo typeInfo)
{
this.beanManager = beanManager;
this.typeInfo = typeInfo;
@@ -63,14 +63,13 @@ public class DynamicBehaviorProducer imp
@Override
public String getId()
{
- String converterId = typeInfo.getBehaviorId() == null ? "" : typeInfo.getBehaviorId();
- return ""+typeInfo.getType()+"_"+converterId;
+ return ""+typeInfo.getForClass();
}
@Override
public Class<?> getBeanClass()
{
- return beanClass;
+ return Map.class;
}
@Override
@@ -83,8 +82,7 @@ public class DynamicBehaviorProducer imp
public Set<Annotation> getQualifiers()
{
return Collections.singleton(
- (Annotation) new FacesBehaviorAnnotationLiteral(
- typeInfo.getBehaviorId() == null ? "" : typeInfo.getBehaviorId(), true));
+ (Annotation) new FacesDataModelAnnotationLiteral(typeInfo.getForClass()));
}
@Override
@@ -125,26 +123,16 @@ public class DynamicBehaviorProducer imp
}
@Override
- public Behavior create(CreationalContext<Behavior> cc)
+ public Map<Class<?>,Class<? extends DataModel>> create(
+ CreationalContext<Map<Class<?>,Class<? extends DataModel>>> cc)
{
- Class<? extends Behavior> converterClass = (Class<? extends Behavior>) beanClass;
- Behavior converter = null;
- try
- {
- converter = converterClass.newInstance();
- }
- catch (Exception ex)
- {
- Logger.getLogger(DynamicBehaviorProducer.class.getName()).log(
- Level.SEVERE, "Could not instantiate converter " + beanClass.getName().toString(), ex);
- throw new FacesException("Could not instantiate converter: " + beanClass.getName().toString(), ex);
-
- }
- return converter;
+ FacesDataModelClassBeanHolder holder = CDIUtils.lookup(beanManager, FacesDataModelClassBeanHolder.class);
+ return holder.getClassInstanceToDataModelWrapperClassMap();
}
@Override
- public void destroy(Behavior t, CreationalContext<Behavior> cc)
+ public void destroy(Map<Class<?>,Class<? extends DataModel>> t,
+ CreationalContext<Map<Class<?>,Class<? extends DataModel>>> cc)
{
}
}
Copied: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelAnnotationLiteral.java (from r1782426, myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/FacesBehaviorAnnotationLiteral.java)
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelAnnotationLiteral.java?p2=myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelAnnotationLiteral.java&p1=myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/FacesBehaviorAnnotationLiteral.java&r1=1782426&r2=1783164&rev=1783164&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/FacesBehaviorAnnotationLiteral.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelAnnotationLiteral.java Thu Feb 16 00:14:17 2017
@@ -16,46 +16,36 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.myfaces.cdi.behavior;
+package org.apache.myfaces.cdi.model;
import java.util.Objects;
import javax.enterprise.util.AnnotationLiteral;
-import javax.faces.component.behavior.FacesBehavior;
+import javax.faces.model.FacesDataModel;
/**
*
*/
-public class FacesBehaviorAnnotationLiteral extends AnnotationLiteral<FacesBehavior> implements FacesBehavior
+public class FacesDataModelAnnotationLiteral extends AnnotationLiteral<FacesDataModel> implements FacesDataModel
{
private static final long serialVersionUID = 1L;
- private String value;
- private boolean managed;
+ private Class<?> forClass;
- public FacesBehaviorAnnotationLiteral(String value, boolean managed)
+ public FacesDataModelAnnotationLiteral(Class<?> forClass)
{
- this.value = value;
- this.managed = managed;
+ this.forClass=forClass;
}
- @Override
- public String value()
- {
- return value;
- }
-
- @Override
- public boolean managed()
+ public Class<?> forClass()
{
- return managed;
+ return forClass;
}
@Override
public int hashCode()
{
int hash = 5;
- hash = 79 * hash + Objects.hashCode(this.value);
- hash = 79 * hash + (this.managed ? 1 : 0);
+ hash = 89 * hash + Objects.hashCode(this.forClass);
return hash;
}
@@ -70,16 +60,13 @@ public class FacesBehaviorAnnotationLite
{
return false;
}
- final FacesBehaviorAnnotationLiteral other = (FacesBehaviorAnnotationLiteral) obj;
- if (!Objects.equals(this.value, other.value))
- {
- return false;
- }
- if (this.managed != other.managed)
+ final FacesDataModel other = (FacesDataModel) obj;
+ if (!Objects.equals(this.forClass(), other.forClass()))
{
return false;
}
return true;
}
+
}
Added: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelClassBeanHolder.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelClassBeanHolder.java?rev=1783164&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelClassBeanHolder.java (added)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelClassBeanHolder.java Thu Feb 16 00:14:17 2017
@@ -0,0 +1,142 @@
+/*
+ * 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.cdi.model;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import javax.enterprise.context.ApplicationScoped;
+import javax.faces.FacesException;
+import javax.faces.context.FacesContext;
+import javax.faces.model.DataModel;
+
+/**
+ *
+ */
+@ApplicationScoped
+public class FacesDataModelClassBeanHolder extends DataModelBuilder
+{
+ private volatile Map<Class<?>,Class<? extends DataModel>>
+ classInstanceToDataModelWrapperClassMap = new ConcurrentHashMap<Class<?>, Class<? extends DataModel>>();
+ private Map<Class<?>,Class<? extends DataModel>> umclassInstanceToDataModelWrapperClassMap = null;
+
+ /**
+ * @return the classInstanceToDataModelWrapperClassMap
+ */
+ public Map<Class<?>,Class<? extends DataModel>> getClassInstanceToDataModelWrapperClassMap()
+ {
+ if (umclassInstanceToDataModelWrapperClassMap == null)
+ {
+ umclassInstanceToDataModelWrapperClassMap =
+ Collections.unmodifiableMap(classInstanceToDataModelWrapperClassMap);
+ }
+ return umclassInstanceToDataModelWrapperClassMap;
+ }
+
+ public void addFacesDataModel(Class<?> forClass, Class<? extends DataModel> dataModelClass)
+ {
+ classInstanceToDataModelWrapperClassMap.put(forClass, dataModelClass);
+ }
+
+ @Override
+ public DataModel createDataModel(FacesContext facesContext, Class<?> forClass, Object value)
+ {
+ Class<? extends DataModel> dataModelClass = getClassInstanceToDataModelWrapperClassMap().get(forClass);
+ if (dataModelClass != null)
+ {
+ return createDataModel(forClass, value, dataModelClass);
+ }
+ else
+ {
+ // Iterate over map and try to find a valid match if any.
+ Class<?> entryForClass = null;
+ Class<? extends DataModel> valueForClass = null;
+ for (Map.Entry<Class<?>,Class<? extends DataModel>> entry :
+ getClassInstanceToDataModelWrapperClassMap().entrySet())
+ {
+ if (entry.getKey().isAssignableFrom(forClass))
+ {
+ if (entryForClass != null)
+ {
+ // Both models work, but we need to prefer the one
+ // that is closest to in the hierarchy.
+ if (entryForClass.isAssignableFrom(entry.getKey()))
+ {
+ entryForClass = entry.getKey();
+ valueForClass = entry.getValue();
+ }
+ }
+ else
+ {
+ entryForClass = entry.getKey();
+ valueForClass = entry.getValue();
+ }
+ }
+ }
+ if(entryForClass != null)
+ {
+ return createDataModel(forClass, value, valueForClass);
+ }
+ }
+ return null;
+ }
+
+ private DataModel createDataModel(Class<?> forClass, Object value,
+ Class<? extends DataModel> dataModelClass)
+ {
+ try
+ {
+ Constructor constructor = dataModelClass.getConstructor(forClass);
+ return (DataModel) constructor.newInstance(value);
+ }
+ catch (NoSuchMethodException ex)
+ {
+ throw new FacesException(
+ "Cannot find constructor of DataModel with "+forClass.getName()+" as parameter", ex);
+ }
+ catch (SecurityException ex)
+ {
+ throw new FacesException(
+ "Cannot access constructor of DataModel with "+forClass.getName()+" as parameter", ex);
+ }
+ catch (InstantiationException ex)
+ {
+ throw new FacesException(
+ "Cannot access constructor of DataModel with "+forClass.getName()+" as parameter", ex);
+ }
+ catch (IllegalAccessException ex)
+ {
+ throw new FacesException(
+ "Cannot access constructor of DataModel with "+forClass.getName()+" as parameter", ex);
+ }
+ catch (IllegalArgumentException ex)
+ {
+ throw new FacesException(
+ "Cannot find constructor of DataModel with "+forClass.getName()+" as parameter", ex);
+ }
+ catch (InvocationTargetException ex)
+ {
+ throw new FacesException(
+ "Cannot find constructor of DataModel with "+forClass.getName()+" as parameter", ex);
+ }
+ }
+}
Copied: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelExtension.java (from r1782426, myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/FacesBehaviorExtension.java)
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelExtension.java?p2=myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelExtension.java&p1=myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/FacesBehaviorExtension.java&r1=1782426&r2=1783164&rev=1783164&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/behavior/FacesBehaviorExtension.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/model/FacesDataModelExtension.java Thu Feb 16 00:14:17 2017
@@ -17,53 +17,76 @@
* under the License.
*/
-package org.apache.myfaces.cdi.behavior;
+package org.apache.myfaces.cdi.model;
import java.lang.reflect.Type;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
+import javax.enterprise.inject.spi.AfterDeploymentValidation;
import javax.enterprise.inject.spi.Annotated;
+import javax.enterprise.inject.spi.AnnotatedType;
import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ProcessManagedBean;
-import javax.faces.component.behavior.FacesBehavior;
+import javax.faces.model.DataModel;
+import javax.faces.model.FacesDataModel;
+import org.apache.myfaces.cdi.util.CDIUtils;
+import org.apache.myfaces.shared.util.ClassUtils;
/**
*
*/
-public class FacesBehaviorExtension implements Extension
+public class FacesDataModelExtension implements Extension
{
- private Set<BehaviorInfo> types = new HashSet<BehaviorInfo>();
+ private Set<DataModelInfo> types = new HashSet<DataModelInfo>();
+
+ void beforeBeanDiscovery(
+ @Observes final BeforeBeanDiscovery event, BeanManager beanManager)
+ {
+ AnnotatedType beanHolder = beanManager.createAnnotatedType(FacesDataModelClassBeanHolder.class);
+ event.addAnnotatedType(beanHolder);
+ }
public <T> void collect(@Observes ProcessManagedBean<T> event)
{
- if (event.getAnnotatedBeanClass().isAnnotationPresent(FacesBehavior.class))
+ if (event.getAnnotatedBeanClass().isAnnotationPresent(FacesDataModel.class))
{
Annotated annotated = event.getAnnotatedBeanClass();
Type type = annotated.getBaseType();
- FacesBehavior conv = (FacesBehavior) annotated.getAnnotation(FacesBehavior.class);
+ FacesDataModel conv = (FacesDataModel) annotated.getAnnotation(FacesDataModel.class);
- if (conv.managed())
+ boolean hasValue = conv.forClass() != null;
+ if (hasValue)
{
- boolean hasValue = conv.value().length() > 0;
- if (hasValue)
- {
- types.add(new BehaviorInfo(type, conv.value()));
- }
+ types.add(new DataModelInfo(type, conv.forClass()));
}
}
}
public void afterBean(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager)
{
- for (BehaviorInfo typeInfo : types)
+ for (DataModelInfo typeInfo : types)
+ {
+ afterBeanDiscovery.addBean(new DynamicDataModelProducer(beanManager, typeInfo));
+ }
+ }
+
+ public void afterDeploymentValidation(@Observes AfterDeploymentValidation adv, BeanManager beanManager)
+ {
+ FacesDataModelClassBeanHolder holder = CDIUtils.lookup(beanManager, FacesDataModelClassBeanHolder.class);
+ for (DataModelInfo typeInfo : types)
{
- afterBeanDiscovery.addBean(new DynamicBehaviorProducer(beanManager, typeInfo));
+ holder.addFacesDataModel(typeInfo.getForClass(),
+ ClassUtils.simpleClassForName(typeInfo.getType().getTypeName()));
}
+ // Initialize unmodifiable wrapper
+ Map<Class<?>,Class<? extends DataModel>> map = holder.getClassInstanceToDataModelWrapperClassMap();
}
}
Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/ee6/MyFacesContainerInitializer.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/ee6/MyFacesContainerInitializer.java?rev=1783164&r1=1783163&r2=1783164&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/ee6/MyFacesContainerInitializer.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/ee6/MyFacesContainerInitializer.java Thu Feb 16 00:14:17 2017
@@ -47,6 +47,7 @@ import javax.faces.convert.FacesConverte
import javax.faces.event.ListenerFor;
import javax.faces.event.ListenersFor;
import javax.faces.event.NamedEvent;
+import javax.faces.model.FacesDataModel;
import javax.faces.render.FacesBehaviorRenderer;
import javax.faces.render.FacesRenderer;
import javax.faces.render.Renderer;
@@ -86,6 +87,7 @@ import org.apache.myfaces.spi.FacesConfi
FacesConverter.class,
FacesRenderer.class,
FacesValidator.class,
+ FacesDataModel.class,
ListenerFor.class,
ListenersFor.class,
ManagedBean.class,
Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java?rev=1783164&r1=1783163&r2=1783164&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/view/facelets/component/UIRepeat.java Thu Feb 16 00:14:17 2017
@@ -56,6 +56,8 @@ import javax.faces.render.Renderer;
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFComponent;
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty;
+import org.apache.myfaces.cdi.model.DataModelBuilderProxy;
+import org.apache.myfaces.util.ExternalSpecifications;
/**
*
@@ -204,25 +206,41 @@ public class UIRepeat extends UIComponen
{
return (DataModel) value;
}
- else if (value instanceof List)
- {
- return new ListDataModel((List<?>) value);
- }
- else if (OBJECT_ARRAY_CLASS.isAssignableFrom(value.getClass()))
- {
- return new ArrayDataModel((Object[]) value);
- }
- else if (value instanceof ResultSet)
- {
- return new ResultSetDataModel((ResultSet) value);
- }
- else if (value instanceof Collection)
- {
- return new CollectionDataModel((Collection) value);
- }
else
{
- return new ScalarDataModel(value);
+ DataModel dataModel = null;
+ if (ExternalSpecifications.isCDIAvailable(getFacesContext().getExternalContext()))
+ {
+ dataModel = (new DataModelBuilderProxy()).createDataModel(
+ getFacesContext(), value.getClass(), value);
+ }
+ if (dataModel == null)
+ {
+ if (value instanceof List)
+ {
+ return new ListDataModel((List<?>) value);
+ }
+ else if (OBJECT_ARRAY_CLASS.isAssignableFrom(value.getClass()))
+ {
+ return new ArrayDataModel((Object[]) value);
+ }
+ else if (value instanceof ResultSet)
+ {
+ return new ResultSetDataModel((ResultSet) value);
+ }
+ else if (value instanceof Collection)
+ {
+ return new CollectionDataModel((Collection) value);
+ }
+ else
+ {
+ return new ScalarDataModel(value);
+ }
+ }
+ else
+ {
+ return dataModel;
+ }
}
}
Modified: myfaces/core/branches/2.3.x/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension?rev=1783164&r1=1783163&r2=1783164&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension Thu Feb 16 00:14:17 2017
@@ -11,3 +11,4 @@ org.apache.myfaces.cdi.bean.ManagedPrope
org.apache.myfaces.cdi.converter.FacesConverterExtension
org.apache.myfaces.cdi.validator.FacesValidatorExtension
org.apache.myfaces.cdi.behavior.FacesBehaviorExtension
+org.apache.myfaces.cdi.model.FacesDataModelExtension
\ No newline at end of file