You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by im...@apache.org on 2007/11/07 15:55:23 UTC

svn commit: r592769 - in /myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm: annot/ui/ component/dynaForm/ guiBuilder/ metadata/ metadata/impl/ejb/

Author: imario
Date: Wed Nov  7 06:55:22 2007
New Revision: 592769

URL: http://svn.apache.org/viewvc?rev=592769&view=rev
Log:
Introduce the concept of "component handler" which will allow you to call a special component-handler to create the JSF tree.
The whole dynaForm GuiBuilders might be refactored to use this framework ...

Added:
    myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/annot/ui/ComponentHandler.java
      - copied, changed from r592723, myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/annot/ui/UIComponent.java
    myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/DynaFormComponentHandler.java   (with props)
Modified:
    myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/component/dynaForm/DynaForm.java
    myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/Slipstream.java
    myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/FieldInterface.java
    myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/MetaData.java
    myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/impl/ejb/EjbExtractor.java

Copied: myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/annot/ui/ComponentHandler.java (from r592723, myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/annot/ui/UIComponent.java)
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/annot/ui/ComponentHandler.java?p2=myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/annot/ui/ComponentHandler.java&p1=myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/annot/ui/UIComponent.java&r1=592723&r2=592769&rev=592769&view=diff
==============================================================================
--- myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/annot/ui/UIComponent.java (original)
+++ myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/annot/ui/ComponentHandler.java Wed Nov  7 06:55:22 2007
@@ -18,19 +18,20 @@
  */
 package org.apache.myfaces.orchestra.dynaForm.annot.ui;
 
-import org.apache.myfaces.orchestra.dynaForm.guiBuilder.ComponentEnum;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * render the n:1 as select box
+ * set a component handler for the annotated property
  */
 @Target(value = {ElementType.METHOD, ElementType.FIELD})
 @Retention(value = RetentionPolicy.RUNTIME)
-public @interface UIComponent
+public @interface ComponentHandler
 {
-	ComponentEnum type() default ComponentEnum.OutputText;
-}
+	/**
+	 * The bean name which implements the DynaFormComponentHandler interface
+	 */
+	public String value();
+}
\ No newline at end of file

