Author: lukaszlenart
Date: Wed May  5 16:25:09 2010
New Revision: 941368

URL: http://svn.apache.org/viewvc?rev=941368&view=rev
Log:
Solved WW-3250 - added wildcard support for Content type and test case

Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java?rev=941368&r1=941367&r2=941368&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
 Wed May  5 16:25:09 2010
@@ -226,6 +226,7 @@ public class FileUploadInterceptor exten
     /* (non-Javadoc)
      * @see 
com.opensymphony.xwork2.interceptor.Interceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
      */
+
     public String intercept(ActionInvocation invocation) throws Exception {
         ActionContext ac = invocation.getInvocationContext();
 
@@ -243,7 +244,7 @@ public class FileUploadInterceptor exten
         ValidationAware validation = null;
 
         Object action = invocation.getAction();
-        
+
         if (action instanceof ValidationAware) {
             validation = (ValidationAware) action;
         }
@@ -323,7 +324,7 @@ public class FileUploadInterceptor exten
 
                 if ((currentFile != null) && currentFile.isFile()) {
                     if (currentFile.delete() == false) {
-                        LOG.warn("Resource Leaking:  Could not remove uploaded 
file '"+currentFile.getCanonicalPath()+"'.");
+                        LOG.warn("Resource Leaking:  Could not remove uploaded 
file '" + currentFile.getCanonicalPath() + "'.");
                     }
                 }
             }
@@ -369,7 +370,7 @@ public class FileUploadInterceptor exten
             }
 
             LOG.warn(errMsg);
-        } else if ((! allowedExtensionsSet.isEmpty()) && 
(!hasAllowedExtension(allowedExtensionsSet, filename))) {
+        } else if ((!allowedExtensionsSet.isEmpty()) && 
(!hasAllowedExtension(allowedExtensionsSet, filename))) {
             String errMsg = getTextMessage(action, 
"struts.messages.error.file.extension.not.allowed", new Object[]{inputName, 
filename, file.getName(), contentType}, locale);
             if (validation != null) {
                 validation.addFieldError(inputName, errMsg);
@@ -409,7 +410,43 @@ public class FileUploadInterceptor exten
      * @return true if itemCollection contains the item, false otherwise.
      */
     private boolean containsItem(Collection<String> itemCollection, String 
item) {
-        return itemCollection.contains(item.toLowerCase());
+        for (String pattern : itemCollection)
+            if (matchesWildcard(pattern, item))
+                return true;
+        return false;
+    }
+
+    private boolean matchesWildcard(String pattern, String text) {
+        text += '\0';
+        pattern += '\0';
+
+        int N = pattern.length();
+
+        boolean[] states = new boolean[N + 1];
+        boolean[] old = new boolean[N + 1];
+        old[0] = true;
+
+        for (int i = 0; i < text.length(); i++) {
+            char c = text.charAt(i);
+            states = new boolean[N + 1];
+            for (int j = 0; j < N; j++) {
+                char p = pattern.charAt(j);
+
+                if (old[j] && (p == '*'))
+                    old[j + 1] = true;
+
+                if (old[j] && (p == c))
+                    states[j + 1] = true;
+                if (old[j] && (p == '?'))
+                    states[j + 1] = true;
+                if (old[j] && (p == '*'))
+                    states[j] = true;
+                if (old[j] && (p == '*'))
+                    states[j + 1] = true;
+            }
+            old = states;
+        }
+        return states[N];
     }
 
     private boolean isNonEmpty(Object[] objArray) {
@@ -425,15 +462,15 @@ public class FileUploadInterceptor exten
     private String getTextMessage(String messageKey, Object[] args, Locale 
locale) {
         return getTextMessage(null, messageKey, args, locale);
     }
-    
+
     private String getTextMessage(Object action, String messageKey, Object[] 
args, Locale locale) {
         if (args == null || args.length == 0) {
-            if ( action != null && useActionMessageBundle) {
+            if (action != null && useActionMessageBundle) {
                 return LocalizedTextUtil.findText(action.getClass(), 
messageKey, locale);
             }
-            return LocalizedTextUtil.findText(this.getClass(), messageKey, 
locale);                        
+            return LocalizedTextUtil.findText(this.getClass(), messageKey, 
locale);
         } else {
-            if ( action != null && useActionMessageBundle) {
+            if (action != null && useActionMessageBundle) {
                 return LocalizedTextUtil.findText(action.getClass(), 
messageKey, locale, DEFAULT_MESSAGE, args);
             }
             return LocalizedTextUtil.findText(this.getClass(), messageKey, 
locale, DEFAULT_MESSAGE, args);

Modified: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java?rev=941368&r1=941367&r2=941368&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
 (original)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
 Wed May  5 16:25:09 2010
@@ -82,6 +82,26 @@ public class FileUploadInterceptorTest e
         assertTrue(validation.hasErrors());
     }
 
+
+    public void testAcceptFileWithWildcardContent() throws Exception {
+        interceptor.setAllowedTypes("text/*");
+
+        ValidationAwareSupport validation = new ValidationAwareSupport();
+        boolean ok = interceptor.acceptFile(null, new File(""), 
"filename.txt", "text/plain", "inputName", validation, Locale.getDefault());
+
+        assertTrue(ok);
+        assertTrue(validation.getFieldErrors().isEmpty());
+        assertFalse(validation.hasErrors());
+
+        interceptor.setAllowedTypes("text/h*");
+        validation = new ValidationAwareSupport();
+        boolean notOk = interceptor.acceptFile(null, new File(""), 
"filename.html", "text/plain", "inputName", validation, Locale.getDefault());
+
+        assertFalse(notOk);
+        assertFalse(validation.getFieldErrors().isEmpty());
+        assertTrue(validation.hasErrors());
+    }
+
     public void testAcceptFileWithoutEmptyExtensions() throws Exception {
         interceptor.setAllowedExtensions(".txt");
 


Reply via email to