[Yanel-commits] rev 27334 - in public/yanel/trunk/src: build contributions/resources/contact-form/src/java/org/wyona/yanel/impl/resources contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources realms/yanel-website/src/java/org/wyona/yanel/servlet/menu/impl resources/file/src/build resources/file/src/java/org/wyona/yanel/impl/resources webapp/WEB-INF webapp/src/java/org/wyona/yanel/servlet webapp/src/java/org/wyona/yanel/servlet/communication

josias at wyona.com josias at wyona.com
Thu Sep 13 16:50:43 CEST 2007


Author: josias
Date: 2007-09-13 16:50:42 +0200 (Thu, 13 Sep 2007)
New Revision: 27334

Added:
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/communication/YanelFilter.java
Modified:
   public/yanel/trunk/src/build/dependencies.xml
   public/yanel/trunk/src/contributions/resources/contact-form/src/java/org/wyona/yanel/impl/resources/ContactBean.java
   public/yanel/trunk/src/contributions/resources/contact-form/src/java/org/wyona/yanel/impl/resources/ContactResource.java
   public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java
   public/yanel/trunk/src/realms/yanel-website/src/java/org/wyona/yanel/servlet/menu/impl/YanelWebsiteMenu.java
   public/yanel/trunk/src/resources/file/src/build/dependencies.xml
   public/yanel/trunk/src/resources/file/src/java/org/wyona/yanel/impl/resources/NodeResource.java
   public/yanel/trunk/src/webapp/WEB-INF/web.xml
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/communication/HttpRequest.java
Log:
allow file upload for creation of new file resources, using the apache fileupload library. see bug #5546, thanks to simon

Modified: public/yanel/trunk/src/build/dependencies.xml
===================================================================
--- public/yanel/trunk/src/build/dependencies.xml	2007-09-13 14:44:07 UTC (rev 27333)
+++ public/yanel/trunk/src/build/dependencies.xml	2007-09-13 14:50:42 UTC (rev 27334)
@@ -85,6 +85,7 @@
       <dependency groupId="commons-jelly" artifactId="commons-jelly" version="1.0"/>
       <dependency groupId="commons-jexl" artifactId="commons-jexl" version="1.0"/>
       <dependency groupId="commons-beanutils" artifactId="commons-beanutils" version="1.6"/>
+      <dependency groupId="commons-fileupload" artifactId="commons-fileupload" version="1.2"/>
       <dependency groupId="dom4j" artifactId="dom4j" version="1.5.2"/>
     </artifact:dependencies>
 

Modified: public/yanel/trunk/src/contributions/resources/contact-form/src/java/org/wyona/yanel/impl/resources/ContactBean.java
===================================================================
--- public/yanel/trunk/src/contributions/resources/contact-form/src/java/org/wyona/yanel/impl/resources/ContactBean.java	2007-09-13 14:44:07 UTC (rev 27333)
+++ public/yanel/trunk/src/contributions/resources/contact-form/src/java/org/wyona/yanel/impl/resources/ContactBean.java	2007-09-13 14:50:42 UTC (rev 27334)
@@ -1,7 +1,6 @@
 package org.wyona.yanel.impl.resources;
 
 import javax.servlet.http.HttpServletRequest;
-import org.wyona.yanel.core.util.HttpServletRequestHelper;
 
 public class ContactBean {
     String company, lastName, firstName, address, city, email, message;
@@ -28,12 +27,12 @@
         return lastName;
     }
     public ContactBean(HttpServletRequest request) {
-        company = HttpServletRequestHelper.getParameter(request, "company");
-        firstName = HttpServletRequestHelper.getParameter(request, "firstName");
-        lastName = HttpServletRequestHelper.getParameter(request, "lastName");
-        address  = HttpServletRequestHelper.getParameter(request, "address");
-        city  = HttpServletRequestHelper.getParameter(request, "zipCity");
-        email  = HttpServletRequestHelper.getParameter(request, "email");
-        message = HttpServletRequestHelper.getParameter(request, "message");
+        company = request.getParameter("company");
+        firstName = request.getParameter("firstName");
+        lastName = request.getParameter("lastName");
+        address  = request.getParameter("address");
+        city  = request.getParameter("zipCity");
+        email  = request.getParameter("email");
+        message = request.getParameter("message");
     }
 }

