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