View Javadoc

    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 }