You are viewing a plain text version of this content. The canonical link for it is here.
Posted to graffito-commits@incubator.apache.org by cl...@apache.org on 2006/09/20 19:37:21 UTC

svn commit: r448311 [7/25] - in /incubator/graffito/trunk: ./ api/ api/src/java/org/apache/portals/graffito/context/ api/src/java/org/apache/portals/graffito/exception/ api/src/java/org/apache/portals/graffito/services/core/ api/src/java/org/apache/por...

Modified: incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/upload/PortletFileUploadBase.java
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/upload/PortletFileUploadBase.java?view=diff&rev=448311&r1=448310&r2=448311
==============================================================================
--- incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/upload/PortletFileUploadBase.java (original)
+++ incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/upload/PortletFileUploadBase.java Wed Sep 20 12:37:05 2006
@@ -1,705 +1,705 @@
-/*
- * Copyright 2000-2004 The Apache Software Foundation.
- * 
- * 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.apache.org/licenses/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.apache.portals.graffito.portlets.upload;
-
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import javax.portlet.ActionRequest;
-
-import org.apache.commons.fileupload.FileItem;
-import org.apache.commons.fileupload.FileItemFactory;
-import org.apache.commons.fileupload.FileUploadException;
-import org.apache.commons.fileupload.MultipartStream;
-
-
-
-/**
- * <p>High level API for processing file uploads.</p>
- *
- * <p>This class handles multiple files per single HTML widget, sent using
- * <code>multipart/mixed</code> encoding type, as specified by
- * <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>.  Use {@link
- * #parseRequest(HttpServletRequest)} to acquire a list of {@link
- * org.apache.commons.fileupload.FileItem}s associated with a given HTML
- * widget.</p>
- *
- * <p>How the data for individual parts is stored is determined by the factory
- * used to create them; a given part may be in memory, on disk, or somewhere
- * else.</p>
- *
- * @author <a href="mailto:Rafal.Krzewski@e-point.pl">Rafal Krzewski</a>
- * @author <a href="mailto:dlr@collab.net">Daniel Rall</a>
- * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
- * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
- * @author <a href="mailto:martinc@apache.org">Martin Cooper</a>
- * @author <a href="mailto:christophe.lombart@sword-technologies.com">Christophe Lombart</a>
- * @author Sean C. Sullivan
- *
- * @version $Id:  Exp $
- */
-public abstract class PortletFileUploadBase
-{
-
-
-    /**
-     * Utility method that determines whether the request contains multipart
-     * content.
-     *
-     * @param req The servlet request to be evaluated. Must be non-null.
-     *
-     * @return <code>true</code> if the request is multipart;
-     *         <code>false</code> otherwise.
-     */
-    public static final boolean isMultipartContent(ActionRequest req)
-    {
-        String contentType = req.getContentType();
-        if (contentType == null)
-        {
-            return false;
-        }
-        if (contentType.startsWith(MULTIPART))
-        {
-            return true;
-        }
-        return false;
-    }
-
-
-    // ----------------------------------------------------- Manifest constants
-
-
-    /**
-     * HTTP content type header name.
-     */
-    public static final String CONTENT_TYPE = "Content-type";
-
-
-    /**
-     * HTTP content disposition header name.
-     */
-    public static final String CONTENT_DISPOSITION = "Content-disposition";
-
-
-    /**
-     * Content-disposition value for form data.
-     */
-    public static final String FORM_DATA = "form-data";
-
-
-    /**
-     * Content-disposition value for file attachment.
-     */
-    public static final String ATTACHMENT = "attachment";
-
-
-    /**
-     * Part of HTTP content type header.
-     */
-    public static final String MULTIPART = "multipart/";
-
-
-    /**
-     * HTTP content type header for multipart forms.
-     */
-    public static final String MULTIPART_FORM_DATA = "multipart/form-data";
-
-
-    /**
-     * HTTP content type header for multiple uploads.
-     */
-    public static final String MULTIPART_MIXED = "multipart/mixed";
-
-
-    /**
-     * The maximum length of a single header line that will be parsed
-     * (1024 bytes).
-     */
-    public static final int MAX_HEADER_SIZE = 1024;
-
-
-    // ----------------------------------------------------------- Data members
-
-
-    /**
-     * The maximum size permitted for an uploaded file. A value of -1 indicates
-     * no maximum.
-     */
-    private long sizeMax = -1;
-
-
-    /**
-     * The content encoding to use when reading part headers.
-     */
-    private String headerEncoding;
-
-    
-    /**
-     * FileItem found in the multipart data form
-     */
-    private List fileItems;
-
-    // ----------------------------------------------------- Property accessors
-
-
-    /**
-     * Returns the factory class used when creating file items.
-     *
-     * @return The factory class for new file items.
-     */
-    public abstract FileItemFactory getFileItemFactory();
-
-
-    /**
-     * Sets the factory class to use when creating file items.
-     *
-     * @param factory The factory class for new file items.
-     */
-    public abstract void setFileItemFactory(FileItemFactory factory);
-
-
-    /**
-     * Returns the maximum allowed upload size.
-     *
-     * @return The maximum allowed size, in bytes.
-     *
-     * @see #setSizeMax(long)
-     *
-     */
-    public long getSizeMax()
-    {
-        return sizeMax;
-    }
-
-
-    /**
-     * Sets the maximum allowed upload size. If negative, there is no maximum.
-     *
-     * @param sizeMax The maximum allowed size, in bytes, or -1 for no maximum.
-     *
-     * @see #getSizeMax()
-     *
-     */
-    public void setSizeMax(long sizeMax)
-    {
-        this.sizeMax = sizeMax;
-    }
-
-
-    /**
-     * Retrieves the character encoding used when reading the headers of an
-     * individual part. When not specified, or <code>null</code>, the platform
-     * default encoding is used.
-     *
-     * @return The encoding used to read part headers.
-     */
-    public String getHeaderEncoding()
-    {
-        return headerEncoding;
-    }
-
-
-    /**
-     * Specifies the character encoding to be used when reading the headers of
-     * individual parts. When not specified, or <code>null</code>, the platform
-     * default encoding is used.
-     *
-     * @param encoding The encoding used to read part headers.
-     */
-    public void setHeaderEncoding(String encoding)
-    {
-        headerEncoding = encoding;
-    }
-
-
-    // --------------------------------------------------------- Public methods
-
-
-    /**
-     * Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
-     * compliant <code>multipart/form-data</code> stream. If files are stored
-     * on disk, the path is given by <code>getRepository()</code>.
-     *
-     * @param req The servlet request to be parsed.
-     *
-     * @return A list of <code>FileItem</code> instances parsed from the
-     *         request, in the order that they were transmitted.
-     *
-     * @exception FileUploadException if there are problems reading/parsing
-     *                                the request or storing files.
-     */
-    public List parseRequest(ActionRequest req) throws FileUploadException
-    {
-        if (null == req)
-        {
-            throw new NullPointerException("req parameter");
-        }
-
-        ArrayList items = new ArrayList();
-        String contentType = req.getContentType();
-
-        if ((null == contentType) || (!contentType.startsWith(MULTIPART)))
-        {
-            throw new InvalidContentTypeException(
-                "the request doesn't contain a "
-                + MULTIPART_FORM_DATA
-                + " or "
-                + MULTIPART_MIXED
-                + " stream, content type header is "
-                + contentType);
-        }
-        int requestSize = req.getContentLength();
-
-        if (requestSize == -1)
-        {
-            throw new UnknownSizeException(
-                "the request was rejected because it's size is unknown");
-        }
-
-        if (sizeMax >= 0 && requestSize > sizeMax)
-        {
-            throw new SizeLimitExceededException(
-                "the request was rejected because "
-                + "it's size exceeds allowed range");
-        }
-
-        try
-        {
-            int boundaryIndex = contentType.indexOf("boundary=");
-            if (boundaryIndex < 0)
-            {
-                throw new FileUploadException(
-                        "the request was rejected because "
-                        + "no multipart boundary was found");
-            }
-            byte[] boundary = contentType.substring(
-                    boundaryIndex + 9).getBytes();
-
-            InputStream input = req.getPortletInputStream();
-
-            MultipartStream multi = new MultipartStream(input, boundary);
-            multi.setHeaderEncoding(headerEncoding);
-
-            boolean nextPart = multi.skipPreamble();
-            while (nextPart)
-            {
-                Map headers = parseHeaders(multi.readHeaders());
-                String fieldName = getFieldName(headers);
-                if (fieldName != null)
-                {
-                    String subContentType = getHeader(headers, CONTENT_TYPE);
-                    if (subContentType != null && subContentType
-                                                .startsWith(MULTIPART_MIXED))
-                    {
-                        // Multiple files.
-                        byte[] subBoundary =
-                            subContentType.substring(
-                                subContentType
-                                .indexOf("boundary=") + 9).getBytes();
-                        multi.setBoundary(subBoundary);
-                        boolean nextSubPart = multi.skipPreamble();
-                        while (nextSubPart)
-                        {
-                            headers = parseHeaders(multi.readHeaders());
-                            if (getFileName(headers) != null)
-                            {
-                                FileItem item =
-                                        createItem(headers, false);
-                                OutputStream os = item.getOutputStream();
-                                try
-                                {
-                                    multi.readBodyData(os);
-                                }
-                                finally
-                                {
-                                    os.close();
-                                }
-                                items.add(item);
-                            }
-                            else
-                            {
-                                // Ignore anything but files inside
-                                // multipart/mixed.
-                                multi.discardBodyData();
-                            }
-                            nextSubPart = multi.readBoundary();
-                        }
-                        multi.setBoundary(boundary);
-                    }
-                    else
-                    {
-                        if (getFileName(headers) != null)
-                        {
-                            // A single file.
-                            FileItem item = createItem(headers, false);
-                            OutputStream os = item.getOutputStream();
-                            try
-                            {
-                                multi.readBodyData(os);
-                            }
-                            finally
-                            {
-                                os.close();
-                            }
-                            items.add(item);
-                        }
-                        else
-                        {
-                            // A form field.
-                            FileItem item = createItem(headers, true);
-                            OutputStream os = item.getOutputStream();
-                            try
-                            {
-                                multi.readBodyData(os);
-                            }
-                            finally
-                            {
-                                os.close();
-                            }
-                            items.add(item);
-                        }
-                    }
-                }
-                else
-                {
-                    // Skip this part.
-                    multi.discardBodyData();
-                }
-                nextPart = multi.readBoundary();
-            }
-        }
-        catch (IOException e)
-        {
-            throw new FileUploadException(
-                "Processing of " + MULTIPART_FORM_DATA
-                    + " request failed. " + e.getMessage());
-        }
-
-        return items;
-    }
-
-    
-    /**
-     * Check if a field name is defined in the multipart form
-     * 
-     * @param request The portlet request
-     * @param fieldName The field name to check
-     * @return true if the field name is present 
-     */
-    public boolean hasFieldName(ActionRequest request, String fieldName)
-    {
-        try 
-        {
-            if (fileItems == null)
-            {    
-                fileItems = this.parseRequest(request);
-            }
-            
-            for (int i = 0; i<fileItems.size(); i++)
-            {
-                if (((FileItem)fileItems.get(i)).getFieldName().equals(fieldName))
-                {
-                    return true;
-                }
-            }
-            return false;
-        }
-        catch(Exception e)
-        {
-            return false;
-        }
-    }
-    
-    public FileItem getFileItem(ActionRequest request, String fileItemName) throws FileUploadException
-    {
-        
-        if (fileItems == null)
-        {    
-            fileItems = this.parseRequest(request);
-        }
-           
-        for (int i = 0; i<fileItems.size(); i++)
-        {
-            FileItem fileItem = (FileItem)fileItems.get(i);
-            if (fileItem.getFieldName().equals(fileItemName))
-            {
-                return fileItem;
-            }
-        }
-        
-        return null;
-    }
-    
-    public List getFileItems(ActionRequest request) throws FileUploadException
-    {
-        if (fileItems == null)
-        {    
-            fileItems = this.parseRequest(request);
-        }
-        return fileItems;
-    }
-    
-    // ------------------------------------------------------ Protected methods
-
-
-    /**
-     * Retrieves the file name from the <code>Content-disposition</code>
-     * header.
-     *
-     * @param headers A <code>Map</code> containing the HTTP request headers.
-     *
-     * @return The file name for the current <code>encapsulation</code>.
-     */
-    protected String getFileName(Map headers)
-    {
-        String fileName = null;
-        String cd = getHeader(headers, CONTENT_DISPOSITION);
-        if (cd.startsWith(FORM_DATA) || cd.startsWith(ATTACHMENT))
-        {
-            int start = cd.indexOf("filename=\"");
-            int end = cd.indexOf('"', start + 10);
-            if (start != -1 && end != -1)
-            {
-                fileName = cd.substring(start + 10, end).trim();
-            }
-        }
-        return fileName;
-    }
-
-
-    /**
-     * Retrieves the field name from the <code>Content-disposition</code>
-     * header.
-     *
-     * @param headers A <code>Map</code> containing the HTTP request headers.
-     *
-     * @return The field name for the current <code>encapsulation</code>.
-     */
-    protected String getFieldName(Map headers)
-    {
-        String fieldName = null;
-        String cd = getHeader(headers, CONTENT_DISPOSITION);
-        if (cd != null && cd.startsWith(FORM_DATA))
-        {
-            int start = cd.indexOf("name=\"");
-            int end = cd.indexOf('"', start + 6);
-            if (start != -1 && end != -1)
-            {
-                fieldName = cd.substring(start + 6, end);
-            }
-        }
-        return fieldName;
-    }
-
-
-    /**
-     * Creates a new {@link FileItem} instance.
-     *
-     * @param headers       A <code>Map</code> containing the HTTP request
-     *                      headers.
-     * @param isFormField   Whether or not this item is a form field, as
-     *                      opposed to a file.
-     *
-     * @return A newly created <code>FileItem</code> instance.
-     *
-     * @exception FileUploadException if an error occurs.
-     */
-    protected FileItem createItem(Map headers, boolean isFormField)
-        throws FileUploadException
-    {
-        return getFileItemFactory().createItem(getFieldName(headers),
-                getHeader(headers, CONTENT_TYPE),
-                isFormField,
-                getFileName(headers));
-    }
-
-
-    /**
-     * <p> Parses the <code>header-part</code> and returns as key/value
-     * pairs.
-     *
-     * <p> If there are multiple headers of the same names, the name
-     * will map to a comma-separated list containing the values.
-     *
-     * @param headerPart The <code>header-part</code> of the current
-     *                   <code>encapsulation</code>.
-     *
-     * @return A <code>Map</code> containing the parsed HTTP request headers.
-     */
-    protected Map parseHeaders(String headerPart)
-    {
-        Map headers = new HashMap();
-        char buffer[] = new char[MAX_HEADER_SIZE];
-        boolean done = false;
-        int j = 0;
-        int i;
-        String header, headerName, headerValue;
-        try
-        {
-            while (!done)
-            {
-                i = 0;
-                // Copy a single line of characters into the buffer,
-                // omitting trailing CRLF.
-                while (i < 2 || buffer[i - 2] != '\r' || buffer[i - 1] != '\n')
-                {
-                    buffer[i++] = headerPart.charAt(j++);
-                }
-                header = new String(buffer, 0, i - 2);
-                if (header.equals(""))
-                {
-                    done = true;
-                }
-                else
-                {
-                    if (header.indexOf(':') == -1)
-                    {
-                        // This header line is malformed, skip it.
-                        continue;
-                    }
-                    headerName = header.substring(0, header.indexOf(':'))
-                        .trim().toLowerCase();
-                    headerValue =
-                        header.substring(header.indexOf(':') + 1).trim();
-                    if (getHeader(headers, headerName) != null)
-                    {
-                        // More that one heder of that name exists,
-                        // append to the list.
-                        headers.put(headerName,
-                                    getHeader(headers, headerName) + ','
-                                        + headerValue);
-                    }
-                    else
-                    {
-                        headers.put(headerName, headerValue);
-                    }
-                }
-            }
-        }
-        catch (IndexOutOfBoundsException e)
-        {
-            // Headers were malformed. continue with all that was
-            // parsed.
-        }
-        return headers;
-    }
-
-
-    /**
-     * Returns the header with the specified name from the supplied map. The
-     * header lookup is case-insensitive.
-     *
-     * @param headers A <code>Map</code> containing the HTTP request headers.
-     * @param name    The name of the header to return.
-     *
-     * @return The value of specified header, or a comma-separated list if
-     *         there were multiple headers of that name.
-     */
-    protected final String getHeader(Map headers,
-                                     String name)
-    {
-        return (String) headers.get(name.toLowerCase());
-    }
-
-
-    /**
-     * Thrown to indicate that the request is not a multipart request.
-     */
-    public static class InvalidContentTypeException
-        extends FileUploadException
-    {
-        /**
-         * Constructs a <code>InvalidContentTypeException</code> with no
-         * detail message.
-         */
-        public InvalidContentTypeException()
-        {
-            super();
-        }
-
-        /**
-         * Constructs an <code>InvalidContentTypeException</code> with
-         * the specified detail message.
-         *
-         * @param message The detail message.
-         */
-        public InvalidContentTypeException(String message)
-        {
-            super(message);
-        }
-    }
-
-
-    /**
-     * Thrown to indicate that the request size is not specified.
-     */
-    public static class UnknownSizeException
-        extends FileUploadException
-    {
-        /**
-         * Constructs a <code>UnknownSizeException</code> with no
-         * detail message.
-         */
-        public UnknownSizeException()
-        {
-            super();
-        }
-
-        /**
-         * Constructs an <code>UnknownSizeException</code> with
-         * the specified detail message.
-         *
-         * @param message The detail message.
-         */
-        public UnknownSizeException(String message)
-        {
-            super(message);
-        }
-    }
-
-
-    /**
-     * Thrown to indicate that the request size exceeds the configured maximum.
-     */
-    public static class SizeLimitExceededException
-        extends FileUploadException
-    {
-        /**
-         * Constructs a <code>SizeExceededException</code> with no
-         * detail message.
-         */
-        public SizeLimitExceededException()
-        {
-            super();
-        }
-
-        /**
-         * Constructs an <code>SizeExceededException</code> with
-         * the specified detail message.
-         *
-         * @param message The detail message.
-         */
-        public SizeLimitExceededException(String message)
-        {
-            super(message);
-        }
-    }
-
-}
+/*
+ * Copyright 2000-2004 The Apache Software Foundation.
+ * 
+ * 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.apache.org/licenses/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.apache.portals.graffito.portlets.upload;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.portlet.ActionRequest;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.MultipartStream;
+
+
+
+/**
+ * <p>High level API for processing file uploads.</p>
+ *
+ * <p>This class handles multiple files per single HTML widget, sent using
+ * <code>multipart/mixed</code> encoding type, as specified by
+ * <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>.  Use {@link
+ * #parseRequest(HttpServletRequest)} to acquire a list of {@link
+ * org.apache.commons.fileupload.FileItem}s associated with a given HTML
+ * widget.</p>
+ *
+ * <p>How the data for individual parts is stored is determined by the factory
+ * used to create them; a given part may be in memory, on disk, or somewhere
+ * else.</p>
+ *
+ * @author <a href="mailto:Rafal.Krzewski@e-point.pl">Rafal Krzewski</a>
+ * @author <a href="mailto:dlr@collab.net">Daniel Rall</a>
+ * @author <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
+ * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
+ * @author <a href="mailto:martinc@apache.org">Martin Cooper</a>
+ * @author <a href="mailto:christophe.lombart@sword-technologies.com">Christophe Lombart</a>
+ * @author Sean C. Sullivan
+ *
+ * @version $Id:  Exp $
+ */
+public abstract class PortletFileUploadBase
+{
+
+
+    /**
+     * Utility method that determines whether the request contains multipart
+     * content.
+     *
+     * @param req The servlet request to be evaluated. Must be non-null.
+     *
+     * @return <code>true</code> if the request is multipart;
+     *         <code>false</code> otherwise.
+     */
+    public static final boolean isMultipartContent(ActionRequest req)
+    {
+        String contentType = req.getContentType();
+        if (contentType == null)
+        {
+            return false;
+        }
+        if (contentType.startsWith(MULTIPART))
+        {
+            return true;
+        }
+        return false;
+    }
+
+
+    // ----------------------------------------------------- Manifest constants
+
+
+    /**
+     * HTTP content type header name.
+     */
+    public static final String CONTENT_TYPE = "Content-type";
+
+
+    /**
+     * HTTP content disposition header name.
+     */
+    public static final String CONTENT_DISPOSITION = "Content-disposition";
+
+
+    /**
+     * Content-disposition value for form data.
+     */
+    public static final String FORM_DATA = "form-data";
+
+
+    /**
+     * Content-disposition value for file attachment.
+     */
+    public static final String ATTACHMENT = "attachment";
+
+
+    /**
+     * Part of HTTP content type header.
+     */
+    public static final String MULTIPART = "multipart/";
+
+
+    /**
+     * HTTP content type header for multipart forms.
+     */
+    public static final String MULTIPART_FORM_DATA = "multipart/form-data";
+
+
+    /**
+     * HTTP content type header for multiple uploads.
+     */
+    public static final String MULTIPART_MIXED = "multipart/mixed";
+
+
+    /**
+     * The maximum length of a single header line that will be parsed
+     * (1024 bytes).
+     */
+    public static final int MAX_HEADER_SIZE = 1024;
+
+
+    // ----------------------------------------------------------- Data members
+
+
+    /**
+     * The maximum size permitted for an uploaded file. A value of -1 indicates
+     * no maximum.
+     */
+    private long sizeMax = -1;
+
+
+    /**
+     * The content encoding to use when reading part headers.
+     */
+    private String headerEncoding;
+
+    
+    /**
+     * FileItem found in the multipart data form
+     */
+    private List fileItems;
+
+    // ----------------------------------------------------- Property accessors
+
+
+    /**
+     * Returns the factory class used when creating file items.
+     *
+     * @return The factory class for new file items.
+     */
+    public abstract FileItemFactory getFileItemFactory();
+
+
+    /**
+     * Sets the factory class to use when creating file items.
+     *
+     * @param factory The factory class for new file items.
+     */
+    public abstract void setFileItemFactory(FileItemFactory factory);
+
+
+    /**
+     * Returns the maximum allowed upload size.
+     *
+     * @return The maximum allowed size, in bytes.
+     *
+     * @see #setSizeMax(long)
+     *
+     */
+    public long getSizeMax()
+    {
+        return sizeMax;
+    }
+
+
+    /**
+     * Sets the maximum allowed upload size. If negative, there is no maximum.
+     *
+     * @param sizeMax The maximum allowed size, in bytes, or -1 for no maximum.
+     *
+     * @see #getSizeMax()
+     *
+     */
+    public void setSizeMax(long sizeMax)
+    {
+        this.sizeMax = sizeMax;
+    }
+
+
+    /**
+     * Retrieves the character encoding used when reading the headers of an
+     * individual part. When not specified, or <code>null</code>, the platform
+     * default encoding is used.
+     *
+     * @return The encoding used to read part headers.
+     */
+    public String getHeaderEncoding()
+    {
+        return headerEncoding;
+    }
+
+
+    /**
+     * Specifies the character encoding to be used when reading the headers of
+     * individual parts. When not specified, or <code>null</code>, the platform
+     * default encoding is used.
+     *
+     * @param encoding The encoding used to read part headers.
+     */
+    public void setHeaderEncoding(String encoding)
+    {
+        headerEncoding = encoding;
+    }
+
+
+    // --------------------------------------------------------- Public methods
+
+
+    /**
+     * Processes an <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>
+     * compliant <code>multipart/form-data</code> stream. If files are stored
+     * on disk, the path is given by <code>getRepository()</code>.
+     *
+     * @param req The servlet request to be parsed.
+     *
+     * @return A list of <code>FileItem</code> instances parsed from the
+     *         request, in the order that they were transmitted.
+     *
+     * @exception FileUploadException if there are problems reading/parsing
+     *                                the request or storing files.
+     */
+    public List parseRequest(ActionRequest req) throws FileUploadException
+    {
+        if (null == req)
+        {
+            throw new NullPointerException("req parameter");
+        }
+
+        ArrayList items = new ArrayList();
+        String contentType = req.getContentType();
+
+        if ((null == contentType) || (!contentType.startsWith(MULTIPART)))
+        {
+            throw new InvalidContentTypeException(
+                "the request doesn't contain a "
+                + MULTIPART_FORM_DATA
+                + " or "
+                + MULTIPART_MIXED
+                + " stream, content type header is "
+                + contentType);
+        }
+        int requestSize = req.getContentLength();
+
+        if (requestSize == -1)
+        {
+            throw new UnknownSizeException(
+                "the request was rejected because it's size is unknown");
+        }
+
+        if (sizeMax >= 0 && requestSize > sizeMax)
+        {
+            throw new SizeLimitExceededException(
+                "the request was rejected because "
+                + "it's size exceeds allowed range");
+        }
+
+        try
+        {
+            int boundaryIndex = contentType.indexOf("boundary=");
+            if (boundaryIndex < 0)
+            {
+                throw new FileUploadException(
+                        "the request was rejected because "
+                        + "no multipart boundary was found");
+            }
+            byte[] boundary = contentType.substring(
+                    boundaryIndex + 9).getBytes();
+
+            InputStream input = req.getPortletInputStream();
+
+            MultipartStream multi = new MultipartStream(input, boundary);
+            multi.setHeaderEncoding(headerEncoding);
+
+            boolean nextPart = multi.skipPreamble();
+            while (nextPart)
+            {
+                Map headers = parseHeaders(multi.readHeaders());
+                String fieldName = getFieldName(headers);
+                if (fieldName != null)
+                {
+                    String subContentType = getHeader(headers, CONTENT_TYPE);
+                    if (subContentType != null && subContentType
+                                                .startsWith(MULTIPART_MIXED))
+                    {
+                        // Multiple files.
+                        byte[] subBoundary =
+                            subContentType.substring(
+                                subContentType
+                                .indexOf("boundary=") + 9).getBytes();
+                        multi.setBoundary(subBoundary);
+                        boolean nextSubPart = multi.skipPreamble();
+                        while (nextSubPart)
+                        {
+                            headers = parseHeaders(multi.readHeaders());
+                            if (getFileName(headers) != null)
+                            {
+                                FileItem item =
+                                        createItem(headers, false);
+                                OutputStream os = item.getOutputStream();
+                                try
+                                {
+                                    multi.readBodyData(os);
+                                }
+                                finally
+                                {
+                                    os.close();
+                                }
+                                items.add(item);
+                            }
+                            else
+                            {
+                                // Ignore anything but files inside
+                                // multipart/mixed.
+                                multi.discardBodyData();
+                            }
+                            nextSubPart = multi.readBoundary();
+                        }
+                        multi.setBoundary(boundary);
+                    }
+                    else
+                    {
+                        if (getFileName(headers) != null)
+                        {
+                            // A single file.
+                            FileItem item = createItem(headers, false);
+                            OutputStream os = item.getOutputStream();
+                            try
+                            {
+                                multi.readBodyData(os);
+                            }
+                            finally
+                            {
+                                os.close();
+                            }
+                            items.add(item);
+                        }
+                        else
+                        {
+                            // A form field.
+                            FileItem item = createItem(headers, true);
+                            OutputStream os = item.getOutputStream();
+                            try
+                            {
+                                multi.readBodyData(os);
+                            }
+                            finally
+                            {
+                                os.close();
+                            }
+                            items.add(item);
+                        }
+                    }
+                }
+                else
+                {
+                    // Skip this part.
+                    multi.discardBodyData();
+                }
+                nextPart = multi.readBoundary();
+            }
+        }
+        catch (IOException e)
+        {
+            throw new FileUploadException(
+                "Processing of " + MULTIPART_FORM_DATA
+                    + " request failed. " + e.getMessage());
+        }
+
+        return items;
+    }
+
+    
+    /**
+     * Check if a field name is defined in the multipart form
+     * 
+     * @param request The portlet request
+     * @param fieldName The field name to check
+     * @return true if the field name is present 
+     */
+    public boolean hasFieldName(ActionRequest request, String fieldName)
+    {
+        try 
+        {
+            if (fileItems == null)
+            {    
+                fileItems = this.parseRequest(request);
+            }
+            
+            for (int i = 0; i<fileItems.size(); i++)
+            {
+                if (((FileItem)fileItems.get(i)).getFieldName().equals(fieldName))
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+        catch(Exception e)
+        {
+            return false;
+        }
+    }
+    
+    public FileItem getFileItem(ActionRequest request, String fileItemName) throws FileUploadException
+    {
+        
+        if (fileItems == null)
+        {    
+            fileItems = this.parseRequest(request);
+        }
+           
+        for (int i = 0; i<fileItems.size(); i++)
+        {
+            FileItem fileItem = (FileItem)fileItems.get(i);
+            if (fileItem.getFieldName().equals(fileItemName))
+            {
+                return fileItem;
+            }
+        }
+        
+        return null;
+    }
+    
+    public List getFileItems(ActionRequest request) throws FileUploadException
+    {
+        if (fileItems == null)
+        {    
+            fileItems = this.parseRequest(request);
+        }
+        return fileItems;
+    }
+    
+    // ------------------------------------------------------ Protected methods
+
+
+    /**
+     * Retrieves the file name from the <code>Content-disposition</code>
+     * header.
+     *
+     * @param headers A <code>Map</code> containing the HTTP request headers.
+     *
+     * @return The file name for the current <code>encapsulation</code>.
+     */
+    protected String getFileName(Map headers)
+    {
+        String fileName = null;
+        String cd = getHeader(headers, CONTENT_DISPOSITION);
+        if (cd.startsWith(FORM_DATA) || cd.startsWith(ATTACHMENT))
+        {
+            int start = cd.indexOf("filename=\"");
+            int end = cd.indexOf('"', start + 10);
+            if (start != -1 && end != -1)
+            {
+                fileName = cd.substring(start + 10, end).trim();
+            }
+        }
+        return fileName;
+    }
+
+
+    /**
+     * Retrieves the field name from the <code>Content-disposition</code>
+     * header.
+     *
+     * @param headers A <code>Map</code> containing the HTTP request headers.
+     *
+     * @return The field name for the current <code>encapsulation</code>.
+     */
+    protected String getFieldName(Map headers)
+    {
+        String fieldName = null;
+        String cd = getHeader(headers, CONTENT_DISPOSITION);
+        if (cd != null && cd.startsWith(FORM_DATA))
+        {
+            int start = cd.indexOf("name=\"");
+            int end = cd.indexOf('"', start + 6);
+            if (start != -1 && end != -1)
+            {
+                fieldName = cd.substring(start + 6, end);
+            }
+        }
+        return fieldName;
+    }
+
+
+    /**
+     * Creates a new {@link FileItem} instance.
+     *
+     * @param headers       A <code>Map</code> containing the HTTP request
+     *                      headers.
+     * @param isFormField   Whether or not this item is a form field, as
+     *                      opposed to a file.
+     *
+     * @return A newly created <code>FileItem</code> instance.
+     *
+     * @exception FileUploadException if an error occurs.
+     */
+    protected FileItem createItem(Map headers, boolean isFormField)
+        throws FileUploadException
+    {
+        return getFileItemFactory().createItem(getFieldName(headers),
+                getHeader(headers, CONTENT_TYPE),
+                isFormField,
+                getFileName(headers));
+    }
+
+
+    /**
+     * <p> Parses the <code>header-part</code> and returns as key/value
+     * pairs.
+     *
+     * <p> If there are multiple headers of the same names, the name
+     * will map to a comma-separated list containing the values.
+     *
+     * @param headerPart The <code>header-part</code> of the current
+     *                   <code>encapsulation</code>.
+     *
+     * @return A <code>Map</code> containing the parsed HTTP request headers.
+     */
+    protected Map parseHeaders(String headerPart)
+    {
+        Map headers = new HashMap();
+        char buffer[] = new char[MAX_HEADER_SIZE];
+        boolean done = false;
+        int j = 0;
+        int i;
+        String header, headerName, headerValue;
+        try
+        {
+            while (!done)
+            {
+                i = 0;
+                // Copy a single line of characters into the buffer,
+                // omitting trailing CRLF.
+                while (i < 2 || buffer[i - 2] != '\r' || buffer[i - 1] != '\n')
+                {
+                    buffer[i++] = headerPart.charAt(j++);
+                }
+                header = new String(buffer, 0, i - 2);
+                if (header.equals(""))
+                {
+                    done = true;
+                }
+                else
+                {
+                    if (header.indexOf(':') == -1)
+                    {
+                        // This header line is malformed, skip it.
+                        continue;
+                    }
+                    headerName = header.substring(0, header.indexOf(':'))
+                        .trim().toLowerCase();
+                    headerValue =
+                        header.substring(header.indexOf(':') + 1).trim();
+                    if (getHeader(headers, headerName) != null)
+                    {
+                        // More that one heder of that name exists,
+                        // append to the list.
+                        headers.put(headerName,
+                                    getHeader(headers, headerName) + ','
+                                        + headerValue);
+                    }
+                    else
+                    {
+                        headers.put(headerName, headerValue);
+                    }
+                }
+            }
+        }
+        catch (IndexOutOfBoundsException e)
+        {
+            // Headers were malformed. continue with all that was
+            // parsed.
+        }
+        return headers;
+    }
+
+
+    /**
+     * Returns the header with the specified name from the supplied map. The
+     * header lookup is case-insensitive.
+     *
+     * @param headers A <code>Map</code> containing the HTTP request headers.
+     * @param name    The name of the header to return.
+     *
+     * @return The value of specified header, or a comma-separated list if
+     *         there were multiple headers of that name.
+     */
+    protected final String getHeader(Map headers,
+                                     String name)
+    {
+        return (String) headers.get(name.toLowerCase());
+    }
+
+
+    /**
+     * Thrown to indicate that the request is not a multipart request.
+     */
+    public static class InvalidContentTypeException
+        extends FileUploadException
+    {
+        /**
+         * Constructs a <code>InvalidContentTypeException</code> with no
+         * detail message.
+         */
+        public InvalidContentTypeException()
+        {
+            super();
+        }
+
+        /**
+         * Constructs an <code>InvalidContentTypeException</code> with
+         * the specified detail message.
+         *
+         * @param message The detail message.
+         */
+        public InvalidContentTypeException(String message)
+        {
+            super(message);
+        }
+    }
+
+
+    /**
+     * Thrown to indicate that the request size is not specified.
+     */
+    public static class UnknownSizeException
+        extends FileUploadException
+    {
+        /**
+         * Constructs a <code>UnknownSizeException</code> with no
+         * detail message.
+         */
+        public UnknownSizeException()
+        {
+            super();
+        }
+
+        /**
+         * Constructs an <code>UnknownSizeException</code> with
+         * the specified detail message.
+         *
+         * @param message The detail message.
+         */
+        public UnknownSizeException(String message)
+        {
+            super(message);
+        }
+    }
+
+
+    /**
+     * Thrown to indicate that the request size exceeds the configured maximum.
+     */
+    public static class SizeLimitExceededException
+        extends FileUploadException
+    {
+        /**
+         * Constructs a <code>SizeExceededException</code> with no
+         * detail message.
+         */
+        public SizeLimitExceededException()
+        {
+            super();
+        }
+
+        /**
+         * Constructs an <code>SizeExceededException</code> with
+         * the specified detail message.
+         *
+         * @param message The detail message.
+         */
+        public SizeLimitExceededException(String message)
+        {
+            super(message);
+        }
+    }
+
+}

Propchange: incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/upload/PortletFileUploadBase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/ExpressionUtil.java
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/ExpressionUtil.java?view=diff&rev=448311&r1=448310&r2=448311
==============================================================================
--- incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/ExpressionUtil.java (original)
+++ incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/ExpressionUtil.java Wed Sep 20 12:37:05 2006
@@ -1,60 +1,60 @@
-/*
- * Copyright 2000-2004 The Apache Software Foundation.
- * 
- * 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.apache.org/licenses/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.apache.portals.graffito.portlets.util;
-
-import java.util.Enumeration;
-
-import javax.portlet.PortletRequest;
-
-import org.apache.commons.jexl.Expression;
-import org.apache.commons.jexl.ExpressionFactory;
-import org.apache.commons.jexl.JexlContext;
-import org.apache.commons.jexl.JexlHelper;
-
-/**
- * Utility class used to execute condition from the portlet page manager
- * 
- * @author <a href="mailto:christophe.lombart@gmail.com">Lombart Christophe </a>
- * @version $Id: Exp $
- */
-public class ExpressionUtil
-{
-    public static boolean checkCondition(PortletRequest request, String expression)
-    {
-        try
-        {
-            Expression e = ExpressionFactory.createExpression( expression );
-
-            // Create a context and add the objects
-            JexlContext jc = JexlHelper.createContext();
-            
-            for (Enumeration allContextObjectNames = request.getAttributeNames(); allContextObjectNames.hasMoreElements();)
-            {
-                String contextObjectName = (String) allContextObjectNames.nextElement();
-                jc.getVars().put(contextObjectName, request.getAttribute(contextObjectName) );    
-            }
-
-            // Now evaluate the expression, getting the result
-            Object result = e.evaluate(jc);
-            return ((Boolean) result).booleanValue();
-        }
-        catch (Exception e)
-        {
-            return false; 
-        }        
-    }
-    
+/*
+ * Copyright 2000-2004 The Apache Software Foundation.
+ * 
+ * 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.apache.org/licenses/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.apache.portals.graffito.portlets.util;
+
+import java.util.Enumeration;
+
+import javax.portlet.PortletRequest;
+
+import org.apache.commons.jexl.Expression;
+import org.apache.commons.jexl.ExpressionFactory;
+import org.apache.commons.jexl.JexlContext;
+import org.apache.commons.jexl.JexlHelper;
+
+/**
+ * Utility class used to execute condition from the portlet page manager
+ * 
+ * @author <a href="mailto:christophe.lombart@gmail.com">Lombart Christophe </a>
+ * @version $Id: Exp $
+ */
+public class ExpressionUtil
+{
+    public static boolean checkCondition(PortletRequest request, String expression)
+    {
+        try
+        {
+            Expression e = ExpressionFactory.createExpression( expression );
+
+            // Create a context and add the objects
+            JexlContext jc = JexlHelper.createContext();
+            
+            for (Enumeration allContextObjectNames = request.getAttributeNames(); allContextObjectNames.hasMoreElements();)
+            {
+                String contextObjectName = (String) allContextObjectNames.nextElement();
+                jc.getVars().put(contextObjectName, request.getAttribute(contextObjectName) );    
+            }
+
+            // Now evaluate the expression, getting the result
+            Object result = e.evaluate(jc);
+            return ((Boolean) result).booleanValue();
+        }
+        catch (Exception e)
+        {
+            return false; 
+        }        
+    }
+    
 }

Propchange: incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/ExpressionUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/GraffitoTools.java
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/GraffitoTools.java?view=diff&rev=448311&r1=448310&r2=448311
==============================================================================
--- incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/GraffitoTools.java (original)
+++ incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/GraffitoTools.java Wed Sep 20 12:37:05 2006
@@ -1,102 +1,102 @@
-/*
- * Copyright 2000-2004 The Apache Software Foundation.
- * 
- * 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.apache.org/licenses/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.apache.portals.graffito.portlets.util;
-
-import java.util.ArrayList;
-
-import org.apache.portals.graffito.model.core.CmsObject;
-import org.apache.portals.graffito.model.core.Content;
-import org.apache.portals.graffito.model.core.Folder;
-import org.apache.portals.graffito.model.dm.Document;
-
-/**
- *
- * Velocity tools used in the Graffito velocity templates 
- * 
- * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
- * @version $Id: Exp $
- */
-public class GraffitoTools
-{
-      private String graffitoViewerServlet;
-      
-      /**
-       * Constructor 
-       * 
-       * @param graffitoViewerName The Graffito Viewer Servlet. 
-       *        This servlet reference can be used in the href to display binary documents like PDF, ...
-       * 
-       */
-      public GraffitoTools(String graffitoViewerServlet)
-      {
-           this.graffitoViewerServlet = graffitoViewerServlet;
-      }
-      
-      public Folder[] getParents(CmsObject cmsObject)
-      {
-          ArrayList parents = new ArrayList();
-          Folder parent = cmsObject.getParentFolder();
-          while (parent != null)
-          {
-              parents.add(0,parent);
-              parent = parent.getParentFolder();
-          }
-          
-          if (parents.size() == 0)
-          {
-              return null; 
-          }
-          
-          return (Folder[]) parents.toArray(new Folder[parents.size()]);
-          
-      }
-      
-      /**
-       * This method can be used in a velocity template to check if a content has to be view with the 
-       * Graffito servlet viewer or not. HTML and text document can be display direclty in the portlet.
-       * Other content types (PDF, Open office documents, Ms Word, ...) require the Graffito viewer servlet. 
-       * 
-       * @param content the content to check
-       * @return true if the Graffito servlet viewer is required
-       */
-      public boolean requireGraffitoViewer(Content content)
-      {
-        if (content instanceof Document)
-        {
-            Document document = (Document) content;
-            if (document.getContentType().equals("text/plain") || document.getContentType().equals("text/html"))
-            {
-                return false;
-            }
-
-            return true;
-        }
-        else
-        {
-            return false;
-        }
-      }       
-      
-      /**
-       * 
-       * @return The Graffito Viewer Servlet (used for binary documents)
-       */
-      public String getViewerServlet()
-      {
-          return graffitoViewerServlet;
-      }
-            
-}
+/*
+ * Copyright 2000-2004 The Apache Software Foundation.
+ * 
+ * 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.apache.org/licenses/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.apache.portals.graffito.portlets.util;
+
+import java.util.ArrayList;
+
+import org.apache.portals.graffito.model.core.CmsObject;
+import org.apache.portals.graffito.model.core.Content;
+import org.apache.portals.graffito.model.core.Folder;
+import org.apache.portals.graffito.model.dm.Document;
+
+/**
+ *
+ * Velocity tools used in the Graffito velocity templates 
+ * 
+ * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
+ * @version $Id: Exp $
+ */
+public class GraffitoTools
+{
+      private String graffitoViewerServlet;
+      
+      /**
+       * Constructor 
+       * 
+       * @param graffitoViewerName The Graffito Viewer Servlet. 
+       *        This servlet reference can be used in the href to display binary documents like PDF, ...
+       * 
+       */
+      public GraffitoTools(String graffitoViewerServlet)
+      {
+           this.graffitoViewerServlet = graffitoViewerServlet;
+      }
+      
+      public Folder[] getParents(CmsObject cmsObject)
+      {
+          ArrayList parents = new ArrayList();
+          Folder parent = cmsObject.getParentFolder();
+          while (parent != null)
+          {
+              parents.add(0,parent);
+              parent = parent.getParentFolder();
+          }
+          
+          if (parents.size() == 0)
+          {
+              return null; 
+          }
+          
+          return (Folder[]) parents.toArray(new Folder[parents.size()]);
+          
+      }
+      
+      /**
+       * This method can be used in a velocity template to check if a content has to be view with the 
+       * Graffito servlet viewer or not. HTML and text document can be display direclty in the portlet.
+       * Other content types (PDF, Open office documents, Ms Word, ...) require the Graffito viewer servlet. 
+       * 
+       * @param content the content to check
+       * @return true if the Graffito servlet viewer is required
+       */
+      public boolean requireGraffitoViewer(Content content)
+      {
+        if (content instanceof Document)
+        {
+            Document document = (Document) content;
+            if (document.getContentType().equals("text/plain") || document.getContentType().equals("text/html"))
+            {
+                return false;
+            }
+
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+      }       
+      
+      /**
+       * 
+       * @return The Graffito Viewer Servlet (used for binary documents)
+       */
+      public String getViewerServlet()
+      {
+          return graffitoViewerServlet;
+      }
+            
+}

Propchange: incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/GraffitoTools.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/ServiceUtil.java
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/ServiceUtil.java?view=diff&rev=448311&r1=448310&r2=448311
==============================================================================
--- incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/ServiceUtil.java (original)
+++ incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/ServiceUtil.java Wed Sep 20 12:37:05 2006
@@ -1,79 +1,79 @@
-/*
- * Copyright 2000-2004 The Apache Software Foundation.
- * 
- * 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.apache.org/licenses/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.apache.portals.graffito.portlets.util;
-
-import org.apache.jetspeed.security.UserManager;
-import org.apache.jetspeed.services.JetspeedPortletServices;
-import org.apache.jetspeed.services.PortletServices;
-import org.apache.portals.graffito.services.core.ContentModelService;
-import org.apache.portals.graffito.services.core.ContentPermissionService;
-import org.apache.portals.graffito.services.core.ContentServerService;
-import org.apache.portals.graffito.services.dm.DocumentModelService;
-
-/**
- * Utility class used to access to Graffito services & parameters
- * 
- * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
- * @version $Id: Exp $
- */
-public class ServiceUtil
-{
-    /** Temp folder used to upload documents */
-    private static String uploadFolder;
-
-    public static ContentModelService getModelService()
-    {
-        PortletServices services = JetspeedPortletServices.getSingleton();
-        return (ContentModelService) services.getService("ContentModel");
-    }
-    
-    public static DocumentModelService getDocumentService()
-    {
-        PortletServices services = JetspeedPortletServices.getSingleton();
-        return (DocumentModelService) services.getService("DocumentModel");
-    }    
-
-    public static ContentServerService getServerService()
-    {
-        PortletServices services = JetspeedPortletServices.getSingleton();
-        return (ContentServerService) services.getService("ContentServer");
-    }
-
-    public static ContentPermissionService getPermissionService()
-    {
-        PortletServices services = JetspeedPortletServices.getSingleton();
-        return (ContentPermissionService) services.getService("PermissionManager");
-    }
-    
-    public static UserManager getUserService()
-    {
-        PortletServices services = JetspeedPortletServices.getSingleton();
-        return (UserManager) services.getService("UserManager");
-    }    
-    
-    public static String getUploadFolder()
-    {
-        return uploadFolder;
-    }
-
-    public static void setUploadFolder(String uploadFolder)
-    {
-        ServiceUtil.uploadFolder = uploadFolder;
-    }
-
-
-    
+/*
+ * Copyright 2000-2004 The Apache Software Foundation.
+ * 
+ * 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.apache.org/licenses/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.apache.portals.graffito.portlets.util;
+
+import org.apache.jetspeed.security.UserManager;
+import org.apache.jetspeed.services.JetspeedPortletServices;
+import org.apache.jetspeed.services.PortletServices;
+import org.apache.portals.graffito.services.core.ContentModelService;
+import org.apache.portals.graffito.services.core.ContentPermissionService;
+import org.apache.portals.graffito.services.core.ContentServerService;
+import org.apache.portals.graffito.services.dm.DocumentModelService;
+
+/**
+ * Utility class used to access to Graffito services & parameters
+ * 
+ * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
+ * @version $Id: Exp $
+ */
+public class ServiceUtil
+{
+    /** Temp folder used to upload documents */
+    private static String uploadFolder;
+
+    public static ContentModelService getModelService()
+    {
+        PortletServices services = JetspeedPortletServices.getSingleton();
+        return (ContentModelService) services.getService("ContentModel");
+    }
+    
+    public static DocumentModelService getDocumentService()
+    {
+        PortletServices services = JetspeedPortletServices.getSingleton();
+        return (DocumentModelService) services.getService("DocumentModel");
+    }    
+
+    public static ContentServerService getServerService()
+    {
+        PortletServices services = JetspeedPortletServices.getSingleton();
+        return (ContentServerService) services.getService("ContentServer");
+    }
+
+    public static ContentPermissionService getPermissionService()
+    {
+        PortletServices services = JetspeedPortletServices.getSingleton();
+        return (ContentPermissionService) services.getService("PermissionManager");
+    }
+    
+    public static UserManager getUserService()
+    {
+        PortletServices services = JetspeedPortletServices.getSingleton();
+        return (UserManager) services.getService("UserManager");
+    }    
+    
+    public static String getUploadFolder()
+    {
+        return uploadFolder;
+    }
+
+    public static void setUploadFolder(String uploadFolder)
+    {
+        ServiceUtil.uploadFolder = uploadFolder;
+    }
+
+
+    
 }

Propchange: incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/portlets/util/ServiceUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/servlets/GraffitoViewerServlet.java
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/servlets/GraffitoViewerServlet.java?view=diff&rev=448311&r1=448310&r2=448311
==============================================================================
--- incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/servlets/GraffitoViewerServlet.java (original)
+++ incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/servlets/GraffitoViewerServlet.java Wed Sep 20 12:37:05 2006
@@ -1,115 +1,115 @@
-/*
- * Copyright 2000-2004 The Apache Software Foundation.
- * 
- * 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.apache.org/licenses/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.apache.portals.graffito.servlets;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.portals.graffito.exception.ContentManagementException;
-import org.apache.portals.graffito.model.dm.Document;
-import org.apache.portals.graffito.portlets.util.ServiceUtil;
-import org.apache.portals.graffito.services.core.ContentModelService;
-import org.apache.portals.graffito.services.dm.DocumentModelService;
-
-
-
-
-/**
- * This servlet can be used to display a document stream like a word document, images, pdf, ....
- * 
- * @author <a href="mailto:christophe.lombart@sword-technologies.com">Christophe Lombart</a>
- * @version $Id:  Exp $
- */
-public class GraffitoViewerServlet extends HttpServlet
-{
-    /** URI REQUEST PARAM */
-    private static final String URI_PARAM = "uri";
-    
-    static final int BLOCK_SIZE=4096;
-    
-    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
-    {
-        
-        
-        DocumentModelService modelService = ServiceUtil.getDocumentService();    
-        if (null == modelService)
-        {
-            throw new ServletException("Failed to find the content model service");
-        }
-        
-        String uri = request.getParameter(URI_PARAM);
-        try
-        {        
-            Document document = modelService.getDocument(uri);
-            if (document!=null)
-            {
-                response.setContentType(document.getContentType());
-                InputStream documentStream = document.getDocumentStream().getContentStream();
-                drain(documentStream, response.getOutputStream());
-                documentStream.close();
-            }
-            else
-            {
-                response.setContentType("text/html");
-                InputStream documentStream = new ByteArrayInputStream(new String(" ").getBytes());
-                drain(documentStream, response.getOutputStream());
-                documentStream.close();
-            }
-            
-        }
-        catch (ContentManagementException e)
-        {
-            throw new ServletException("Failed to retrieve the document : " + uri);
-        }       
-    }
-    
-    /**
-     * 
-     * @param r
-     * @param w
-     * @throws IOException
-     */
-    public static void drain(InputStream r,OutputStream w) throws IOException
-    {
-        byte[] bytes=new byte[BLOCK_SIZE];
-        try
-        {
-          int length=r.read(bytes);
-          while(length!=-1)
-          {
-              if(length!=0)
-                  {
-                      w.write(bytes,0,length);
-                  }
-              length=r.read(bytes);
-          }
-      }
-      finally
-      {
-        bytes=null;
-      }
-
-    }
-    
-    
-}
+/*
+ * Copyright 2000-2004 The Apache Software Foundation.
+ * 
+ * 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.apache.org/licenses/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.apache.portals.graffito.servlets;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.portals.graffito.exception.ContentManagementException;
+import org.apache.portals.graffito.model.dm.Document;
+import org.apache.portals.graffito.portlets.util.ServiceUtil;
+import org.apache.portals.graffito.services.core.ContentModelService;
+import org.apache.portals.graffito.services.dm.DocumentModelService;
+
+
+
+
+/**
+ * This servlet can be used to display a document stream like a word document, images, pdf, ....
+ * 
+ * @author <a href="mailto:christophe.lombart@sword-technologies.com">Christophe Lombart</a>
+ * @version $Id:  Exp $
+ */
+public class GraffitoViewerServlet extends HttpServlet
+{
+    /** URI REQUEST PARAM */
+    private static final String URI_PARAM = "uri";
+    
+    static final int BLOCK_SIZE=4096;
+    
+    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        
+        
+        DocumentModelService modelService = ServiceUtil.getDocumentService();    
+        if (null == modelService)
+        {
+            throw new ServletException("Failed to find the content model service");
+        }
+        
+        String uri = request.getParameter(URI_PARAM);
+        try
+        {        
+            Document document = modelService.getDocument(uri);
+            if (document!=null)
+            {
+                response.setContentType(document.getContentType());
+                InputStream documentStream = document.getDocumentStream().getContentStream();
+                drain(documentStream, response.getOutputStream());
+                documentStream.close();
+            }
+            else
+            {
+                response.setContentType("text/html");
+                InputStream documentStream = new ByteArrayInputStream(new String(" ").getBytes());
+                drain(documentStream, response.getOutputStream());
+                documentStream.close();
+            }
+            
+        }
+        catch (ContentManagementException e)
+        {
+            throw new ServletException("Failed to retrieve the document : " + uri);
+        }       
+    }
+    
+    /**
+     * 
+     * @param r
+     * @param w
+     * @throws IOException
+     */
+    public static void drain(InputStream r,OutputStream w) throws IOException
+    {
+        byte[] bytes=new byte[BLOCK_SIZE];
+        try
+        {
+          int length=r.read(bytes);
+          while(length!=-1)
+          {
+              if(length!=0)
+                  {
+                      w.write(bytes,0,length);
+                  }
+              length=r.read(bytes);
+          }
+      }
+      finally
+      {
+        bytes=null;
+      }
+
+    }
+    
+    
+}

Propchange: incubator/graffito/trunk/applications/framework-portlets/src/java/org/apache/portals/graffito/servlets/GraffitoViewerServlet.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/graffito/trunk/applications/framework-portlets/src/test/org/apache/portals/graffito/portlets/page/manager/TestPortletPage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/graffito/trunk/applications/framework-portlets/test/pages.xml
URL: http://svn.apache.org/viewvc/incubator/graffito/trunk/applications/framework-portlets/test/pages.xml?view=diff&rev=448311&r1=448310&r2=448311
==============================================================================
--- incubator/graffito/trunk/applications/framework-portlets/test/pages.xml (original)
+++ incubator/graffito/trunk/applications/framework-portlets/test/pages.xml Wed Sep 20 12:37:05 2006
@@ -1,78 +1,78 @@
-<pages>
-	<actions>
-		<action id="cmsobject" class="org.apache.portals.graffito.portlets.browser.actions.CmsObjectAction" />
-		<action id="folder" class="org.apache.portals.graffito.portlets.browser.actions.FolderAction" />
-		<action id="document" class="org.apache.portals.graffito.portlets.browser.actions.DocumentAction" />
-		<action id="permission" class="org.apache.portals.graffito.portlets.browser.actions.PermissionAction" />
-		<action id="forward" class="org.apache.portals.graffito.portlets.browser.actions.ForwardAction" forward = "true" />
-	</actions>
-	
-	<view>
-		<page id = "folderViewer" action="folder.retrieve" template="/WEB-INF/view/folder/folder-browser.vm" defaultPage="true" />
-		<page id = "documentHtmlTextViewer" action="document.retrieve" 
-			template="/WEB-INF/view/document/document-view-text-html.vm">
-			<editpage portletPageId="documentEdit" />
-		</page>
-		<page id = "documentUploadViewer" action="document.retrieve" template="/WEB-INF/view/document/document-view-upload.vm">
-			<editpage portletPageId="documentEdit" />
-		</page>
-	</view>
-	
-	<edit>
-		<page id = "folderEdit" template="/WEB-INF/view/folder/folder-tab.vm" defaultPage="true">
-			<tab id="folder-edit">
-				<page id="metadata" label="tab.folder-edit.metadata" template="/WEB-INF/view/folder/folder-metadata.vm" action = 
-					"folder.retrieve" defaultTabPage="true" />				
-				<page id="children" label="tab.folder-edit.children" template="/WEB-INF/view/folder/folder-children.vm" action = 
-					"folder.retrieve"  />
-				<page id="security" label="tab.security" template="/WEB-INF/view/security/security-browser.vm" action 
-					="permission.retrieve" />
-			</tab>
-		</page>
-		
-		<page id = "folderCreate" action="folder.create" template="/WEB-INF/view/folder/folder-metadata.vm" >
-			<viewpage portletPageId="folderViewer" />
-		</page>
-		
-		<page id = "documentEdit" template="/WEB-INF/view/document/document-tab.vm" action="document.retrieve" >
-			<tab id="document-edit">
-				<page id="metadata" label="tab.document-edit.metadata" 
-					template= "/WEB-INF/view/document/document-edit-metadata.vm" action="document.retrieve" 
-					defaultTabPage="true" />								
-				<page id="content-text" label="tab.document-edit.content" template="/WEB-INF/view/document/document-edit-text.vm" 
-					condition="documentDTO.isText()"
-					action="document.retrieve"  />
-				<page id="content-html" label="tab.document-edit.content" template="/kupu/kupu.vm" 
-					condition="documentDTO.isHTML()"
-					action="document.retrieve"  />
-				<page id="content-upload" label="tab.document-edit.content" template="/WEB-INF/view/document/document-edit-upload.vm" 
-					condition="documentDTO.isBinary()"
-					action="document.retrieve"  />
-										
-				<page id="security" label="tab.security" template= "/WEB-INF/view/security/security-browser.vm" 
-					action="permission.retrieve" />
-			</tab>
-			
-			<!-- Order is important for the view page reference  :
-			     the engine will the select the first viewpage which has a condition returning true -->			
-			<viewpage condition=" (! documentDTO.isBinary())" portletPageId="documentHtmlTextViewer" />
-			<viewpage portletPageId="documentUploadViewer" />
-		</page>
-		
-		<page id = "documentCreate" action="document.createWizard" template="/WEB-INF/view/document/document-edit-metadata.vm" />
-		
-	    <page id = "textEdit" action="document.createWizard" template="/WEB-INF/view/document/document-edit-text.vm" >
-			<viewpage portletPageId="documentHtmlTextViewer" />
-		</page>
-		
-		<page id = "htmlEdit" action="document.createWizard" template="/kupu/kupu.vm" >
-			<viewpage portletPageId="documentHtmlTextViewer" />
-		</page>
-		
-		<page id = "uploadEdit" action="document.createWizard" template="/WEB-INF/view/document/document-edit-upload.vm" >
-			<viewpage portletPageId="documentUploadViewer" />
-		</page>
-		
-		<page id = "permissionCreate" action="permission.create" template="/WEB-INF/view/security/security-permission.vm" />
-	</edit>
+<pages>
+	<actions>
+		<action id="cmsobject" class="org.apache.portals.graffito.portlets.browser.actions.CmsObjectAction" />
+		<action id="folder" class="org.apache.portals.graffito.portlets.browser.actions.FolderAction" />
+		<action id="document" class="org.apache.portals.graffito.portlets.browser.actions.DocumentAction" />
+		<action id="permission" class="org.apache.portals.graffito.portlets.browser.actions.PermissionAction" />
+		<action id="forward" class="org.apache.portals.graffito.portlets.browser.actions.ForwardAction" forward = "true" />
+	</actions>
+	
+	<view>
+		<page id = "folderViewer" action="folder.retrieve" template="/WEB-INF/view/folder/folder-browser.vm" defaultPage="true" />
+		<page id = "documentHtmlTextViewer" action="document.retrieve" 
+			template="/WEB-INF/view/document/document-view-text-html.vm">
+			<editpage portletPageId="documentEdit" />
+		</page>
+		<page id = "documentUploadViewer" action="document.retrieve" template="/WEB-INF/view/document/document-view-upload.vm">
+			<editpage portletPageId="documentEdit" />
+		</page>
+	</view>
+	
+	<edit>
+		<page id = "folderEdit" template="/WEB-INF/view/folder/folder-tab.vm" defaultPage="true">
+			<tab id="folder-edit">
+				<page id="metadata" label="tab.folder-edit.metadata" template="/WEB-INF/view/folder/folder-metadata.vm" action = 
+					"folder.retrieve" defaultTabPage="true" />				
+				<page id="children" label="tab.folder-edit.children" template="/WEB-INF/view/folder/folder-children.vm" action = 
+					"folder.retrieve"  />
+				<page id="security" label="tab.security" template="/WEB-INF/view/security/security-browser.vm" action 
+					="permission.retrieve" />
+			</tab>
+		</page>
+		
+		<page id = "folderCreate" action="folder.create" template="/WEB-INF/view/folder/folder-metadata.vm" >
+			<viewpage portletPageId="folderViewer" />
+		</page>
+		
+		<page id = "documentEdit" template="/WEB-INF/view/document/document-tab.vm" action="document.retrieve" >
+			<tab id="document-edit">
+				<page id="metadata" label="tab.document-edit.metadata" 
+					template= "/WEB-INF/view/document/document-edit-metadata.vm" action="document.retrieve" 
+					defaultTabPage="true" />								
+				<page id="content-text" label="tab.document-edit.content" template="/WEB-INF/view/document/document-edit-text.vm" 
+					condition="documentDTO.isText()"
+					action="document.retrieve"  />
+				<page id="content-html" label="tab.document-edit.content" template="/kupu/kupu.vm" 
+					condition="documentDTO.isHTML()"
+					action="document.retrieve"  />
+				<page id="content-upload" label="tab.document-edit.content" template="/WEB-INF/view/document/document-edit-upload.vm" 
+					condition="documentDTO.isBinary()"
+					action="document.retrieve"  />
+										
+				<page id="security" label="tab.security" template= "/WEB-INF/view/security/security-browser.vm" 
+					action="permission.retrieve" />
+			</tab>
+			
+			<!-- Order is important for the view page reference  :
+			     the engine will the select the first viewpage which has a condition returning true -->			
+			<viewpage condition=" (! documentDTO.isBinary())" portletPageId="documentHtmlTextViewer" />
+			<viewpage portletPageId="documentUploadViewer" />
+		</page>
+		
+		<page id = "documentCreate" action="document.createWizard" template="/WEB-INF/view/document/document-edit-metadata.vm" />
+		
+	    <page id = "textEdit" action="document.createWizard" template="/WEB-INF/view/document/document-edit-text.vm" >
+			<viewpage portletPageId="documentHtmlTextViewer" />
+		</page>
+		
+		<page id = "htmlEdit" action="document.createWizard" template="/kupu/kupu.vm" >
+			<viewpage portletPageId="documentHtmlTextViewer" />
+		</page>
+		
+		<page id = "uploadEdit" action="document.createWizard" template="/WEB-INF/view/document/document-edit-upload.vm" >
+			<viewpage portletPageId="documentUploadViewer" />
+		</page>
+		
+		<page id = "permissionCreate" action="permission.create" template="/WEB-INF/view/security/security-permission.vm" />
+	</edit>
 </pages>

Propchange: incubator/graffito/trunk/applications/framework-portlets/test/pages.xml
------------------------------------------------------------------------------
    svn:eol-style = native