Save This Page
Home » struts-2.0.11.2-src » org.apache » struts2 » components » [javadoc | source]
    1   /*
    2    * $Id: ListUIBean.java 497654 2007-01-19 00:21:57Z rgielen $
    3    *
    4    * Licensed to the Apache Software Foundation (ASF) under one
    5    * or more contributor license agreements.  See the NOTICE file
    6    * distributed with this work for additional information
    7    * regarding copyright ownership.  The ASF licenses this file
    8    * to you under the Apache License, Version 2.0 (the
    9    * "License"); you may not use this file except in compliance
   10    * with the License.  You may obtain a copy of the License at
   11    *
   12    *  http://www.apache.org/licenses/LICENSE-2.0
   13    *
   14    * Unless required by applicable law or agreed to in writing,
   15    * software distributed under the License is distributed on an
   16    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   17    * KIND, either express or implied.  See the License for the
   18    * specific language governing permissions and limitations
   19    * under the License.
   20    */
   21   package org.apache.struts2.components;
   22   
   23   import java.lang.reflect.Array;
   24   import java.util.Collection;
   25   import java.util.Map;
   26   
   27   import javax.servlet.http.HttpServletRequest;
   28   import javax.servlet.http.HttpServletResponse;
   29   
   30   import org.apache.struts2.views.annotations.StrutsTagAttribute;
   31   import org.apache.struts2.util.ContainUtil;
   32   import org.apache.struts2.util.MakeIterator;
   33   
   34   import com.opensymphony.xwork2.util.ValueStack;
   35   
   36   /**
   37    * DoubleListUIBean is the standard superclass of all Struts list handling components.
   38    *
   39    * <p/>
   40    *
   41    * <!-- START SNIPPET: javadoc -->
   42    *
   43    * Note that the listkey and listvalue attribute will default to "key" and "value"
   44    * respectively only when the list attribute is evaluated to a Map or its decendant.
   45    * Other thing else, will result in listkey and listvalue to be null and not used.
   46    *
   47    * <!-- END SNIPPET: javadoc -->
   48    *
   49    */
   50   public abstract class ListUIBean extends UIBean {
   51       protected Object list;
   52       protected String listKey;
   53       protected String listValue;
   54   
   55       // indicate if an exception is to be thrown when value attribute is null
   56       protected boolean throwExceptionOnNullValueAttribute = false;
   57   
   58       protected ListUIBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
   59           super(stack, request, response);
   60       }
   61   
   62       public void evaluateExtraParams() {
   63           Object value = null;
   64   
   65           if (list == null) {
   66               list = parameters.get("list");
   67           }
   68   
   69           if (list instanceof String) {
   70               value = findValue((String) list);
   71           } else if (list instanceof Collection) {
   72               value = list;
   73           } else if (MakeIterator.isIterable(list)) {
   74               value = MakeIterator.convert(list);
   75           }
   76           if (value == null) {
   77               if (throwExceptionOnNullValueAttribute) {
   78                   // will throw an exception if not found
   79                   value = findValue((list == null) ? (String) list : list.toString(), "list",
   80                       "The requested list key '" + list + "' could not be resolved as a collection/array/map/enumeration/iterator type. " +
   81                       "Example: people or people.{name}");
   82               }
   83               else {
   84                   // ww-1010, allows value with null value to be compatible with ww
   85                   // 2.1.7 behaviour
   86                   value = findValue((list == null)?(String) list:list.toString());
   87               }
   88           }
   89   
   90           if (value instanceof Collection) {
   91               addParameter("list", value);
   92           } else {
   93               addParameter("list", MakeIterator.convert(value));
   94           }
   95   
   96           if (value instanceof Collection) {
   97               addParameter("listSize", new Integer(((Collection) value).size()));
   98           } else if (value instanceof Map) {
   99               addParameter("listSize", new Integer(((Map) value).size()));
  100           } else if (value != null && value.getClass().isArray()) {
  101               addParameter("listSize", new Integer(Array.getLength(value)));
  102           }
  103   
  104           if (listKey != null) {
  105               addParameter("listKey", listKey);
  106           } else if (value instanceof Map) {
  107               addParameter("listKey", "key");
  108           }
  109   
  110           if (listValue != null) {
  111               if (altSyntax()) {
  112                   // the same logic as with findValue(String)
  113                   // if value start with %{ and end with }, just cut it off!
  114                   if (listValue.startsWith("%{") && listValue.endsWith("}")) {
  115                       listValue = listValue.substring(2, listValue.length() - 1);
  116                   }
  117               }
  118               addParameter("listValue", listValue);
  119           } else if (value instanceof Map) {
  120               addParameter("listValue", "value");
  121           }
  122       }
  123   
  124       public boolean contains(Object obj1, Object obj2) {
  125           return ContainUtil.contains(obj1, obj2);
  126       }
  127   
  128       protected Class getValueClassType() {
  129           return null; // don't convert nameValue to anything, we need the raw value
  130       }
  131   
  132       @StrutsTagAttribute(description="Iterable source to populate from. If the list is a Map (key, value), the Map key will become the option 'value'" +
  133                   " parameter and the Map value will become the option body.", required=true)
  134       public void setList(Object list) {
  135           this.list = list;
  136       }
  137   
  138       @StrutsTagAttribute(description=" Property of list objects to get field value from")
  139       public void setListKey(String listKey) {
  140           this.listKey = listKey;
  141       }
  142   
  143       @StrutsTagAttribute(description="Property of list objects to get field content from")
  144       public void setListValue(String listValue) {
  145           this.listValue = listValue;
  146       }
  147   
  148   
  149       public void setThrowExceptionOnNullValueAttribute(boolean throwExceptionOnNullValueAttribute) {
  150           this.throwExceptionOnNullValueAttribute = throwExceptionOnNullValueAttribute;
  151       }
  152   }

Save This Page
Home » struts-2.0.11.2-src » org.apache » struts2 » components » [javadoc | source]