Modified: public/yanel/trunk/src/contributions/resources/contact-form/src/java/org/wyona/yanel/impl/resources/ContactResource.java
===================================================================
--- public/yanel/trunk/src/contributions/resources/contact-form/src/java/org/wyona/yanel/impl/resources/ContactResource.java	2007-09-13 14:44:07 UTC (rev 27333)
+++ public/yanel/trunk/src/contributions/resources/contact-form/src/java/org/wyona/yanel/impl/resources/ContactResource.java	2007-09-13 14:50:42 UTC (rev 27334)
@@ -65,7 +65,7 @@
 import org.wyona.yanel.core.transformation.XIncludeTransformer;
 import org.wyona.yarep.util.RepoPath;
 import org.wyona.yarep.util.YarepUtil;
-import org.wyona.yanel.core.util.HttpServletRequestHelper;import org.wyona.yanel.core.util.PathUtil;
+import org.wyona.yanel.core.util.PathUtil;
 import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 import org.xml.sax.helpers.XMLReaderFactory;
@@ -164,13 +164,13 @@
             }
             if(submit) {
                 sendMail(request, transformer);
-                transformer.setParameter("company", HttpServletRequestHelper.getParameter(request, "company"));
-                transformer.setParameter("firstName", HttpServletRequestHelper.getParameter(request, "firstName"));
-                transformer.setParameter("lastName", HttpServletRequestHelper.getParameter(request, "lastName"));
-                transformer.setParameter("email", HttpServletRequestHelper.getParameter(request, "email"));
-                transformer.setParameter("address", HttpServletRequestHelper.getParameter(request, "address"));
-                transformer.setParameter("zipCity", HttpServletRequestHelper.getParameter(request, "zipCity"));
-                transformer.setParameter("message", HttpServletRequestHelper.getParameter(request, "message"));
+                transformer.setParameter("company", request.getParameter("company"));
+                transformer.setParameter("firstName", request.getParameter("firstName"));
+                transformer.setParameter("lastName", request.getParameter("lastName"));
+                transformer.setParameter("email", request.getParameter("email"));
+                transformer.setParameter("address", request.getParameter("address"));
+                transformer.setParameter("zipCity", request.getParameter("zipCity"));
+                transformer.setParameter("message", request.getParameter("message"));
             }
             
             // create first i18n transformer:

Modified: public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java
===================================================================
--- public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java	2007-09-13 14:44:07 UTC (rev 27333)
+++ public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java	2007-09-13 14:50:42 UTC (rev 27334)
@@ -329,7 +329,7 @@
                     sb.append("<h4>Create new page (step 2)</h4>");
                     sb.append("<h2>Enter/Select template (resp. resource) specific parameters and \"Save As\"</h2>");
                     sb.append("<p>Template (resp. resource type): " + resName + " ("+resNamespace+")</p>");
-                    sb.append("<form>");
+                    sb.append("<form enctype=\"multipart/form-data\" method=\"post\">");
                     // TODO: Add this parameter to the continuation within the session!
                     sb.append("<input type=\"hidden\" name=\"resource-type\" value=\"" + rtps + "\"/>");
 
@@ -464,6 +464,9 @@
             } else {
                 throw new Exception("creation NOT successfull!");
             }
+        } else {
+            throw new Exception("creation NOT successful (newResource == null)!");
+            
         }
         return pathOfNewResource;
     }

Modified: public/yanel/trunk/src/realms/yanel-website/src/java/org/wyona/yanel/servlet/menu/impl/YanelWebsiteMenu.java
===================================================================
--- public/yanel/trunk/src/realms/yanel-website/src/java/org/wyona/yanel/servlet/menu/impl/YanelWebsiteMenu.java	2007-09-13 14:44:07 UTC (rev 27333)
+++ public/yanel/trunk/src/realms/yanel-website/src/java/org/wyona/yanel/servlet/menu/impl/YanelWebsiteMenu.java	2007-09-13 14:50:42 UTC (rev 27334)
@@ -38,7 +38,7 @@
 	sb.append("<ul><li>");
         sb.append("<div id=\"yaneltoolbar_menutitle\">File</div>");
         sb.append("<ul>");
