You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by sc...@apache.org on 2006/10/16 03:16:54 UTC

svn commit: r464354 - /myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/crosstable/UIColumns.java

Author: schof
Date: Sun Oct 15 18:16:53 2006
New Revision: 464354

URL: http://svn.apache.org/viewvc?view=rev&rev=464354
Log:
Applied patch for TOMAHAWK-491.  UIColumns now correctly generates unique id's for each column so that processDecodes is applied to only the single component in the correct column (as opposed to the same component in *all* columns).

Modified:
    myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/crosstable/UIColumns.java

Modified: myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/crosstable/UIColumns.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/crosstable/UIColumns.java?view=diff&rev=464354&r1=464353&r2=464354
==============================================================================
--- myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/crosstable/UIColumns.java (original)
+++ myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/crosstable/UIColumns.java Sun Oct 15 18:16:53 2006
@@ -74,12 +74,11 @@
  * @author Mathias Broekelmann (latest modification by $Author$)
  * @version $Revision$ $Date$
  */
-public class UIColumns extends UIData
-{
+public class UIColumns extends UIData {
     public static final String COMPONENT_TYPE = "org.apache.myfaces.Columns";
 
     private static final Class OBJECT_ARRAY_CLASS = (new Object[0]).getClass();
-    
+
     private static final int PROCESS_DECODES = 1;
     private static final int PROCESS_VALIDATORS = 2;
     private static final int PROCESS_UPDATES = 3;
@@ -96,65 +95,52 @@
 
     private Map _dataModelMap = new HashMap();
 
-    public UIColumns()
-    {
+    public UIColumns() {
         super();
     }
 
     /**
      * Return true if there are any more <i>columns</i> to process.
      */
-    public boolean isRowAvailable()
-    {
+    public boolean isRowAvailable() {
         return getDataModel().isRowAvailable();
     }
 
     /**
      * Get the number of dynamic columns represented by this instance.
      */
-    public int getRowCount()
-    {
+    public int getRowCount() {
         return getDataModel().getRowCount();
     }
 
     /** Get the object representing the current column. */
-    public Object getRowData()
-    {
+    public Object getRowData() {
         return getDataModel().getRowData();
     }
 
     /** Get the currently selected column index. */
-    public int getRowIndex()
-    {
+    public int getRowIndex() {
         return _colIndex;
     }
-    
+
     /** Set the currently selected column. */
-    public void setRowIndex(int colIndex)
-    {
-        if (colIndex < -1)
-        {
+    public void setRowIndex(int colIndex) {
+        if (colIndex < -1) {
             throw new IllegalArgumentException("colIndex is less than -1");
         }
 
-        if (_colIndex == colIndex)
-        {
+        if (_colIndex == colIndex) {
             return;
         }
 
         FacesContext facesContext = getFacesContext();
 
-        if (_colIndex == -1)
-        {
-            if (_initialDescendantComponentState == null)
-            {
+        if (_colIndex == -1) {
+            if (_initialDescendantComponentState == null) {
                 _initialDescendantComponentState = saveDescendantComponentStates(getFacetsAndChildren());
             }
-        }
-        else
-        {
-            _cellStates.put(getClientId(facesContext),
-                    saveDescendantComponentStates(getFacetsAndChildren()));
+        } else {
+            _cellStates.put(getClientId(facesContext), saveDescendantComponentStates(getFacetsAndChildren()));
         }
 
         _colIndex = colIndex;
@@ -163,106 +149,70 @@
         dataModel.setRowIndex(colIndex);
 
         String var = getVar();
-        if (colIndex == -1)
-        {
-            if (var != null)
-            {
+        if (colIndex == -1) {
+            if (var != null) {
                 facesContext.getExternalContext().getRequestMap().remove(var);
             }
-        }
-        else
-        {
-            if (var != null)
-            {
-                if (isRowAvailable())
-                {
+        } else {
+            if (var != null) {
+                if (isRowAvailable()) {
                     Object rowData = dataModel.getRowData();
-                    facesContext.getExternalContext().getRequestMap().put(var,
-                            rowData);
-                }
-                else
-                {
-                    facesContext.getExternalContext().getRequestMap().remove(
-                            var);
+                    facesContext.getExternalContext().getRequestMap().put(var, rowData);
+                } else {
+                    facesContext.getExternalContext().getRequestMap().remove(var);
                 }
             }
         }
 
-        if (_colIndex == -1)
-        {
-            restoreDescendantComponentStates(getFacetsAndChildren(),
-                    _initialDescendantComponentState);
-        }
-        else
-        {
+        if (_colIndex == -1) {
+            restoreDescendantComponentStates(getFacetsAndChildren(), _initialDescendantComponentState);
+        } else {
             Object rowState = _cellStates.get(getClientId(facesContext));
-            if (rowState == null)
-            {
-                restoreDescendantComponentStates(getFacetsAndChildren(),
-                        _initialDescendantComponentState);
-            }
-            else
-            {
-                restoreDescendantComponentStates(getFacetsAndChildren(),
-                        rowState);
+            if (rowState == null) {
+                restoreDescendantComponentStates(getFacetsAndChildren(), _initialDescendantComponentState);
+            } else {
+                restoreDescendantComponentStates(getFacetsAndChildren(), rowState);
             }
         }
     }
 
-    protected void restoreDescendantComponentStates(Iterator childIterator,
-            Object state)
-    {
+    protected void restoreDescendantComponentStates(Iterator childIterator, Object state) {
         Iterator descendantStateIterator = null;
-        while (childIterator.hasNext())
-        {
-            if (descendantStateIterator == null && state != null)
-            {
+        while (childIterator.hasNext()) {
+            if (descendantStateIterator == null && state != null) {
                 descendantStateIterator = ((Collection) state).iterator();
             }
             UIComponent component = (UIComponent) childIterator.next();
             // reset the client id (see spec 3.1.6)
             component.setId(component.getId());
-            if (!component.isTransient())
-            {
+            if (!component.isTransient()) {
                 Object childState = null;
                 Object descendantState = null;
-                if (descendantStateIterator != null
-                        && descendantStateIterator.hasNext())
-                {
+                if (descendantStateIterator != null && descendantStateIterator.hasNext()) {
                     Object[] object = (Object[]) descendantStateIterator.next();
                     childState = object[0];
                     descendantState = object[1];
                 }
-                if (component instanceof EditableValueHolder)
-                {
-                    ((EditableValueHolderState) childState)
-                            .restoreState((EditableValueHolder) component);
+                if (component instanceof EditableValueHolder) {
+                    ((EditableValueHolderState) childState).restoreState((EditableValueHolder) component);
                 }
-                restoreDescendantComponentStates(component
-                        .getFacetsAndChildren(), descendantState);
+                restoreDescendantComponentStates(component.getFacetsAndChildren(), descendantState);
             }
         }
     }
 
-    protected Object saveDescendantComponentStates(Iterator childIterator)
-    {
+    protected Object saveDescendantComponentStates(Iterator childIterator) {
         Collection childStates = null;
-        while (childIterator.hasNext())
-        {
-            if (childStates == null)
-            {
+        while (childIterator.hasNext()) {
+            if (childStates == null) {
                 childStates = new ArrayList();
             }
             UIComponent child = (UIComponent) childIterator.next();
-            if (!child.isTransient())
-            {
-                Object descendantState = saveDescendantComponentStates(child
-                        .getFacetsAndChildren());
+            if (!child.isTransient()) {
+                Object descendantState = saveDescendantComponentStates(child.getFacetsAndChildren());
                 Object state = null;
-                if (child instanceof EditableValueHolder)
-                {
-                    state = new EditableValueHolderState(
-                            (EditableValueHolder) child);
+                if (child instanceof EditableValueHolder) {
+                    state = new EditableValueHolderState((EditableValueHolder) child);
                 }
                 childStates.add(new Object[] { state, descendantState });
             }
@@ -270,26 +220,19 @@
         return childStates;
     }
 
-    public void setValue(Object value)
-    {
+    public void setValue(Object value) {
         super.setValue(value);
         _dataModelMap.clear();
         _cellStates.clear();
         _isValidChilds = true;
     }
 
-    public void setValueBinding(String name, ValueBinding binding)
-    {
-        if (name == null)
-        {
+    public void setValueBinding(String name, ValueBinding binding) {
+        if (name == null) {
             throw new NullPointerException("name");
-        }
-        else if (name.equals("value"))
-        {
+        } else if (name.equals("value")) {
             _dataModelMap.clear();
-        }
-        else if (name.equals("var") || name.equals("rowIndex"))
-        {
+        } else if (name.equals("var") || name.equals("rowIndex")) {
             throw new IllegalArgumentException("name " + name);
         }
         super.setValueBinding(name, binding);
@@ -299,29 +242,24 @@
      * Get a DataModel whose wrapped data contains a collection of
      * objects representing columns.
      */
-    protected DataModel getDataModel()
-    {
+    protected DataModel getDataModel() {
         String clientID = "";
         UIComponent parent = getParentUIData().getParent();
-        if(parent != null)
-        {
+        if (parent != null) {
             clientID = parent.getClientId(getFacesContext());
         }
         DataModel dataModel = (DataModel) _dataModelMap.get(clientID);
-        if (dataModel == null)
-        {
+        if (dataModel == null) {
             dataModel = createDataModel();
             _dataModelMap.put(clientID, dataModel);
         }
         return dataModel;
     }
 
-    protected void setDataModel(DataModel dataModel)
-    {
+    protected void setDataModel(DataModel dataModel) {
         UIComponent parent = getParentUIData().getParent();
         String clientID = "";
-        if(parent != null)
-        {
+        if (parent != null) {
             clientID = parent.getClientId(getFacesContext());
         }
         _dataModelMap.put(clientID, dataModel);
@@ -330,82 +268,57 @@
     /**
      * Creates a new DataModel around the current value.
      */
-    protected DataModel createDataModel()
-    {
+    protected DataModel createDataModel() {
         Object value = getValue();
-        if (value == null)
-        {
+        if (value == null) {
             return EMPTY_DATA_MODEL;
-        }
-        else if (value instanceof DataModel)
-        {
+        } else if (value instanceof DataModel) {
             return (DataModel) value;
-        }
-        else if (value instanceof List)
-        {
+        } else if (value instanceof List) {
             return new ListDataModel((List) value);
-        }
-        else if (value instanceof Collection)
-        {
+        } else if (value instanceof Collection) {
             return new ListDataModel(new ArrayList((Collection) value));
-        }
-        else if (OBJECT_ARRAY_CLASS.isAssignableFrom(value.getClass()))
-        {
+        } else if (OBJECT_ARRAY_CLASS.isAssignableFrom(value.getClass())) {
             return new ArrayDataModel((Object[]) value);
-        }
-        else if (value instanceof ResultSet)
-        {
+        } else if (value instanceof ResultSet) {
             return new ResultSetDataModel((ResultSet) value);
-        }
-        else if (value instanceof Result)
-        {
+        } else if (value instanceof Result) {
             return new ResultDataModel((Result) value);
-        }
-        else
-        {
+        } else {
             return new ScalarDataModel(value);
         }
     }
 
-    private static final DataModel EMPTY_DATA_MODEL = new DataModel()
-    {
-        public boolean isRowAvailable()
-        {
+    private static final DataModel EMPTY_DATA_MODEL = new DataModel() {
+        public boolean isRowAvailable() {
             return false;
         }
 
-        public int getRowCount()
-        {
+        public int getRowCount() {
             return 0;
         }
 
-        public Object getRowData()
-        {
+        public Object getRowData() {
             throw new IllegalArgumentException();
         }
 
-        public int getRowIndex()
-        {
+        public int getRowIndex() {
             return -1;
         }
 
-        public void setRowIndex(int i)
-        {
+        public void setRowIndex(int i) {
             if (i < -1)
                 throw new IndexOutOfBoundsException("Index < 0 : " + i);
         }
 
-        public Object getWrappedData()
-        {
+        public Object getWrappedData() {
             return null;
         }
 
-        public void setWrappedData(Object obj)
-        {
+        public void setWrappedData(Object obj) {
             if (obj == null)
                 return; //Clearing is allowed
-            throw new UnsupportedOperationException(this.getClass().getName()
-                    + " UnsupportedOperationException");
+            throw new UnsupportedOperationException(this.getClass().getName() + " UnsupportedOperationException");
         }
     };
 
@@ -414,8 +327,7 @@
      * 
      * @see javax.faces.component.UIData#processDecodes(javax.faces.context.FacesContext)
      */
-    public void processDecodes(FacesContext context)
-    {
+    public void processDecodes(FacesContext context) {
         if (context == null)
             throw new NullPointerException("context");
         if (!isRendered())
@@ -426,39 +338,28 @@
         processRows(context, PROCESS_DECODES);
         setRowIndex(-1);
 
-        try
-        {
+        try {
             decode(context);
-        }
-        catch (RuntimeException e)
-        {
+        } catch (RuntimeException e) {
             context.renderResponse();
             throw e;
         }
     }
 
-    private void processColumnsFacets(FacesContext context, int processAction)
-    {
+    private void processColumnsFacets(FacesContext context, int processAction) {
         int first = getFirst();
         int cols = getRows();
         int last;
-        if (cols == 0)
-        {
+        if (cols == 0) {
             last = getRowCount();
-        }
-        else
-        {
+        } else {
             last = first + cols;
         }
 
-        for (int colIndex = first; colIndex < last; colIndex++)
-        {
+        for (int colIndex = first; colIndex < last; colIndex++) {
             setRowIndex(colIndex);
-            if (isRowAvailable())
-            {
-                for (Iterator facetsIter = getFacets().values().iterator(); facetsIter
-                        .hasNext();)
-                {
+            if (isRowAvailable()) {
+                for (Iterator facetsIter = getFacets().values().iterator(); facetsIter.hasNext();) {
                     UIComponent facet = (UIComponent) facetsIter.next();
                     process(context, facet, processAction);
                 }
@@ -467,26 +368,20 @@
         setRowIndex(-1);
     }
 
-    private void processRows(FacesContext context, int processAction)
-    {
+    private void processRows(FacesContext context, int processAction) {
         UIData parentUIData = getParentUIData();
         int first = parentUIData.getFirst();
         int rows = parentUIData.getRows();
         int last;
-        if (rows == 0)
-        {
+        if (rows == 0) {
             last = parentUIData.getRowCount();
-        }
-        else
-        {
+        } else {
             last = first + rows;
         }
 
-        for (int rowIndex = first; rowIndex < last; rowIndex++)
-        {
+        for (int rowIndex = first; rowIndex < last; rowIndex++) {
             parentUIData.setRowIndex(rowIndex);
-            if (parentUIData.isRowAvailable())
-            {
+            if (parentUIData.isRowAvailable()) {
                 processColumns(context, processAction);
             }
         }
@@ -498,45 +393,32 @@
      * Actually, this component will only function correctly when nested within
      * an org.apache.myfaces.component.html.ext.HtmlDataTable.
      */
-    private UIData getParentUIData()
-    {
-        if (_parentUIData == null)
-        {
+    private UIData getParentUIData() {
+        if (_parentUIData == null) {
             UIComponent parent = getParent();
-            if (!(parent instanceof UIData))
-            {
-                throw new IllegalStateException(
-                        "UIColumns component must be a child of a UIData component");
+            if (!(parent instanceof UIData)) {
+                throw new IllegalStateException("UIColumns component must be a child of a UIData component");
             }
             _parentUIData = (UIData) parent;
         }
         return _parentUIData;
     }
 
-    private void processColumns(FacesContext context, int processAction)
-    {
+    private void processColumns(FacesContext context, int processAction) {
         int first = getFirst();
         int cols = getRows();
         int last;
-        if (cols == 0)
-        {
+        if (cols == 0) {
             last = getRowCount();
-        }
-        else
-        {
+        } else {
             last = first + cols;
         }
 
-        for (int colIndex = first; colIndex < last; colIndex++)
-        {
+        for (int colIndex = first; colIndex < last; colIndex++) {
             setRowIndex(colIndex);
-            if (isRowAvailable())
-            {
-                for (Iterator columnChildIter = getChildren().iterator(); columnChildIter
-                        .hasNext();)
-                {
-                    UIComponent columnChild = (UIComponent) columnChildIter
-                            .next();
+            if (isRowAvailable()) {
+                for (Iterator columnChildIter = getChildren().iterator(); columnChildIter.hasNext();) {
+                    UIComponent columnChild = (UIComponent) columnChildIter.next();
                     process(context, columnChild, processAction);
                 }
             }
@@ -547,8 +429,7 @@
     /**
      * @see javax.faces.component.UIData#processValidators(javax.faces.context.FacesContext)
      */
-    public void processValidators(FacesContext context)
-    {
+    public void processValidators(FacesContext context) {
         if (context == null)
             throw new NullPointerException("context");
         if (!isRendered())
@@ -559,8 +440,7 @@
         setRowIndex(-1);
 
         // check if an validation error forces the render response for our data
-        if (context.getRenderResponse())
-        {
+        if (context.getRenderResponse()) {
             _isValidChilds = false;
         }
     }
@@ -568,8 +448,7 @@
     /**
      * @see javax.faces.component.UIData#processUpdates(javax.faces.context.FacesContext)
      */
-    public void processUpdates(FacesContext context)
-    {
+    public void processUpdates(FacesContext context) {
         if (context == null)
             throw new NullPointerException("context");
         if (!isRendered())
@@ -580,17 +459,13 @@
         setRowIndex(-1);
 
         // check if an validation error forces the render response for our data
-        if (context.getRenderResponse())
-        {
+        if (context.getRenderResponse()) {
             _isValidChilds = false;
         }
     }
 
-    private void process(FacesContext context, UIComponent component,
-            int processAction)
-    {
-        switch (processAction)
-        {
+    private void process(FacesContext context, UIComponent component, int processAction) {
+        switch (processAction) {
         case PROCESS_DECODES:
             component.processDecodes(context);
             break;
@@ -607,25 +482,20 @@
      * Called from HtmlDataTable.encodeBegin, ie called once when rendering
      * for the entire table starts.
      */
-    public void encodeTableBegin(FacesContext context)
-    {
+    public void encodeTableBegin(FacesContext context) {
         setRowIndex(-1);
         _initialDescendantComponentState = null;
-        if (_isValidChilds && !hasErrorMessages(context))
-        {
+        if (_isValidChilds && !hasErrorMessages(context)) {
             //Refresh DataModel for rendering:
             _dataModelMap.clear();
             _cellStates.clear();
         }
     }
 
-    protected boolean hasErrorMessages(FacesContext context)
-    {
-        for(Iterator iter = context.getMessages(); iter.hasNext();)
-        {
+    protected boolean hasErrorMessages(FacesContext context) {
+        for (Iterator iter = context.getMessages(); iter.hasNext();) {
             FacesMessage message = (FacesMessage) iter.next();
-            if(FacesMessage.SEVERITY_ERROR.compareTo(message.getSeverity()) <= 0)
-            {
+            if (FacesMessage.SEVERITY_ERROR.compareTo(message.getSeverity()) <= 0) {
                 return true;
             }
         }
@@ -636,32 +506,43 @@
      * Called from HtmlDataTable.encodeEnd, ie called once after rendering
      * for the entire table has completed.
      */
-    public void encodeTableEnd(FacesContext context)
-    {
+    public void encodeTableEnd(FacesContext context) {
         setRowIndex(-1);
     }
 
-    private class EditableValueHolderState
-    {
+    private class EditableValueHolderState {
         private final Object _value;
         private final boolean _localValueSet;
         private final boolean _valid;
         private final Object _submittedValue;
 
-        public EditableValueHolderState(EditableValueHolder evh)
-        {
+        public EditableValueHolderState(EditableValueHolder evh) {
             _value = evh.getLocalValue();
             _localValueSet = evh.isLocalValueSet();
             _valid = evh.isValid();
             _submittedValue = evh.getSubmittedValue();
         }
 
-        public void restoreState(EditableValueHolder evh)
-        {
+        public void restoreState(EditableValueHolder evh) {
             evh.setValue(_value);
             evh.setLocalValueSet(_localValueSet);
             evh.setValid(_valid);
             evh.setSubmittedValue(_submittedValue);
         }
     }
+
+    /// ------ EUR/SI/BS/JC MODIFICATIONS START HERE ---------
+
+    public String getClientId(FacesContext context) {
+        String clientId2 = super.getClientId(context);
+        int rowIndex = getRowIndex();
+        if (rowIndex == -1) {
+            return clientId2;
+        }
+        else {
+            return clientId2 + "_" + rowIndex;
+        }
+    }
+
+    /// ------ EUR/SI/BS/JC MODIFICATIONS END HERE ---------
 }