incubator-graffito-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From clomb...@apache.org
Subject svn commit: r156344 [2/2] - in incubator/graffito/trunk/applications/browser/src: java/org/apache/portals/graffito/portlets/ java/org/apache/portals/graffito/portlets/actions/ java/org/apache/portals/graffito/portlets/dto/ java/org/apache/portals/graffito/portlets/services/ java/org/apache/portals/graffito/portlets/upload/ java/org/apache/portals/graffito/portlets/util/ java/org/apache/portals/graffito/servlets/ webapp/META-INF/ webapp/WEB-INF/ webapp/WEB-INF/actions/ webapp/WEB-INF/view/ webapp/WEB-INF/view/document/ webapp/WEB-INF/view/folder/ webapp/kupu/
Date Sun, 06 Mar 2005 22:27:59 GMT
Added: incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/portlets/upload/PortletFileUploadBase.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/portlets/upload/PortletFileUploadBase.java?view=auto&rev=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/portlets/upload/PortletFileUploadBase.java (added)
+++ incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/portlets/upload/PortletFileUploadBase.java Sun Mar  6 14:27:53 2005
@@ -0,0 +1,707 @@
+/*
+ * 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.Iterator;
+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;
+
+import sun.reflect.FieldInfo;
+
+
+/**
+ * <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);
+        }
+    }
+
+}

Added: incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/portlets/util/BrowserDTOUtil.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/portlets/util/BrowserDTOUtil.java?view=auto&rev=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/portlets/util/BrowserDTOUtil.java (added)
+++ incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/portlets/util/BrowserDTOUtil.java Sun Mar  6 14:27:53 2005
@@ -0,0 +1,149 @@
+/*
+ * 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.List;
+
+import javax.portlet.PortletException;
+import javax.portlet.PortletRequest;
+import javax.portlet.PortletSession;
+import javax.portlet.RenderRequest;
+import javax.portlet.RenderResponse;
+
+
+import org.apache.jetspeed.services.JetspeedPortletServices;
+import org.apache.jetspeed.services.PortletServices;
+import org.apache.portals.graffito.ContentModelService;
+import org.apache.portals.graffito.ContentServerService;
+import org.apache.portals.graffito.exception.ContentManagementException;
+import org.apache.portals.graffito.model.CmsObject;
+import org.apache.portals.graffito.model.Folder;
+import org.apache.portals.graffito.portlets.dto.BrowserDTO;
+import org.apache.portals.graffito.util.CmsUtil;
+
+/**
+ * Utility class used to manage BrowserDTO DTO from the portlet session
+ * 
+ * @author <a href="mailto:christophe.lombart@sword-technologies.com">Lombart Christophe </a>
+ * @version $Id: Exp $
+ */
+public class BrowserDTOUtil
+{
+    /** Portlet session attribute name used to set the Browser info */
+    private static final String SESSION_BROWSER_INFO = "graffito.browser.info";
+
+    /**
+     * Get the Browser DTO found in the portlet session
+     * 
+     * @param request The portlet request
+     * @return The Browser DTO found or null
+     */
+    public static BrowserDTO getBrowserDTO(PortletRequest request)
+    {
+        return (BrowserDTO) request.getPortletSession().getAttribute(SESSION_BROWSER_INFO, PortletSession.PORTLET_SCOPE);
+    }
+
+    /**
+     * Set the a new Browser DTO in the portlet session
+     *  
+     * @param request The portlet Request
+     * @param browserDTO the new Browser DTO
+     */
+    public static void setBrowserDTO(PortletRequest request, BrowserDTO browserDTO)
+    {
+        request.getPortletSession().setAttribute(SESSION_BROWSER_INFO, browserDTO);
+    }
+
+    /**
+     * Remove the current Browser DTO from the portlet session
+     * 
+     * @param request The portlet request
+     */
+    public static void removeBrowserDTO(PortletRequest request)
+    {
+        request.getPortletSession().removeAttribute(SESSION_BROWSER_INFO);
+    }
+    
+    /**
+     * Clean up the current Browser DTO found in the session 
+     * 
+     * when cancelling some action in the browser, it is important to clean up the DTO BrowserDTO
+     * @param request The portlet request
+     * 
+     * @return BrowserDTO a fresh/clean-up Browser DTO
+     */
+    public static BrowserDTO cleanBrowserDTO(PortletRequest request)
+    {
+        BrowserDTO browserDTO = getBrowserDTO(request);
+        browserDTO.setCurrentCmsObject(null);
+        browserDTO.setOperation(null);
+        return browserDTO;
+        
+    }
+    
+    /**
+     * Create & initialise a new Browser DTO.
+     * 
+     * @param uri
+     *            The uri map to a cms folder
+     * @param request
+     *            The portlet request
+     * @param response
+     *            The portlet response
+     * @param documentTypes
+     *            The list of all document types that can be used in the browser
+     * @param documentLanguages
+     *            The list of all languages that can be used in the browser
+     * @return The new instantiated Browser DTO
+     * @throws PortletException
+     *             when it is not possible to retrieve all cms object need for this DTO
+     */
+    public static BrowserDTO createBrowserDTO(String uri, RenderRequest request, RenderResponse response, List documentTypes, List documentLanguages) throws PortletException
+    {
+        try
+        {
+            BrowserDTO browserDTO = new BrowserDTO(uri, documentTypes, documentLanguages);
+            
+            PortletServices services = JetspeedPortletServices.getSingleton();
+            ContentModelService modelService =  (ContentModelService) services.getService("ContentModel");
+            ContentServerService serverService =  (ContentServerService) services.getService("ContentServer");
+            CmsObject cmsObject = modelService.getCmsObject(uri);
+            browserDTO.setCurrentCmsObject(cmsObject);
+            if ((cmsObject instanceof Folder) || (cmsObject == null)) // cms object is null if the uri match to a server root
+            {
+                browserDTO.setDocuments(modelService.getDocuments(uri));
+                browserDTO.setFolders(modelService.getFolders(uri));
+                browserDTO.setCurrentFolder(modelService.getFolder(uri));
+
+            }
+            else
+            {
+                browserDTO.setCurrentFolder(cmsObject.getParentFolder());
+            }
+            String scopeServer = CmsUtil.getServerScope(uri);
+            browserDTO.setCurrentServer(serverService.getServer(scopeServer));
+
+            return browserDTO;
+
+        }
+        catch (ContentManagementException e)
+        {
+            throw new PortletException("Failed to view the portlet - impossible to access to Graffito content store : "
+                    + e.getMessage());
+        }
+
+    }
+}