-        sb.append("<li class=\"haschild\"><a href=\"" + backToRealm + "create-new-page.html\">New&#160;&#160;&#160;</a><ul><li><a href=\"" + backToRealm + "create-new-page.html?resource-type=http%3A%2F%2Fwww.wyona.org%2Fyanel%2Fresource%2F1.0%3A%3Axml\">Standard page (XHTML)</a></li><li><a href=\"" + backToRealm + "create-new-page.html?resource-type=http%3A%2F%2Fwww.wyona.org%2Fyanel%2Fresource%2F1.0%3A%3Awiki\">Wiki page</a></li></ul></li>");
+        sb.append("<li class=\"haschild\"><a href=\"" + backToRealm + "create-new-page.html\">New&#160;&#160;&#160;</a><ul><li><a href=\"" + backToRealm + "create-new-page.html?resource-type=http%3A%2F%2Fwww.wyona.org%2Fyanel%2Fresource%2F1.0%3A%3Axml\">Standard page (XHTML)</a></li><li><a href=\"" + backToRealm + "create-new-page.html?resource-type=http%3A%2F%2Fwww.wyona.org%2Fyanel%2Fresource%2F1.0%3A%3Awiki\">Wiki page</a></li><li><a href=\"" + backToRealm + "create-new-page.html?resource-type=http%3A%2F%2Fwww.wyona.org%2Fyanel%2Fresource%2F1.0%3A%3Afile\">File</a></li></ul></li>");
         sb.append("<li class=\"haschild\">New language&#160;&#160;&#160;<ul>");
         
         if (ResourceAttributeHelper.hasAttributeImplemented(resource, "Translatable", "1")) {

Modified: public/yanel/trunk/src/resources/file/src/build/dependencies.xml
===================================================================
--- public/yanel/trunk/src/resources/file/src/build/dependencies.xml	2007-09-13 14:44:07 UTC (rev 27333)
+++ public/yanel/trunk/src/resources/file/src/build/dependencies.xml	2007-09-13 14:50:42 UTC (rev 27334)
@@ -12,7 +12,9 @@
       <dependency groupId="wyona-org-yanel" artifactId="yanel-core" version="1.0-dev-rREVISION"/>
 -->
       <dependency groupId="wyona-org-yanel" artifactId="yanel-core" version="${yanel.source.version}"/>
+      <dependency groupId="wyona-org-yanel" artifactId="yanel-webapp" version="${yanel.source.version}"/>
       <dependency groupId="javax.servlet" artifactId="servlet-api" version="2.3"/>
+      <dependency groupId="commons-fileupload" artifactId="commons-fileupload" version="1.2"/>
     </artifact:dependencies>
 
     <artifact:dependencies pathId="maven2.resource.classpath" filesetId="maven2.resource.fileset">

Modified: public/yanel/trunk/src/resources/file/src/java/org/wyona/yanel/impl/resources/NodeResource.java
===================================================================
--- public/yanel/trunk/src/resources/file/src/java/org/wyona/yanel/impl/resources/NodeResource.java	2007-09-13 14:44:07 UTC (rev 27333)
+++ public/yanel/trunk/src/resources/file/src/java/org/wyona/yanel/impl/resources/NodeResource.java	2007-09-13 14:50:42 UTC (rev 27334)
@@ -32,6 +32,7 @@
 import org.wyona.yanel.core.util.PathUtil;
 import org.wyona.yanel.core.workflow.WorkflowException;
 import org.wyona.yanel.core.workflow.WorkflowHelper;
+import org.wyona.yanel.servlet.communication.HttpRequest;
 
 import org.wyona.yarep.core.Node;
 import org.wyona.yarep.core.Repository;
@@ -47,16 +48,21 @@
 import java.io.Reader;
 import java.io.Writer;
 import java.util.Date;
+import java.util.Enumeration;
 
 import org.apache.log4j.Category;
 
+import org.apache.commons.fileupload.util.Streams;
+
 /**
  * Generic Node Resource
  */
-public class NodeResource extends Resource implements ViewableV2, ModifiableV2, VersionableV2, IntrospectableV1, WorkflowableV1 {
+public class NodeResource extends Resource implements ViewableV2, ModifiableV2, VersionableV2, IntrospectableV1, WorkflowableV1, CreatableV2 {
 //public class NodeResource extends Resource implements ViewableV2, ModifiableV2, VersionableV2, CreatableV2 {
 
     private static Category log = Category.getInstance(NodeResource.class);
+    
+    private String uploadMimeType;
 
     /**
      *
@@ -107,56 +113,7 @@
         String suffix = PathUtil.getSuffix(getPath());
         if (suffix != null) {
             log.debug("SUFFIX: " + suffix);
-            if (suffix.equals("html")) {
-                mimeType = "text/html";
-            } else if (suffix.equals("htm")) {
-                mimeType = "text/html";
-            } else if (suffix.equals("xhtml")) {
-                mimeType = "application/xhtml+xml";
-            } else if (suffix.equals("xml")) {
-                mimeType = "application/xml";
-            } else if (suffix.equals("css")) {
-                mimeType = "text/css";
-            } else if (suffix.equals("js")) {
-                mimeType = "application/x-javascript";
-            } else if (suffix.equals("png")) {
-                mimeType = "image/png";
-            } else if (suffix.equals("jpg")) {
-                mimeType = "image/jpeg";
-	    } else if (suffix.equals("gif")) {
-                mimeType = "image/gif";
-	    } else if (suffix.equals("pdf")) {
-                mimeType = "application/pdf";
-	    } else if (suffix.equals("doc")) {
-                mimeType = "application/msword";
-	    } else if (suffix.equals("odt")) {
-                mimeType = "application/vnd.oasis.opendocument.text";
-	    } else if (suffix.equals("sxc")) {
-                mimeType = "application/vnd.sun.xml.calc";
-	    } else if (suffix.equals("xpi")) {
-                mimeType = "application/x-xpinstall";
-	    } else if (suffix.equals("zip")) {
-                mimeType = "application/zip";
-	    } else if (suffix.equals("jar")) { // http://en.wikipedia.org/wiki/Jar_(file_format)
-                mimeType = "application/java-archive";
-	    } else if (suffix.equals("war")) {
-                mimeType = "application/java-archive";
-	    } else if (suffix.equals("flv")) {
-                mimeType = "video/x-flv";
-	    } else if (suffix.equals("swf")) {
-                mimeType = "application/x-shockwave-flash";
-	    } else if (suffix.equals("txt")) {
-                mimeType = "text/plain";
-	    } else if (suffix.equals("mov")) {
-                mimeType = "video/quicktime";
-	    } else if (suffix.equals("svg")) {
-                mimeType = "image/svg+xml";
-	    } else if (suffix.equals("ico")) {
-                mimeType = "image/x-icon";
-            } else {
-                log.warn("Could not determine mime-type from suffix (suffix: " + suffix + ")!");
-                mimeType = "application/octet-stream";
-            }
+            mimeType = getMimeTypeBySuffix(suffix);
         } else {
             log.warn("mime-type will be set to application/octet-stream, because no suffix for " + getPath());
             mimeType = "application/octet-stream";
@@ -348,15 +305,60 @@
      *
      */
     public void create(HttpServletRequest request) {
-        log.warn("No implemented yet!");
+        try {
+            Repository repo = getRealm().getRepository();
+
+            if (request instanceof HttpRequest) {
+                HttpRequest yanelRequest = (HttpRequest)request;
+                if (yanelRequest.isMultipartRequest()) {
+                    Enumeration parameters = yanelRequest.getFileNames();
+                    if (parameters.hasMoreElements()) {
+                        String name = (String) parameters.nextElement();
+                        
+                        Node newNode = org.wyona.yanel.core.util.YarepUtil.addNodes(repo, getPath().toString(), org.wyona.yarep.core.NodeType.RESOURCE);
+                        OutputStream output = newNode.getOutputStream();
+                        InputStream is = yanelRequest.getInputStream(name);
+                        Streams.copy(is, output, true);
+                        uploadMimeType = yanelRequest.getContentType(name);
+                        newNode.setMimeType(uploadMimeType);
+                    }
+                } else {
+                    log.error("this is NOT a multipart request");
+                }
+            } else {
+                log.error("this is NOT a HttpRequest");
+            }
+            
+            
+            // TODO: Introspection should not be hardcoded!
+/*            String name = new org.wyona.commons.io.Path(getPath()).getName();
+            String parent = new org.wyona.commons.io.Path(getPath()).getParent().toString();
+            String nameWithoutSuffix = name;
+            int lastIndex = name.lastIndexOf(".");
+            if (lastIndex > 0) nameWithoutSuffix = name.substring(0, lastIndex);
+            String introspectionPath = parent + "/introspection-" + nameWithoutSuffix + ".xml";
+
+            org.wyona.yanel.core.util.YarepUtil.addNodes(repo, introspectionPath, org.wyona.yarep.core.NodeType.RESOURCE);
+            writer = new java.io.OutputStreamWriter(repo.getNode(introspectionPath).getOutputStream());
+            writer.write(getIntrospection(name));
+            writer.close();*/
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
     }
 
     /**
      *
      */
     public java.util.HashMap createRTIProperties(HttpServletRequest request) {
-        log.warn("No implemented yet!");
-        return null;
+        java.util.HashMap map = new java.util.HashMap();
+        String mimeType = request.getParameter("rp.mime-type");
+        if (mimeType == null) {
+            mimeType = this.uploadMimeType;
+        }
+        map.put("mime-type", mimeType);
+        map.put("encoding", request.getParameter("rp.encoding"));
+        return map;
     }
 
     /**
@@ -393,9 +395,67 @@
         return buf.toString();
     }
 
+
     /**
      *
      */
+    public String getMimeTypeBySuffix(String suffix) {
+        // TODO: use MimeTypeUtil 
+        if (suffix.equals("html")) {
+            return "text/html";
+        } else if (suffix.equals("htm")) {
+            return "text/html";
+        } else if (suffix.equals("xhtml")) {
+            return "application/xhtml+xml";
+        } else if (suffix.equals("xml")) {
+            return "application/xml";
+        } else if (suffix.equals("css")) {
+            return "text/css";
+        } else if (suffix.equals("js")) {
+            return "application/x-javascript";
+        } else if (suffix.equals("png")) {
+            return "image/png";
+        } else if (suffix.equals("jpg")) {
+            return "image/jpeg";
+        } else if (suffix.equals("gif")) {
+            return "image/gif";
+        } else if (suffix.equals("pdf")) {
+            return "application/pdf";
+        } else if (suffix.equals("doc")) {
+            return "application/msword";
+        } else if (suffix.equals("odt")) {
+            return "application/vnd.oasis.opendocument.text";
+        } else if (suffix.equals("sxc")) {
+            return "application/vnd.sun.xml.calc";
+        } else if (suffix.equals("xpi")) {
+            return "application/x-xpinstall";
+        } else if (suffix.equals("zip")) {
+            return "application/zip";
+        } else if (suffix.equals("jar")) { // http://en.wikipedia.org/wiki/Jar_(file_format)
+            return "application/java-archive";
+        } else if (suffix.equals("war")) {
+            return "application/java-archive";
+        } else if (suffix.equals("flv")) {
+            return "video/x-flv";
+        } else if (suffix.equals("swf")) {
+            return "application/x-shockwave-flash";
+        } else if (suffix.equals("txt")) {
+            return "text/plain";
+        } else if (suffix.equals("mov")) {
+            return "video/quicktime";
+        } else if (suffix.equals("svg")) {
+            return "image/svg+xml";
+        } else if (suffix.equals("ico")) {
+            return "image/x-icon";
+        } else {
+            log.warn("Could not determine mime-type from suffix (suffix: " + suffix + ")!");
+            return "application/octet-stream";
+        }
+    }
+    
+    /**
+     *
+     */
     public String getWorkflowIntrospection() throws WorkflowException {
         return WorkflowHelper.getWorkflowIntrospection(this);
     }

Modified: public/yanel/trunk/src/webapp/WEB-INF/web.xml
===================================================================
--- public/yanel/trunk/src/webapp/WEB-INF/web.xml	2007-09-13 14:44:07 UTC (rev 27333)
+++ public/yanel/trunk/src/webapp/WEB-INF/web.xml	2007-09-13 14:50:42 UTC (rev 27334)
@@ -45,4 +45,14 @@
     <url-pattern>/servlet/Yanel</url-pattern>
     -->
   </servlet-mapping>
+  
+  <filter>
+    <filter-name>YanelFilter</filter-name>
+    <filter-class>org.wyona.yanel.servlet.communication.YanelFilter</filter-class>
+  </filter>
+  <filter-mapping>
+    <filter-name>YanelFilter</filter-name>
+    <servlet-name>YanelServlet</servlet-name>
+  </filter-mapping>
+  
 </web-app>

Modified: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java	2007-09-13 14:44:07 UTC (rev 27333)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java	2007-09-13 14:50:42 UTC (rev 27334)
@@ -806,7 +806,7 @@
         try {
             Realm realm = map.getRealm(request.getServletPath());
             String path = map.getPath(realm, request.getServletPath());
-            HttpRequest httpRequest = new HttpRequest(request);
+            HttpRequest httpRequest = (HttpRequest)request;
             HttpResponse httpResponse = new HttpResponse(response);
             Resource res = yanel.getResourceManager().getResource(getEnvironment(httpRequest, httpResponse), realm, path);
             

Modified: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/communication/HttpRequest.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/communication/HttpRequest.java	2007-09-13 14:44:07 UTC (rev 27333)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/communication/HttpRequest.java	2007-09-13 14:50:42 UTC (rev 27334)
@@ -16,37 +16,96 @@
 
 package org.wyona.yanel.servlet.communication;
 
+import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
 
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
 
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.log4j.Category;
+
 /**
  * This class wraps a HttpServlerRequest and does parameter decoding.
- * 
- * TODO: implement getParameterValues() and getParameterMap()
+ * Further it handles multipart requests for file upload. 
  */
 public class HttpRequest extends HttpServletRequestWrapper {
+    
+    private static Category log = Category.getInstance(HttpRequest.class);
+    
     public static String form_encoding = "UTF-8";
     public static String container_encoding = "ISO-8859-1";
     
-    public HttpRequest(HttpServletRequest request) {
+    protected List items;
+    
+    
+    public HttpRequest(HttpServletRequest request) throws ServletException {
         super(request);
+        if (isMultipartRequest()){
+            try {
+                DiskFileItemFactory factory = new DiskFileItemFactory();
+
+                // Set factory constraints
+                factory.setSizeThreshold(64000);
+                factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
+                //Create a new file upload handler
+                ServletFileUpload upload = new ServletFileUpload(factory);
+                 
+                //Parse the request
+                items = upload.parseRequest(request);
+                            
+            } catch (FileUploadException e) {
+                log.error(e.getMessage(), e);
+                throw new ServletException(e.getMessage(), e);
+            }
+        }
     }
-    
+
+    /**
+     * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
+     */
     public String getParameter(String name) {
         String value = super.getParameter(name);
-        if (form_encoding == null || container_encoding == null || value == null) {
-            return value;
+        if(!isMultipartRequest()) {
+            return fixEncoding(value);
+        } else {
+            Iterator iter = this.items.iterator();
+            while (iter.hasNext()) {
+                FileItem item = (FileItem)iter.next();
+                if (item.getFieldName().equals(name) && item.isFormField()) {
+                    return item.getString(); // TODO: fix encoding ?
+                }
+            }
+            return null;
         }
+    }
+    
+    private String fixEncoding(String str) {
+        if (form_encoding == null || container_encoding == null || str == null) {
+            return str;
+        }
         // Form and container encoding are equal, skip expensive value decoding
         if (container_encoding.equals(form_encoding)) {
-            return value;
+            return str;
         }
-        return decode(value);
+        return decode(str);
     }
 
-    private static String decode(String str) {
+    private String decode(String str) {
         if (str == null) return null;
         try {
             if (container_encoding == null)
@@ -57,4 +116,153 @@
             throw new RuntimeException("Unsupported Encoding Exception", uee);
         }
     }
+    
+    /**
+     * Not really implemented yet.
+     * @see javax.servlet.ServletRequestWrapper#getParameterMap()
+     */
+    public Map getParameterMap() {
+        if(!isMultipartRequest()) {
+            return super.getParameterMap();
+        } else {
+            Map map = new HashMap();
+            Iterator iter = this.items.iterator();
+            while (iter.hasNext()) {
+                FileItem item = (FileItem)iter.next();
+                if (item.isFormField()) {
+                    map.put(item.getFieldName(), item.getString()); // TODO: fix encoding
+                    // TODO: fix multiple parameters for one name -> create array
+                } else {
+                    // TODO
+                }
+            }
+            return map;
+        }        
+    }
+    
+    /**
+     * @see javax.servlet.ServletRequestWrapper#getParameterNames()
+     */
+    public Enumeration getParameterNames() {
+        if(!isMultipartRequest()) {
+            return super.getParameterNames();
+        } else {
+            // use a set to avoid duplicate entries
+            HashSet set = new HashSet();
+            Iterator iter = this.items.iterator();
+            while (iter.hasNext()) {
+                FileItem item = (FileItem)iter.next();
+                set.add(item.getFieldName());
+            }
+            return new Vector(set).elements();
+        }
+    }
+    
+    /**
+     * @see javax.servlet.ServletRequestWrapper#getParameterValues(java.lang.String)
+     */
+    public String[] getParameterValues(String name) {
+        if(!isMultipartRequest()) {
+            return super.getParameterValues(name);
+        } else {
+            ArrayList values = new ArrayList();
+            Iterator iter = this.items.iterator();
+            while (iter.hasNext()) {
+                FileItem item = (FileItem)iter.next();
+                if (item.getFieldName().equals(name)) {
+                    values.add(item.getString()); // TODO: fix encoding ?
+                }
+            }
+            return (String[]) values.toArray(new String[values.size()]);
+        }
+    }
+    
+    public boolean isMultipartRequest() {
+        return ServletFileUpload.isMultipartContent((HttpServletRequest) this.getRequest());
+    }
+
+    // methods for multipart requests
+    
+    /**
+     * Gets the field names of all file upload fields.
+     * @return enumeration of field names
+     */
+    public Enumeration getFileNames() {
+        if(!isMultipartRequest()) {
+            return null;
+        } else {
+            Vector parameterNames = new Vector(); 
+            Iterator iter = this.items.iterator();
+            while (iter.hasNext()) {
+                FileItem item = (FileItem)iter.next();
+                if (!item.isFormField()) {
+                    parameterNames.addElement(item.getFieldName());
+                }
+            }
+            return parameterNames.elements();
+        }
+    }
+    
+    /**
+     * Gets the filename of the uploaded file on the clients computer.
+     * @param name
+     * @return filename
+     */
+    public String getFilesystemName(String name) {
+        if(!isMultipartRequest()) {
+            return null;
+        } else {
+            Iterator iter = this.items.iterator();
+            while (iter.hasNext()) {
+                FileItem item = (FileItem)iter.next();
+                if (item.getFieldName().equals(name)) {
+                    return item.getName();
+                }
+            }
+            return null;
+        }
+    }
+    
+    /**
+     * Gets the content-type of the uploaded file.
+     * @param name
+     * @return content-type
+     */
+    public String getContentType(String name) {
+        if(!isMultipartRequest()) {
+            return null;
+        } else {
+            Iterator iter = this.items.iterator();
+            while (iter.hasNext()) {
+                FileItem item = (FileItem)iter.next();
+                if (item.getFieldName().equals(name)) {
+                    return item.getContentType();
+                }
+            }
+            return null;
+        }
+    
+    }
+    
+    /**
+     * Gets an input stream of the uploaded file
+     * @param name
+     * @return input stream
+     * @throws IOException
+     */
+    public InputStream getInputStream(String name) throws IOException {
+        if(!isMultipartRequest()) {
+            return null;
+        } else {
+            Iterator iter = this.items.iterator();
+            while (iter.hasNext()) {
+                FileItem item = (FileItem)iter.next();
+                if (item.getFieldName().equals(name)) {
+                    return item.getInputStream();
+                }
+            }
+            return null;
+        }
+    }    
 }
+

Added: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/communication/YanelFilter.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/communication/YanelFilter.java	                        (rev 0)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/communication/YanelFilter.java	2007-09-13 14:50:42 UTC (rev 27334)
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2006 Wyona
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.wyona.org/licenses/APACHE-LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.wyona.yanel.servlet.communication;
+
+import java.io.IOException;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+
+public class YanelFilter implements Filter {
+    private FilterConfig filterConfig;
+
+    public void init(FilterConfig filterConfig) throws ServletException {
+        this.filterConfig = filterConfig;
+    }
+
+    public void destroy() {
+        this.filterConfig = null;
+    }
+
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+            throws IOException, ServletException {
+        chain.doFilter(new HttpRequest((HttpServletRequest) request), response);
+    }
+}


Property changes on: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/communication/YanelFilter.java
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Yanel-commits mailing list