Modified: myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/component/dynaForm/DynaForm.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/component/dynaForm/DynaForm.java?rev=592769&r1=592768&r2=592769&view=diff
==============================================================================
--- myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/component/dynaForm/DynaForm.java (original)
+++ myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/component/dynaForm/DynaForm.java Wed Nov  7 06:55:22 2007
@@ -55,10 +55,10 @@
  * <ul>
  * <li>uri: {@link #setUri(String)}
  * <li>valueBindingPrefix: {@link #setValueBindingPrefix(String)}
- * <li>displayOnly: {@link #setDisplayOnly(String)}
+ * <li>displayOnly: {@link #setDisplayOnly(boolean)}
  * <li>bundle: {@link #setBundle(String)}
  * <li>exclusiveFields: {@link #setUri(String)}
- * <li>idAsDisplayOnly: {@link #setIdAsDisplayOnly(String)}
+ * <li>idAsDisplayOnly: {@link #setIdAsDisplayOnly(boolean)}
  * </ul>
  * <p>
  * Note that this class has no Renderer; this class dynamically modifies the component
@@ -178,7 +178,7 @@
 	 * metadata for this class. The classname is of course the concrete class of the
 	 * specified object.
 	 * <p>
-	 * For example, "ejb:fqn.to.model.Entity" means use the EJB3-based extractor 
+	 * For example, "ejb:fqn.to.model.Entity" means use the EJB3-based extractor
 	 * implementation to obtain metadata about the given entity
 	 * <p>
 	 * TODO: why can't value.getClass() be used for the classname part of the uri?
@@ -311,7 +311,7 @@
      * When editing existing objects this should be set to true, as it is not possible
      * to modify the key of an existing entity. When creating a new instance this should
      * be set to true if the key is an auto-generated surrogate key, but false if the
-     * key to this entity is a "business key".  
+     * key to this entity is a "business key".
      */
     public void setIdAsDisplayOnly(boolean idAsDisplayOnly)
     {
@@ -592,7 +592,7 @@
 
 	/**
 	 * create and add the components to the layout component.
-	 * 
+	 *
 	 * TODO: clean this method up. It still had artefacts from when this code was in a separate
 	 * Renderer class.
 	 */
@@ -603,9 +603,8 @@
 		MetaData metaData = extractMetaData(dynaForm);
 
 		Slipstream slipstream = new Slipstream();
+		slipstream.setDynaForm(this);
 		slipstream.setModelMetaData(metaData);
-		slipstream.setDisplayOnly(dynaForm.isDisplayOnly());
-        slipstream.setIdAsDisplayOnly(dynaForm.isIdAsDisplayOnly());
 
 		if (dynaForm.getBundle() != null)
 		{

Added: myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/DynaFormComponentHandler.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/DynaFormComponentHandler.java?rev=592769&view=auto
==============================================================================
--- myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/DynaFormComponentHandler.java (added)
+++ myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/DynaFormComponentHandler.java Wed Nov  7 06:55:22 2007
@@ -0,0 +1,30 @@
+/*
+ * 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.orchestra.dynaForm.guiBuilder;
+
+import org.apache.myfaces.orchestra.dynaForm.component.dynaForm.DynaForm;
+import org.apache.myfaces.orchestra.dynaForm.metadata.FieldInterface;
+
+/**
+ * A component handler which will be used to render the component
+ */
+public interface DynaFormComponentHandler
+{
+	public void buildComponent(DynaForm dynaForm, GuiBuilder guiBuilder, FieldInterface field);
+}

Propchange: myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/DynaFormComponentHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/DynaFormComponentHandler.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/DynaFormComponentHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/Slipstream.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/Slipstream.java?rev=592769&r1=592768&r2=592769&view=diff
==============================================================================
--- myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/Slipstream.java (original)
+++ myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/guiBuilder/Slipstream.java Wed Nov  7 06:55:22 2007
@@ -18,6 +18,7 @@
  */
 package org.apache.myfaces.orchestra.dynaForm.guiBuilder;
 
+import org.apache.myfaces.orchestra.dynaForm.component.dynaForm.DynaForm;
 import org.apache.myfaces.orchestra.dynaForm.metadata.FieldInterface;
 import org.apache.myfaces.orchestra.dynaForm.metadata.MetaDataInterface;
 
@@ -29,36 +30,15 @@
  */
 public class Slipstream
 {
-	private boolean displayOnly;
-    private boolean idAsDisplayOnly;
 	private MetaDataInterface modelMetaData;
 	private GuiBuilder guiBuilder;
 	private Map labelBundle;
+	private DynaForm dynaForm;
 
 	public Slipstream()
 	{
 	}
 
-	public boolean isDisplayOnly()
-	{
-		return displayOnly;
-	}
-
-	public void setDisplayOnly(boolean displayOnly)
-	{
-		this.displayOnly = displayOnly;
-	}
-
-    public boolean isIdAsDisplayOnly()
-    {
-        return idAsDisplayOnly;
-    }
-
-    public void setIdAsDisplayOnly(boolean idAsDisplayOnly)
-    {
-        this.idAsDisplayOnly = idAsDisplayOnly;
-    }
-
     public MetaDataInterface getModelMetaData()
 	{
 		return modelMetaData;
@@ -89,6 +69,16 @@
 		this.labelBundle = labelBundle;
 	}
 
+	public DynaForm getDynaForm()
+	{
+		return dynaForm;
+	}
+
+	public void setDynaForm(DynaForm dynaForm)
+	{
+		this.dynaForm = dynaForm;
+	}
+
 	public void process()
 	{
 		configureGuiBuilder();
@@ -99,15 +89,21 @@
 		{
 			String fieldName = iterFieldNames.next();
 			FieldInterface field = modelMetaData.getField(fieldName);
-
-			guiBuilder.buildField(field);
+			if (field.getComponentHandler() != null)
+			{
+				field.getComponentHandler().buildComponent(dynaForm, guiBuilder, field);
+			}
+			else
+			{
+				guiBuilder.buildField(field);
+			}
 		}
 	}
 
 	protected void configureGuiBuilder()
 	{
-		guiBuilder.setFormDisplayOnly(isDisplayOnly());
+		guiBuilder.setFormDisplayOnly(dynaForm.isDisplayOnly());
 		guiBuilder.setLabelBundle(getLabelBundle());
-        guiBuilder.setIdAsDisplayOnly(isIdAsDisplayOnly());
+        guiBuilder.setIdAsDisplayOnly(dynaForm.isIdAsDisplayOnly());
 	}
 }

Modified: myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/FieldInterface.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/FieldInterface.java?rev=592769&r1=592768&r2=592769&view=diff
==============================================================================
--- myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/FieldInterface.java (original)
+++ myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/FieldInterface.java Wed Nov  7 06:55:22 2007
@@ -19,6 +19,7 @@
 package org.apache.myfaces.orchestra.dynaForm.metadata;
 
 import org.apache.myfaces.orchestra.dynaForm.guiBuilder.ComponentEnum;
+import org.apache.myfaces.orchestra.dynaForm.guiBuilder.DynaFormComponentHandler;
 import org.apache.myfaces.orchestra.dynaForm.lib.SelectionSourceEnum;
 
 import javax.faces.component.UIComponent;
@@ -91,4 +92,6 @@
 	public String getConverterId();
 
 	public Class getConverterClass();
+
+	public DynaFormComponentHandler getComponentHandler();
 }

Modified: myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/MetaData.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/MetaData.java?rev=592769&r1=592768&r2=592769&view=diff
==============================================================================
--- myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/MetaData.java (original)
+++ myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/MetaData.java Wed Nov  7 06:55:22 2007
@@ -19,6 +19,7 @@
 package org.apache.myfaces.orchestra.dynaForm.metadata;
 
 import org.apache.myfaces.orchestra.dynaForm.guiBuilder.ComponentEnum;
+import org.apache.myfaces.orchestra.dynaForm.guiBuilder.DynaFormComponentHandler;
 import org.apache.myfaces.orchestra.dynaForm.lib.SelectionSourceEnum;
 
 import javax.faces.component.UIComponent;
@@ -73,6 +74,7 @@
 
 		private UIComponent wantedComponent;
 		private ComponentEnum wantedComponentType = ComponentEnum.Automatic;
+		private DynaFormComponentHandler componentHandler;
 
 		private String dataSource;
 		private String dataSourceDescription;
@@ -383,6 +385,16 @@
 		public void setConverterClass(Class converterClass)
 		{
 			this.converterClass = converterClass;
+		}
+
+		public DynaFormComponentHandler getComponentHandler()
+		{
+			return componentHandler;
+		}
+
+		public void setComponentHandler(DynaFormComponentHandler componentHandler)
+		{
+			this.componentHandler = componentHandler;
 		}
 	}
 

Modified: myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/impl/ejb/EjbExtractor.java
URL: http://svn.apache.org/viewvc/myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/impl/ejb/EjbExtractor.java?rev=592769&r1=592768&r2=592769&view=diff
==============================================================================
--- myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/impl/ejb/EjbExtractor.java (original)
+++ myfaces/orchestra/trunk/core15/src/main/java/org/apache/myfaces/orchestra/dynaForm/metadata/impl/ejb/EjbExtractor.java Wed Nov  7 06:55:22 2007
@@ -19,6 +19,7 @@
 package org.apache.myfaces.orchestra.dynaForm.metadata.impl.ejb;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.myfaces.orchestra.dynaForm.annot.ui.ComponentHandler;
 import org.apache.myfaces.orchestra.dynaForm.annot.ui.DataProvider;
 import org.apache.myfaces.orchestra.dynaForm.annot.ui.DisplayOnly;
 import org.apache.myfaces.orchestra.dynaForm.annot.ui.IgnoreProperty;
@@ -29,10 +30,12 @@
 import org.apache.myfaces.orchestra.dynaForm.annot.ui.Range;
 import org.apache.myfaces.orchestra.dynaForm.annot.ui.ReadOnly;
 import org.apache.myfaces.orchestra.dynaForm.annot.ui.UIComponent;
+import org.apache.myfaces.orchestra.dynaForm.guiBuilder.DynaFormComponentHandler;
 import org.apache.myfaces.orchestra.dynaForm.metadata.Extractor;
 import org.apache.myfaces.orchestra.dynaForm.metadata.MetaData;
 import org.apache.myfaces.orchestra.dynaForm.metadata.RelationType;
 import org.apache.myfaces.orchestra.dynaForm.metadata.Selection;
+import org.apache.myfaces.orchestra.frameworkAdapter.FrameworkAdapter;
 
 import javax.persistence.Basic;
 import javax.persistence.Column;
@@ -461,6 +464,23 @@
 		{
 			UIComponent component = accessibleObject.getAnnotation(UIComponent.class);
 			mdField.setWantedComponentType(component.type());
+		}
+
+		if (accessibleObject.isAnnotationPresent(ComponentHandler.class))
+		{
+			ComponentHandler componentHandler = accessibleObject.getAnnotation(ComponentHandler.class);
+			String componentHandlerBeanName = componentHandler.value();
+			Object componentHandlerBean = FrameworkAdapter.getCurrentInstance().getBean(componentHandlerBeanName);
+			if (componentHandlerBean == null)
+			{
+				throw new IllegalArgumentException("no component handler with bean name " + componentHandlerBeanName + " found.");
+			}
+			if (!(componentHandlerBean instanceof DynaFormComponentHandler))
+			{
+				throw new IllegalArgumentException("component handler with bean name " + componentHandlerBeanName + " doesn't implement the " + DynaFormComponentHandler.class.getName() + " interface.");
+			}
+
+			mdField.setComponentHandler((DynaFormComponentHandler) componentHandlerBean);
 		}
 
 		if (accessibleObject.isAnnotationPresent(Column.class))