Modified: incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/servlets/GraffitoViewerServlet.java
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/servlets/GraffitoViewerServlet.java?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/servlets/GraffitoViewerServlet.java (original)
+++ incubator/graffito/trunk/applications/browser/src/java/org/apache/portals/graffito/servlets/GraffitoViewerServlet.java Sun Mar  6 14:27:53 2005
@@ -30,6 +30,7 @@
 import org.apache.portals.graffito.ContentModelService;
 import org.apache.portals.graffito.exception.ContentManagementException;
 import org.apache.portals.graffito.model.Document;
+import org.apache.portals.graffito.portlets.services.ServiceUtil;
 
 
 
@@ -49,8 +50,8 @@
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {
         
-        PortletServices services = JetspeedPortletServices.getSingleton();
-        ContentModelService modelService = (ContentModelService) services.getService("ContentModel");         
+        
+        ContentModelService modelService = ServiceUtil.getModelService();        
         if (null == modelService)
         {
             throw new ServletException("Failed to find the content model service");

Added: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/actions/actions.xml
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/actions/actions.xml?view=auto&rev=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/actions/actions.xml (added)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/actions/actions.xml Sun Mar  6 14:27:53 2005
@@ -0,0 +1,6 @@
+<actions>
+	<action id="general" class="org.apache.portals.graffito.portlets.actions.GeneralAction" />	
+	<action id="cmsobject" class="org.apache.portals.graffito.portlets.actions.CmsObjectAction" />		
+	<action id="folder" class="org.apache.portals.graffito.portlets.actions.FolderAction" />	
+    <action id="document" class="org.apache.portals.graffito.portlets.actions.DocumentAction" />
+</actions>
\ No newline at end of file

Modified: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/jetspeed-portlet.xml
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/jetspeed-portlet.xml?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/jetspeed-portlet.xml (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/jetspeed-portlet.xml Sun Mar  6 14:27:53 2005
@@ -23,12 +23,5 @@
         <portlet-name>graffitoBrowser</portlet-name>
         <dc:title>Graffito Browser Portlet</dc:title>
         <dc:creator>Graffito Team</dc:creator>
-    </portlet>
-    
-
-     <js:services>
-		<js:service name='ContentServer'/>	
-		<js:service name='ContentModel'/>	
-      </js:services>
-	
+    </portlet>	
 </portlet-app>

Modified: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-text-edit.vm
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-text-edit.vm?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-text-edit.vm (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-text-edit.vm Sun Mar  6 14:27:53 2005
@@ -21,9 +21,9 @@
 
 *#
 #set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
-#set ($document = $browserInfo.getCurrentCmsObject())
+#set ($document = $browserDTO.getCurrentCmsObject())
 
-<div class="portlet-menu">$MESSAGES.getString('div.newdocument') #cmsPath($browserInfo.getCurrentServer() $browserInfo.getFolderPath() $renderResponse $MESSAGES ) </div>
+<div class="portlet-menu">$MESSAGES.getString('div.newdocument') #cmsPathLink($browserDTO.getCurrentServer() $browserDTO.getFolderPath() $renderResponse $MESSAGES ) </div>
 
 <div class="portlet-section-header">Text Editor</div>
 
@@ -33,7 +33,7 @@
 	#formFieldTextArea($document.getContent().getContentAsString() "content" $MESSAGES $ERRORS)    
 	<div class="portlet-section-footer">
 		<input type="submit" name="portletAction_document.save" value="Save" class="portlet-dlg-icon-label"/>		
-		<input type="submit" name="portletAction_general.cancel" value="Cancel" class="portlet-dlg-icon-label"/>		
+		<!-- input type="submit" name="portletAction_general.cancel" value="Cancel" class="portlet-dlg-icon-label"/ -->		
 	</div>
 </form>
 

Modified: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-text-html-view.vm
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-text-html-view.vm?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-text-html-view.vm (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-text-html-view.vm Sun Mar  6 14:27:53 2005
@@ -21,8 +21,8 @@
 
 *#
 #set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
-#set ($document = $browserInfo.getCurrentCmsObject())
+#set ($document = $browserDTO.getCurrentCmsObject())
 
-<div class="portlet-menu">$MESSAGES.getString('div.path') #cmsPathLink($browserInfo.getCurrentServer() $browserInfo.getFolderPath() $renderResponse $MESSAGES ) </div>
+<div class="portlet-menu">$MESSAGES.getString('div.path') #cmsPathLink($browserDTO.getCurrentServer() $browserDTO.getFolderPath() $renderResponse $MESSAGES ) </div>
 <br>
 $document.getContent().getContentAsString()

Modified: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-type.vm
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-type.vm?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-type.vm (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-type.vm Sun Mar  6 14:27:53 2005
@@ -21,9 +21,9 @@
 
 *#
 #set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
-#set ($document = $browserInfo.getCurrentCmsObject())
+#set ($document = $browserDTO.getCurrentCmsObject())
 
-<div class="portlet-menu">$MESSAGES.getString('div.newdocument') #cmsPath($browserInfo.getCurrentServer() $browserInfo.getParentFolders() $renderResponse $MESSAGES ) </div>
+<div class="portlet-menu">$MESSAGES.getString('div.newdocument') #cmsPath($browserDTO.getCurrentServer() $browserDTO.getParentFolders() $renderResponse $MESSAGES ) </div>
 
 <div class="portlet-section-header">General Information</div>
 
@@ -35,13 +35,14 @@
         #formFieldInput('field.title' "$!document.getTitle()" "25" 'title' $MESSAGES $ERRORS)
         #formFieldInput('field.description' "$!document.getDescription()" "50" 'description' $MESSAGES $ERRORS)		
         #formFieldInput('field.owner' "$!document.getOwner()" "25" 'owner' $MESSAGES $ERRORS)				
-		#formFieldSelect('field.language' $browserInfo.getDocumentLanguages() 'language' $MESSAGES $ERRORS )
-		#formFieldSelect('field.type' $browserInfo.getDocumentTypes() 'documentType' $MESSAGES $ERRORS )
+		#formFieldSelect('field.language' $browserDTO.getDocumentLanguages() 'language' $MESSAGES $ERRORS )
+		#formFieldSelect('field.type' $browserDTO.getDocumentTypes() 'documentType' $MESSAGES $ERRORS )
            
 	</table>
 	<div class="portlet-section-footer">
 		<input type="submit" name="portletAction_document.createStep2" value="Next" class="portlet-dlg-icon-label"/>
 		<input type="submit" name="portletAction_general.cancel" value="Cancel" class="portlet-dlg-icon-label"/>
+		                           
 	</div>
 </form>
 

Modified: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-upload-edit.vm
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-upload-edit.vm?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-upload-edit.vm (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document-upload-edit.vm Sun Mar  6 14:27:53 2005
@@ -21,9 +21,9 @@
 
 *#
 #set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
-#set ($document = $browserInfo.getCurrentCmsObject())
+#set ($document = $browserDTO.getCurrentCmsObject())
 
-<div class="portlet-menu">$MESSAGES.getString('div.newdocument') #cmsPath($browserInfo.getCurrentServer() $browserInfo.getFolderPath() $renderResponse $MESSAGES ) </div>
+<div class="portlet-menu">$MESSAGES.getString('div.newdocument') #cmsPathLink($browserDTO.getCurrentServer() $browserDTO.getFolderPath() $renderResponse $MESSAGES ) </div>
 
 <div class="portlet-section-header">Upload Document</div>
 
@@ -33,7 +33,7 @@
 	</table>
 	<div class="portlet-section-footer">
 		<input type="submit" name="portletAction_document.upload" value="Upload" class="portlet-dlg-icon-label"/>
-		<input type="submit" name="portletAction_general.cancel" value="Cancel" class="portlet-dlg-icon-label"/>
+		<!-- input type="submit" name="portletAction_general.cancel" value="Cancel" class="portlet-dlg-icon-label" --/>
 	</div>
 </form>
 #ErrorMessages($ERRORS)

Modified: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document.vm
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document.vm?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document.vm (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/document/document.vm Sun Mar  6 14:27:53 2005
@@ -21,9 +21,9 @@
 
 *#
 #set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
-#set ($document = $browserInfo.getCurrentCmsObject())
+#set ($document = $browserDTO.getCurrentCmsObject())
 
-<div class="portlet-menu">$MESSAGES.getString('div.newdocument') #cmsPath($browserInfo.getCurrentServer() $browserInfo.getParentFolders() $renderResponse $MESSAGES ) </div>
+<div class="portlet-menu">$MESSAGES.getString('div.newdocument') #cmsPath($browserDTO.getCurrentServer() $browserDTO.getParentFolders() $renderResponse $MESSAGES ) </div>
 
 <div class="portlet-section-header">Document Info </div>
 

Modified: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/edit-tab-sample.vm
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/edit-tab-sample.vm?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/edit-tab-sample.vm (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/edit-tab-sample.vm Sun Mar  6 14:27:53 2005
@@ -22,7 +22,7 @@
 *#
 #set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
 
-<div class="portlet-menu">$MESSAGES.getString('div.path') $browserInfo.getUri()</div>
+<div class="portlet-menu">$MESSAGES.getString('div.path') $browserDTO.getUri()</div>
 
 #tab($tabs.get("document") $MESSAGES  $renderResponse.createActionURL())
 

Modified: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-browser.vm
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-browser.vm?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-browser.vm (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-browser.vm Sun Mar  6 14:27:53 2005
@@ -23,11 +23,11 @@
 
 #set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
 
-<div class="portlet-menu">$MESSAGES.getString('div.path') #cmsPathLink($browserInfo.getCurrentServer() $browserInfo.getFolderPath() $renderResponse $MESSAGES )</div>
-#if( $browserInfo.isEmpty())	
+<div class="portlet-menu">$MESSAGES.getString('div.path') #cmsPathLink($browserDTO.getCurrentServer() $browserDTO.getFolderPath() $renderResponse $MESSAGES )</div>
+#if( $browserDTO.isEmpty())	
   	    <div class="portlet-msg-info">$MESSAGES.getString('info.nocontent')</div>		
 #else         
-	#set ($folders = $browserInfo.getFolders())
+	#set ($folders = $browserDTO.getFolders())
 	#if($folders.size() > 0)
 		<!-- div class="portlet-menu">$MESSAGES.getString('div.folders')</div -->		
 			<table border="0">
@@ -48,7 +48,7 @@
 		<!-- /div -->
 	#end
 
-	#set ($documents = $browserInfo.getDocuments())	
+	#set ($documents = $browserDTO.getDocuments())	
 	#if($documents.size() > 0)	
 		<!-- div class="portlet-menu">$MESSAGES.getString('div.documents')</div -->
 

Modified: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-detail.vm
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-detail.vm?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-detail.vm (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-detail.vm Sun Mar  6 14:27:53 2005
@@ -21,16 +21,16 @@
 
 *#
 #set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
-#set ($folder = $browserInfo.getCurrentCmsObject())
+#set ($folder = $browserDTO.getCurrentCmsObject())
 
 
 <div class="portlet-menu">
-	#if($browserInfo.isUpdate())
+	#if($browserDTO.isUpdate())
            $MESSAGES.getString('div.updatefolder') 
 	#else	
 		   $MESSAGES.getString('div.newfolder') 
 	#end
-	#cmsPath($browserInfo.getCurrentServer() $browserInfo.getFolderPath() $renderResponse $MESSAGES ) 
+	#cmsPathLink($browserDTO.getCurrentServer() $browserDTO.getFolderPath() $renderResponse $MESSAGES ) 
 </div>
 
 <div class="portlet-section-header">Folder Info </div>
@@ -40,7 +40,7 @@
     <input type="hidden" name="uri" value="$folder.getUri()" size="100" maxlength="100"/>	
 	<table border="0" cellspacing="2" cellpadding="3">		
 		
-		#if($browserInfo.isUpdate())
+		#if($browserDTO.isUpdate())
  		   #formFieldText('field.name' "$!folder.getName()" $MESSAGES $ERRORS)
 		#else	
 		   #formFieldInput('field.name' "$!folder.getName()" "25" 'name' $MESSAGES $ERRORS)
@@ -50,7 +50,7 @@
 	</table>
 	<div class="portlet-section-footer">
 		<input type="submit" name="portletAction_folder.save" value="Save" class="portlet-dlg-icon-label"/>
-		<input type="submit" name="portletAction_general.cancel" value="Cancel" class="portlet-dlg-icon-label"/>
+		<!-- input type="submit" name="portletAction_general.cancel" value="Cancel" class="portlet-dlg-icon-label"/ -->
 	</div>
 </form>
 

Modified: incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-edit.vm
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-edit.vm?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-edit.vm (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/WEB-INF/view/folder/folder-edit.vm Sun Mar  6 14:27:53 2005
@@ -22,13 +22,13 @@
 *#
 #set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
 
-<div class="portlet-menu">$MESSAGES.getString('div.path') #cmsPath($browserInfo.getCurrentServer() $browserInfo.getFolderPath() $renderResponse $MESSAGES )</div>
+<div class="portlet-menu">$MESSAGES.getString('div.path') #cmsPathLink($browserDTO.getCurrentServer() $browserDTO.getFolderPath() $renderResponse $MESSAGES )</div>
 
 <form action="$renderResponse.createActionURL()" method="post">
-	#set ($folders = $browserInfo.getFolders())
-	#set ($documents = $browserInfo.getDocuments())
+	#set ($folders = $browserDTO.getFolders())
+	#set ($documents = $browserDTO.getDocuments())
 	#set ($count = 0)
-	#if($browserInfo.isEmpty())
+	#if($browserDTO.isEmpty())
 		<div class="portlet-msg-info">$MESSAGES.getString('info.nocontent')</div>
 	#else
 	<table>
@@ -52,7 +52,7 @@
 			<tr>
 				<td class="$cssClass"><input type="checkbox" name="uri" value="$folder.getUri()" /></td>
 				<td class="$cssClass">$MESSAGES.getString('div.folder')</td>
-				<td class="$cssClass"><a href="$renderResponse.createActionURL()?uri=$folder.getUri()&portletAction_folder.edit=selected">$folder.getName()</a></td>
+				<td class="$cssClass"><a href="$renderResponse.createRenderURL()?uri=$folder.getUri()">$folder.getName()</a></td>
 				<td class="$cssClass">$folder.getTitle()</td>
 				<td class="$cssClass">$folder.getDescription()</td>
 				<td class="$cssClass">$!folder.getCreationDate()</td>
@@ -71,7 +71,7 @@
 			<tr>
 				<td class="$cssClass"><input type="checkbox" name="uri" value="$document.getUri()"  /></td>
 				<td class="$cssClass">$document.getContentType() </td>		
-				<td class="$cssClass"><a href="$renderResponse.createActionURL()?uri=$document.getUri()&portletAction_document.edit=selected">$document.getName()</a></td>
+				<td class="$cssClass"><a href="$renderResponse.createRenderURL()?uri=$document.getUri()">$document.getName()</a></td>
 				<td class="$cssClass">$document.getTitle()</td>
 				<td class="$cssClass">$document.getDescription()</td>
 				<td class="$cssClass">$!document.getCreationDate()</td>

Modified: incubator/graffito/trunk/applications/browser/src/webapp/kupu/kupu.vm
URL: http://svn.apache.org/viewcvs/incubator/graffito/trunk/applications/browser/src/webapp/kupu/kupu.vm?view=diff&r1=156343&r2=156344
==============================================================================
--- incubator/graffito/trunk/applications/browser/src/webapp/kupu/kupu.vm (original)
+++ incubator/graffito/trunk/applications/browser/src/webapp/kupu/kupu.vm Sun Mar  6 14:27:53 2005
@@ -1,6 +1,6 @@
 
 #set ($MESSAGES = $portletConfig.getResourceBundle($renderRequest.Locale))
-#set ($document = $browserInfo.getCurrentCmsObject())
+#set ($document = $browserDTO.getCurrentCmsObject())
 
 
 <html xmlns="http://www.w3.org/1999/xhtml">
@@ -22,7 +22,7 @@
     <script type="text/javascript" src="$renderRequest.getContextPath()/kupu/kupudrawers.js"> </script>
   </head>
   <body onload="kupu = startKupu()">    
-    <div class="portlet-menu">$MESSAGES.getString('div.newdocument') #cmsPath($browserInfo.getCurrentServer() $browserInfo.getFolderPath() $renderResponse $MESSAGES ) </div>	
+    <div class="portlet-menu">$MESSAGES.getString('div.newdocument') #cmsPathLink($browserDTO.getCurrentServer() $browserDTO.getFolderPath() $renderResponse $MESSAGES ) </div>	
     <form action="$renderResponse.createActionURL()" method="POST">
       <div style="display: none;">
         <xml id="kupuconfig">



Mime
View raw message