Author: bayard Date: Tue Apr 17 08:51:49 2007 New Revision: 529651 URL: http://svn.apache.org/viewvc?view=rev&rev=529651 Log: Merging -r524894:529460 https://svn.apache.org/repos/asf/struts/struts1/branches/STRUTS_1_3_BRANCH into trunk as per STR-3018
Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/AbstractCreateAction.java struts/struts1/trunk/core/src/main/java/org/apache/struts/upload/CommonsMultipartRequestHandler.java struts/struts1/trunk/core/src/main/java/org/apache/struts/util/RequestUtils.java struts/struts1/trunk/el/src/main/resources/META-INF/tld/struts-html-el.tld struts/struts1/trunk/tiles/src/main/java/org/apache/struts/tiles/TilesUtilImpl.java Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/AbstractCreateAction.java URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/AbstractCreateAction.java?view=diff&rev=529651&r1=529650&r2=529651 ============================================================================== --- struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/AbstractCreateAction.java (original) +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/AbstractCreateAction.java Tue Apr 17 08:51:49 2007 @@ -76,9 +76,10 @@ String type = actionConfig.getType(); if (type == null) { - if ((actionConfig.getForward() == null) + String command = actionConfig.getCommand(); + if ((command == null) && (actionConfig.getForward() == null) && (actionConfig.getInclude() == null)) { - LOG.error("no type for " + actionConfig.getPath()); + LOG.error("no type or command for " + actionConfig.getPath()); } else { LOG.trace("no type for " + actionConfig.getPath()); } Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/upload/CommonsMultipartRequestHandler.java URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/upload/CommonsMultipartRequestHandler.java?view=diff&rev=529651&r1=529650&r2=529651 ============================================================================== --- struts/struts1/trunk/core/src/main/java/org/apache/struts/upload/CommonsMultipartRequestHandler.java (original) +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/upload/CommonsMultipartRequestHandler.java Tue Apr 17 08:51:49 2007 @@ -41,6 +41,7 @@ import java.io.InputStream; import java.io.Serializable; +import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; @@ -244,10 +245,16 @@ public void rollback() { Iterator iter = elementsFile.values().iterator(); + Object o; while (iter.hasNext()) { - FormFile formFile = (FormFile) iter.next(); - - formFile.destroy(); + o = iter.next(); + if (o instanceof List) { + for (Iterator i = ((List)o).iterator(); i.hasNext(); ) { + ((FormFile)i.next()).destroy(); + } + } else { + ((FormFile)o).destroy(); + } } } @@ -448,8 +455,22 @@ protected void addFileParameter(FileItem item) { FormFile formFile = new CommonsFormFile(item); - elementsFile.put(item.getFieldName(), formFile); - elementsAll.put(item.getFieldName(), formFile); + String name = item.getFieldName(); + if (elementsFile.containsKey(name)) { + Object o = elementsFile.get(name); + if (o instanceof List) { + ((List)o).add(formFile); + } else { + List list = new ArrayList(); + list.add((FormFile)o); + list.add(formFile); + elementsFile.put(name, list); + elementsAll.put(name, list); + } + } else { + elementsFile.put(name, formFile); + elementsAll.put(name, formFile); + } } // ---------------------------------------------------------- Inner Classes Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/util/RequestUtils.java URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/util/RequestUtils.java?view=diff&rev=529651&r1=529650&r2=529651 ============================================================================== --- struts/struts1/trunk/core/src/main/java/org/apache/struts/util/RequestUtils.java (original) +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/util/RequestUtils.java Tue Apr 17 08:51:49 2007 @@ -21,6 +21,7 @@ package org.apache.struts.util; import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts.Globals; @@ -32,6 +33,7 @@ import org.apache.struts.config.FormBeanConfig; import org.apache.struts.config.ForwardConfig; import org.apache.struts.config.ModuleConfig; +import org.apache.struts.upload.FormFile; import org.apache.struts.upload.MultipartRequestHandler; import org.apache.struts.upload.MultipartRequestWrapper; @@ -40,13 +42,16 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; +import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; +import java.util.List; import java.util.Locale; import java.util.Map; @@ -451,6 +456,7 @@ if (isMultipart) { parameterValue = multipartParameters.get(name); + parameterValue = rationalizeMultipleFileProperty(bean, name, parameterValue); } else { parameterValue = request.getParameterValues(name); } @@ -479,6 +485,46 @@ } /** + * <p>If the given form bean can accept multiple FormFile objects but the user only uploaded a single, then + * the property will not match the form bean type. This method performs some simple checks to try to accommodate + * that situation.</p> + * @param bean + * @param name + * @param parameterValue + * @return + * @throws ServletException if the introspection has any errors. + */ + private static Object rationalizeMultipleFileProperty(Object bean, String name, Object parameterValue) throws ServletException { + if (!(parameterValue instanceof FormFile)) return parameterValue; + + FormFile formFileValue = (FormFile) parameterValue; + try { + Class propertyType = PropertyUtils.getPropertyType(bean, name); + + if (propertyType.isAssignableFrom(List.class)) { + ArrayList list = new ArrayList(1); + list.add(formFileValue); + return list; + } + + if (propertyType.isArray() && propertyType.getComponentType().equals(FormFile.class)) { + return new FormFile[] { formFileValue }; + } + + } catch (IllegalAccessException e) { + throw new ServletException(e); + } catch (InvocationTargetException e) { + throw new ServletException(e); + } catch (NoSuchMethodException e) { + throw new ServletException(e); + } + + // no changes + return parameterValue; + + } + + /** * <p>Try to locate a multipart request handler for this request. First, * look for a mapping-specific handler stored for us under an attribute. * If one is not present, use the global multipart handler, if there is Modified: struts/struts1/trunk/el/src/main/resources/META-INF/tld/struts-html-el.tld URL: http://svn.apache.org/viewvc/struts/struts1/trunk/el/src/main/resources/META-INF/tld/struts-html-el.tld?view=diff&rev=529651&r1=529650&r2=529651 ============================================================================== --- struts/struts1/trunk/el/src/main/resources/META-INF/tld/struts-html-el.tld (original) +++ struts/struts1/trunk/el/src/main/resources/META-INF/tld/struts-html-el.tld Tue Apr 17 08:51:49 2007 @@ -5170,7 +5170,6 @@ <name>filter</name> <required>false</required> <rtexprvalue>true</rtexprvalue> - <type>boolean</type> <description> <![CDATA[ Set to <code>true</code> if you want the option label to be Modified: struts/struts1/trunk/tiles/src/main/java/org/apache/struts/tiles/TilesUtilImpl.java URL: http://svn.apache.org/viewvc/struts/struts1/trunk/tiles/src/main/java/org/apache/struts/tiles/TilesUtilImpl.java?view=diff&rev=529651&r1=529650&r2=529651 ============================================================================== --- struts/struts1/trunk/tiles/src/main/java/org/apache/struts/tiles/TilesUtilImpl.java (original) +++ struts/struts1/trunk/tiles/src/main/java/org/apache/struts/tiles/TilesUtilImpl.java Tue Apr 17 08:51:49 2007 @@ -132,7 +132,13 @@ } catch (IllegalAccessException e) { log.debug("Could not find JSP 2.0 include method. Using old one.", e); } catch (InvocationTargetException e) { - log.debug("Unable to execute JSP 2.0 include method. Trying old one.", e); + if (e.getCause() instanceof ServletException){ + throw ((ServletException)e.getCause()); + } else if (e.getCause() instanceof IOException){ + throw ((IOException)e.getCause()); + } else { + throw new ServletException(e); + } } pageContext.include(uri);