You are viewing a plain text version of this content. The canonical link for it is here.
Posted to adffaces-commits@incubator.apache.org by jw...@apache.org on 2006/12/05 02:02:55 UTC

svn commit: r482451 [4/5] - in /incubator/adffaces/branches/jwaldman-portal/trinidad: trinidad-api/ trinidad-api/src/main/java/org/apache/myfaces/trinidad/config/ trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/ trinidad-api/src/main/jav...

Added: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFileImpl.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFileImpl.java?view=auto&rev=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFileImpl.java (added)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFileImpl.java Mon Dec  4 18:02:50 2006
@@ -0,0 +1,454 @@
+/*
+ * Copyright  2002-2006 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.myfaces.trinidadinternal.config.upload;
+
+import java.io.BufferedInputStream;
+import java.io.EOFException;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.Serializable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.myfaces.trinidad.model.UploadedFile;
+
+/**
+ * UploadedFileImpl defines a single file that has been uploaded
+ * to the server.
+ * 
+ * @version $Name:  $ ($Revision: adfrt/faces/adf-faces-impl/src/main/java/oracle/adfinternal/view/faces/webapp/UploadedFileImpl.java#0 $) $Date: 10-nov-2005.18:49:03 $
+ * @author The Oracle ADF Faces Team
+ */
+public class UploadedFileImpl implements UploadedFile, Serializable
+{
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 1592383482116327497L;
+  
+  UploadedFileImpl()
+  {
+  }
+
+  /**
+   * Returns the filename reported from the client.
+   */
+  public String getFilename()
+  {
+    return _filename;
+  }
+
+  /**
+   * Returns the MIME type of the file.
+   */
+  public String getContentType()
+  {
+    return _contentType;
+  }
+
+  /**
+   * Returns the total length (in bytes) of the file.
+   */
+  public long getLength()
+  {
+    return _length;
+  }
+
+  public Object getOpaqueData()
+  {
+    return null;
+  }
+
+  /**
+   * Returns an InputStream that can be used to read the file.
+   * This method can be called repeatedly.
+   */
+  public InputStream getInputStream() throws IOException
+  {
+    if (_buffers != null)
+    {
+      return new BufferIS(_buffers, _sizeOfLastBuffer);
+    }
+    else if (_file != null)
+    {
+      return new BufferedInputStream(new FileInputStream(_file));
+    }
+
+    return null;
+  }
+
+  /**
+   * Writes the entire contents of the file to an OutputStream.
+   */
+  private void _writeFile(OutputStream out) throws IOException
+  {
+    if (_buffers != null)
+    {
+      int size = _buffers.size();
+      for (int i = 0; i < size; i++)
+      {
+        byte[] buffer = _buffers.get(i);
+        int bytes;
+        if (i == (size - 1))
+          bytes = _sizeOfLastBuffer;
+        else
+          bytes = buffer.length;
+
+        out.write(buffer, 0, bytes);
+      }
+    }
+    else if (_file != null)
+    {
+      FileInputStream in = new FileInputStream(_file);
+      try
+      {
+        byte[] buffer = new byte[_DISK_BUFFER_SIZE];
+        while (true)
+        {
+          int bytes = in.read(buffer);
+          if (bytes < 0)
+            break;
+          out.write(buffer, 0, bytes);
+        }
+      }
+      finally
+      {
+        in.close();
+      }
+    }
+  }
+
+  /**
+   * Disposes of all resources used to store this file.
+   */ 
+  public void dispose()
+  {
+    _length = 0;
+    _buffers = null;
+    if (_file != null)
+    {
+      _file.delete();
+      _file = null;
+    }
+  }
+  
+  /**
+   * Loads the file from a MultipartFormItem.
+   */
+  public void loadFile(
+    UploadedFile      file,
+    long              remainingMemory,
+    long              remainingDiskSpace,
+    String            directory) throws IOException
+  {
+    _filename    = file.getFilename();
+    _contentType = file.getContentType();
+    
+    InputStream in = file.getInputStream();
+
+    // First step: try to read it into memory.  Instead of trying
+    // to build up one big buffer, we create a list of buffers
+    // that are each at most 4K.  This is vastly faster to create
+    // and insignificantly slower to read.
+    while (_length < remainingMemory)
+    {
+      // Read another block of buffered memory.  We'll read up to 4K
+      // at a time, but no more than the remaining amount of memory plus
+      // one byte.  Why plus one?  Well, we want to know when we've
+      // exceeded the memory size - not just reached it.
+      int size = Math.min(((int) (remainingMemory - _length)) + 1,
+                          _MEMORY_BUFFER_SIZE);
+      byte[] buffer = new byte[size];
+      int bytes = _fillBuffer(in, buffer, size);
+
+      _sizeOfLastBuffer = bytes;
+      _length           = _length + bytes;
+
+      if (_buffers == null)
+        _buffers = new ArrayList<byte[]>();
+      _buffers.add(buffer);
+      
+      // If we're done, bail right here.
+      if (bytes < size)
+        return;
+    }
+
+    // If we didn't have enough space to read the file into memory,
+    // and we also don't have enough space available on disk, then
+    // punt right here and now.
+    if (_length > remainingDiskSpace)
+    {
+      _buffers = null;
+      _length  = 0;
+      throw new EOFException("Per-request disk space limits exceeded.");
+    }
+
+    OutputStream out = _createOutputStream(directory);
+      
+    try
+    {
+      // First, copy the file from memory to the file
+      if (_length > 0)
+      {
+        _writeFile(out);
+      }
+      
+      // Free the buffers, since we're
+      _buffers = null;
+      
+      // Now, write directly to the file.
+      while (_length < remainingDiskSpace)
+      {
+        byte[] buffer = new byte[_DISK_BUFFER_SIZE];
+        int bytes = _fillBuffer(in, buffer, _DISK_BUFFER_SIZE);
+        out.write(buffer, 0, bytes);
+        _length = _length + bytes;
+
+        if (bytes < _DISK_BUFFER_SIZE)
+          break;
+      }
+    }
+    finally
+    {
+      out.close();
+
+      // If we read too much - then drop the file, and bail.
+      if (_length > remainingDiskSpace)
+      {
+        _file.delete();
+        _file = null;
+        _length = 0;
+
+        throw new EOFException("Per-request disk space limits exceeded.");
+      }
+    }
+  }
+  
+  @Override
+  public int hashCode()
+  {
+    if (_filename == null)
+      return 0;
+    return _filename.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object o)
+  {
+    // UploadedFiles are only equal to themselves.
+    return (this == o);
+  }
+
+  //
+  // Create the OutputStream.
+  //
+  private OutputStream _createOutputStream(String directory) throws IOException
+  {
+    File tempDir;
+    if (directory == null)
+      tempDir = null;
+    else
+      tempDir = new File(directory);
+
+    // Create our temporary file.
+    _file = File.createTempFile("uix", null, tempDir);
+
+    // Even though we're supposed to clean up these files ourselves,
+    // make sure they get deleted even if an exception terminates
+    // our code.
+    _file.deleteOnExit();
+
+    // No need for additional buffering of the output - we always
+    // buffer the writes - so _don't_ add a BufferedOutputStream.
+    return new FileOutputStream(_file);
+  }
+
+
+  //
+  // If true, we're either in memory (or empty);  if false,
+  // we're on disk.
+  //
+  boolean __isInMemory()
+  {
+    return (_buffers != null);
+  }
+
+  //
+  // Fill a byte buffer from an InputStream.
+  //
+  private int _fillBuffer(
+    InputStream in,
+    byte[]      buffer,
+    int         size) throws IOException
+  {
+    int offset = 0;
+
+    // Read until the buffer is full, or the InputStream runs out.
+    do
+    {
+      int bytes = in.read(buffer, offset, size - offset);
+      if (bytes < 0)
+        break;
+      
+      offset = offset + bytes;
+    }
+    while (offset < size);
+
+    return offset;
+  }
+
+
+  //
+  // InputStream implementation that reads from an in-memory buffer.
+  //
+  static private class BufferIS extends InputStream
+  {
+    public BufferIS(List<byte[]> bufferList, int sizeOfLastBuffer)
+    {
+      _bufferList = bufferList;
+      _sizeOfLastBuffer = sizeOfLastBuffer;
+    }
+
+    // Read a single byte.
+    @Override
+    public int read()
+    {
+      int bufferIndex = _bufferIndex;
+      if (bufferIndex < 0)
+        return -1;
+
+      byte[] buffer = _getBuffer(bufferIndex);
+      byte currByte = buffer[_bufferPos];
+
+      int bufferSize = _getBufferSize(buffer, bufferIndex);
+      _advanceTo(_bufferPos + 1, bufferSize);
+     
+      return currByte & 0xff; 
+    }
+    
+    // Read into a buffer.
+    @Override
+    public int read(byte b[], int off, int len)
+    {
+      int bufferIndex = _bufferIndex;
+      if (bufferIndex < 0)
+        return -1;
+
+      byte[] buffer = _getBuffer(bufferIndex);
+      int bufferSize = _getBufferSize(buffer, bufferIndex);
+      
+      // Read as many bytes are available in the current buffer block,
+      // up to "len" bytes.  If "len" is larger, then in theory
+      // we could loop and read multiple blocks, but that'd complicate
+      // our logic here without actually simplifying the developer's
+      // logic any (they can't assume an InputStream behaves that way).
+      int bufferPos = _bufferPos;
+      int bytes = Math.min(len, bufferSize - bufferPos);
+      System.arraycopy(buffer, bufferPos, b, off, bytes);
+      _advanceTo(bufferPos + bytes, bufferSize);
+     
+      return bytes;
+    }
+
+    //
+    // Returns the number of bytes that will be made avaialable
+    // in the next call to read(byte[], int, int);
+    //
+    @Override
+    public int available()
+    {
+      int bufferIndex = _bufferIndex;
+      if (bufferIndex < 0)
+        return 0;
+
+      byte[] buffer = _getBuffer(bufferIndex);
+      int bufferSize = _getBufferSize(buffer, bufferIndex);
+
+      return bufferSize - _bufferPos;
+    }
+
+    // Advance the current buffer to a certain position.
+    private void _advanceTo(int pos, int bufferSize)
+    {
+      if (pos >= bufferSize)
+      {
+        _bufferPos = 0;
+        _bufferIndex = _bufferIndex + 1;
+        if (_bufferIndex >= _bufferList.size())
+          _bufferIndex = -1;
+      }
+      else
+      {
+        _bufferPos = pos;
+      }
+    }
+
+    // Return the size of a given buffer. (The last buffer
+    // may not be completely full.)
+    private int _getBufferSize(byte[] buffer, int bufferIndex)
+    {
+      if (bufferIndex == _bufferList.size() - 1)
+        return _sizeOfLastBuffer;
+      
+      return buffer.length;
+    }
+
+    // Return a buffer.
+    private byte[] _getBuffer(int bufferIndex)
+    {
+      return _bufferList.get(bufferIndex);
+    }
+
+    // ArrayList of all the buffers
+    private List<byte[]> _bufferList;
+    // The number of bytes in the last buffer (which may not be full)
+    private int  _sizeOfLastBuffer;
+
+    // Current index into _bufferList
+    private int  _bufferIndex;
+
+    // Current position in _bufferList[_bufferIndex]
+    private int  _bufferPos;
+  }
+
+
+  private String     _filename;
+  private String     _contentType;
+
+  // Total length fo the content, whether in memory or on disk
+  transient private long       _length;
+
+  // File where the content is stored (or null if the content
+  // is in memory)
+  transient private File       _file;
+
+  // ArrayList of all the in-memory buffers (or null if it's in
+  // a File)
+  transient private ArrayList<byte[]> _buffers;
+  // The number of bytes in the last buffer (which may not be full)
+  transient private int        _sizeOfLastBuffer;
+
+  // Buffer sizes.  The memory buffer size can be very small
+  // because of our list-of-small-buffers technique;  for disk I/O,
+  // use a larger buffer.
+  static private final int _MEMORY_BUFFER_SIZE = 2048;
+  static private final int _DISK_BUFFER_SIZE   = 8192;
+}

Added: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFileProcessorImpl.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFileProcessorImpl.java?view=auto&rev=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFileProcessorImpl.java (added)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFileProcessorImpl.java Mon Dec  4 18:02:50 2006
@@ -0,0 +1,154 @@
+/*
+ * Copyright  2002-2006 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.myfaces.trinidadinternal.config.upload;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.faces.context.ExternalContext;
+import javax.servlet.ServletRequest;
+
+import org.apache.myfaces.trinidad.model.UploadedFile;
+import org.apache.myfaces.trinidad.webapp.UploadedFileProcessor;
+
+public class UploadedFileProcessorImpl implements UploadedFileProcessor
+{
+  public UploadedFileProcessorImpl()
+  {
+  }
+
+  public void init(ExternalContext context)
+  {
+    //
+    // Get MaxMemory and TempDir properties from servlet init params
+    //
+    if (_maxMemory == -1)
+    {
+      String maxMemory = context.getInitParameter(
+                                 MAX_MEMORY_PARAM_NAME);
+      if (maxMemory != null)
+      {
+        try
+        {
+          _maxMemory = Integer.parseInt(maxMemory);
+        }
+        catch (NumberFormatException nfe)
+        {
+          _maxMemory = _DEFAULT_MAX_MEMORY;
+        }
+      }
+      else
+      {
+        _maxMemory = _DEFAULT_MAX_MEMORY;
+      }
+    }
+      
+    if (_maxDiskSpace == -1)
+    {
+      String maxDiskSpace = context.getInitParameter(
+                                                  MAX_DISK_SPACE_PARAM_NAME);
+      if (maxDiskSpace != null)
+      {
+        try
+        {
+          _maxDiskSpace = Integer.parseInt(maxDiskSpace);
+        }
+        catch (NumberFormatException nfe)
+        {
+          _maxMemory = _DEFAULT_MAX_DISK_SPACE;
+        }
+      }
+      else
+      {
+        _maxDiskSpace = _DEFAULT_MAX_DISK_SPACE;
+      }
+    }
+    
+    if (_tempDir == null)
+    {
+      _tempDir = context.getInitParameter(TEMP_DIR_PARAM_NAME);
+      // Use the webapp temporary directory if the temporary directory
+      // has not been explicitly set.
+      if (_tempDir == null)
+      {
+        File tempDirFile = (File)
+          context.getApplicationMap().get("javax.servlet.context.tempdir");
+        if (tempDirFile != null)
+          _tempDir = tempDirFile.getAbsolutePath();
+      }
+    }
+  }
+
+  public UploadedFile processFile(ExternalContext ec,
+                                  UploadedFile tempFile)
+    throws IOException
+  {
+    RequestInfo info = _getRequestInfo(ec);
+
+    // Process one new file, loading only as much as can fit
+    // in the remaining memory and disk space.
+    UploadedFileImpl file = new UploadedFileImpl();
+    file.loadFile(tempFile,
+                  _maxMemory - info.totalBytesInMemory,
+                  _maxDiskSpace - info.totalBytesOnDisk,
+                  _tempDir);
+
+    // Keep a tally of how much we've stored in memory and on disk.
+    long length = file.getLength();
+    if (file.__isInMemory())
+    {
+      info.totalBytesInMemory += length;
+    }
+    else
+    {
+      info.totalBytesOnDisk += length;
+    }
+
+    return file;
+  }
+
+  private RequestInfo _getRequestInfo(ExternalContext ec)
+  {
+    @SuppressWarnings("unchecked")      
+    RequestInfo info = (RequestInfo) ec.getRequestMap().get(_REQUEST_INFO_KEY);
+    
+    if (info == null)
+    {
+      info = new RequestInfo();
+      ec.getRequestMap().put(_REQUEST_INFO_KEY, info);
+    }
+    
+    return info;
+  }
+
+
+  static private class RequestInfo
+  {
+    public long totalBytesInMemory;
+    public long totalBytesOnDisk;
+  }
+
+  private long   _maxMemory = -1;
+  private long   _maxDiskSpace = -1;
+  private String _tempDir = null;
+
+  private static final long _DEFAULT_MAX_MEMORY = 102400;
+  private static final long _DEFAULT_MAX_DISK_SPACE = 2048000;
+
+  private static final String _REQUEST_INFO_KEY = UploadedFileProcessorImpl.class.getName()+
+    ".UploadedFilesInfo";
+
+}

Added: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFiles.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFiles.java?view=auto&rev=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFiles.java (added)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/config/upload/UploadedFiles.java Mon Dec  4 18:02:50 2006
@@ -0,0 +1,252 @@
+/*
+ * Copyright  2002-2006 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.myfaces.trinidadinternal.config.upload;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.portlet.PortletRequest;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.myfaces.trinidad.model.UploadedFile;
+
+import org.apache.myfaces.trinidadinternal.share.util.CaboHttpUtils;
+
+/**
+ * UploadedFiles defines the set of files that have been uploaded
+ * to the server.
+ * 
+ * @version $Name:  $ ($Revision: adfrt/faces/adf-faces-impl/src/main/java/oracle/adfinternal/view/faces/webapp/UploadedFiles.java#0 $) $Date: 10-nov-2005.18:49:05 $
+ * @author The Oracle ADF Faces Team
+ */
+final public class UploadedFiles
+{
+  /**
+   * Returns the map of uploaded files for the current request.
+   */
+  @SuppressWarnings("unchecked")
+  static public UploadedFiles getUploadedFiles(FacesContext context)
+  {
+    Map<String, Object> requestMap = 
+      context.getExternalContext().getRequestMap();
+    return (UploadedFiles) requestMap.get(_UPLOADED_FILES_KEY);
+  }
+
+  /**
+   * Store the character encoding for the current request.
+   */
+  static public void setCharacterEncoding(
+    ExternalContext externalContext,
+    String         encoding)
+  {
+    UploadedFiles files = (UploadedFiles)
+      externalContext.getRequestMap().get(_UPLOADED_FILES_KEY);
+    _setCharacterEncoding(files, encoding);
+  }
+  
+  static public void setCharacterEncoding(
+      HttpServletRequest req,
+      String encoding)
+  {
+    UploadedFiles files = (UploadedFiles)
+      req.getAttribute(_UPLOADED_FILES_KEY);
+    _setCharacterEncoding(files, encoding);
+  }
+  
+  static public void setCharacterEncoding(
+      PortletRequest req,
+      String encoding)
+  {
+    UploadedFiles files = (UploadedFiles)
+      req.getAttribute(_UPLOADED_FILES_KEY);
+    _setCharacterEncoding(files, encoding);
+  }
+
+  static private void _setCharacterEncoding(UploadedFiles files, String encoding)
+  {
+    if(files != null)
+    {
+      files._characterEncoding = encoding;
+    }
+  }
+
+  /**
+   * Returns a single uploaded file.
+   * @param name the name under which the file is stored.  In HTML forms,
+   *   this will be derived from the "name" set on the &lt;input&gt; tag.
+   */
+  public UploadedFile getUploadedFile(String name)
+  {
+    UploadedFile file = _map.get(name);
+    if (file == null)
+      return null;
+
+    return new FixFilename(file, _characterEncoding);
+  }
+
+
+  /**
+   * Returns an Iterator of the names of all uploaded files.
+   */
+  public Iterator<String> getUploadedNames()
+  {
+    return _map.keySet().iterator();
+  }
+
+  /**
+   * Dispose of all UploadedFiles.  This will happen automatically
+   * when the current request ends, so clients do not need to
+   * call this method.  However, if a developer is finished with
+   * processing files, this will free up resources earlier.
+   */
+  public void dispose()
+  {
+    Iterator<UploadedFile> iterator = _map.values().iterator();
+    while (iterator.hasNext())
+    {
+      UploadedFile file = iterator.next();
+      file.dispose();
+    }
+
+    _map.clear();
+
+    _totalMemory    = 0;
+    _totalDiskSpace = 0;
+  }
+
+  /**
+   * Creates an UploadedFiles.
+   */
+  @SuppressWarnings("unchecked")
+  UploadedFiles(ExternalContext externalContext)
+  {
+    externalContext.getRequestMap().put(_UPLOADED_FILES_KEY, this);
+    _map = new HashMap<String, UploadedFile>();
+  }
+
+  /**
+   * Store a single UploadedFile.
+   */
+  void __put(String name, UploadedFile file)
+  {
+    _map.put(name, file); 
+  }
+
+
+  /**
+   * Return the tally of total memory used.
+   */
+  public long getTotalMemory()
+  {
+    return _totalMemory;
+  }
+
+
+  /**
+   * Return the tally of total disk space used.
+   */
+  public long getTotalDiskSpace()
+  {
+    return _totalDiskSpace;
+  }
+
+
+
+  private long   _totalMemory;
+  private long   _totalDiskSpace;
+  private String _characterEncoding;
+  private final Map<String, UploadedFile> _map;
+
+  private static final String _UPLOADED_FILES_KEY = 
+    "org.apache.myfaces.trinidadinternal.webapp.UploadedFiles";
+
+  static public class FixFilename implements UploadedFile, Serializable
+  {
+    /**
+     * 
+     */
+    private static final long serialVersionUID = -8586594511769079566L;
+    
+    public FixFilename()
+    {
+      // For serialization
+    }
+
+    public FixFilename(UploadedFile file, String encoding)
+    {
+      _file = file;
+      _encoding = encoding;
+    }
+    
+    public String getFilename()
+    {
+      String filename = _file.getFilename();
+      if (_encoding == null)
+        return filename;
+
+      try
+      {
+        return CaboHttpUtils.decodeRequestParameter(filename,
+                                                    _encoding,
+                                                    null);
+      }
+      catch (UnsupportedEncodingException uee)
+      {
+        // Should never happen, since the encoding should have
+        // already been vetted in UploadedRequestWrapper
+        assert false;
+        return filename;
+      }
+    }
+
+    public String getContentType()
+    {
+      return _file.getContentType();
+    }
+
+    public long getLength()
+    {
+      return _file.getLength();
+    }
+
+    public Object getOpaqueData()
+    {
+      return _file.getOpaqueData();
+    }
+
+    public InputStream getInputStream() throws IOException
+    {
+      return _file.getInputStream();
+    }
+
+
+    public void dispose()
+    {
+      _file.dispose();
+    }
+
+    private UploadedFile _file;
+    private String       _encoding;
+  }
+}

Modified: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/FacesContextFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/FacesContextFactoryImpl.java?view=diff&rev=482451&r1=482450&r2=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/FacesContextFactoryImpl.java (original)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/FacesContextFactoryImpl.java Mon Dec  4 18:02:50 2006
@@ -16,7 +16,6 @@
 package org.apache.myfaces.trinidadinternal.context;
 
 import java.io.IOException;
-
 import java.util.Iterator;
 
 import javax.faces.application.Application;
@@ -30,8 +29,9 @@
 import javax.faces.lifecycle.Lifecycle;
 import javax.faces.render.RenderKit;
 
-import org.apache.myfaces.trinidad.logging.TrinidadLogger;
+import org.apache.myfaces.trinidad.config.GlobalConfigurator;
 import org.apache.myfaces.trinidad.context.RequestContext;
+import org.apache.myfaces.trinidadinternal.config.GlobalConfiguratorImpl;
 
 /**
  * Internal class that optimizes retrieval of the RenderKit by caching it
@@ -46,19 +46,46 @@
   public FacesContextFactoryImpl(FacesContextFactory factory)
   {
     _factory = factory;
+    _config = GlobalConfigurator.getInstance();
   }
 
   @Override
+  @SuppressWarnings ("unchecked")
   public FacesContext getFacesContext(
       Object context,
       Object request,
       Object response, 
       Lifecycle lifecycle)
   {
-    return new CacheRenderKit(_factory.getFacesContext(context,
-                                                       request,
-                                                       response,
-                                                       lifecycle));
+    FacesContext fc = _factory.getFacesContext(context, request, response, lifecycle);
+    ExternalContext ec = fc.getExternalContext();
+    if(!_config.isInitialized())
+    {
+      _config.init(ec);
+    }
+    
+    //The global configurator will make sure other configurators are run only once
+    if(!GlobalConfiguratorImpl.isRequestBegun(ec))
+    {
+      _config.beginRequest(ec);
+      ec.getApplicationMap().put(_CONFIG_IN_CONTEXT, Boolean.TRUE);
+    }
+    
+    return new CacheRenderKit(fc);
+  }
+  
+  /**
+   * Sets the configurator up to execute an endRequest when it is destroyed
+   * 
+   * @param fc
+   */
+  static void endRequestIfNecessary(FacesContext fc)
+  {
+    ExternalContext ec = fc.getExternalContext();
+    if(Boolean.TRUE.equals(ec.getApplicationMap().remove(_CONFIG_IN_CONTEXT)))
+    {
+      ec.getApplicationMap().put(_READY_FOR_CLEANUP, Boolean.TRUE);      
+    }
   }
 
   static public class CacheRenderKit extends FacesContext
@@ -66,7 +93,10 @@
     public CacheRenderKit(FacesContext base)
     {
       _base = base;
-      _external = new OverrideDispatch(base.getExternalContext());
+      
+      //SMO: TODO: is this still needed?
+      ExternalContext external = GlobalConfigurator.getInstance().getExternalContext(base.getExternalContext());
+      _external = new OverrideDispatch(external);
       setCurrentInstance(this);
     }
 
@@ -193,12 +223,6 @@
     }
 
     @Override
-    public void release()
-    {
-      _base.release();
-    }
-
-    @Override
     public void renderResponse()
     {
       _base.renderResponse();
@@ -210,6 +234,22 @@
       _base.responseComplete();
     }
 
+    @Override
+    public void release()
+    {
+      //=- Scott O'Bryan -=
+      // JSR-301 should allow us to call the cleanup.  So this and all logic
+      // pertaining to creation and cleanup of the configurator per request
+      // could probably go away.
+      ExternalContext ec = getExternalContext();
+      if(Boolean.TRUE.equals(ec.getApplicationMap().remove(_READY_FOR_CLEANUP)))
+      {
+        GlobalConfigurator.getInstance().endRequest(ec);      
+      }
+      
+      _base.release();
+    }
+    
     private final FacesContext    _base;
     private final ExternalContext _external;
     private String    _renderKitId;
@@ -245,11 +285,8 @@
     private final ExternalContext _decorated;
   }
 
+  static private final String _CONFIG_IN_CONTEXT = FacesContextFactoryImpl.class.getName()+".CONFIG_IN_CONTEXT";
+  static private final String _READY_FOR_CLEANUP = FacesContextFactoryImpl.class.getName()+".CONFIG_READY_FOR_CLEANUP";
   private final FacesContextFactory _factory;
-
-  // 2006-08-02; -= Simon Lessard =-
-  // There's nothing logged in this class at this time.
-  @SuppressWarnings("unused")
-  static private final TrinidadLogger _LOG =
-    TrinidadLogger.createTrinidadLogger(FacesContextFactoryImpl.class);
+  private final GlobalConfigurator _config;
 }

Modified: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextFactoryImpl.java?view=diff&rev=482451&r1=482450&r2=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextFactoryImpl.java (original)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextFactoryImpl.java Mon Dec  4 18:02:50 2006
@@ -17,6 +17,7 @@
 
 import java.util.List;
 
+import javax.faces.context.ExternalContext;
 import javax.servlet.ServletContext;
 
 import org.apache.myfaces.trinidad.context.RequestContext;
@@ -26,7 +27,7 @@
 
 import org.apache.myfaces.trinidad.util.ClassLoaderUtils;
 
-import org.apache.myfaces.trinidadinternal.webapp.ConfigParser;
+import org.apache.myfaces.trinidadinternal.config.ConfigParser;
 
 /**
  * @author The Oracle ADF Faces Team
@@ -38,25 +39,24 @@
   }
 
   @Override
-  public RequestContext createContext(Object context,
-                                       Object request)
+  public RequestContext createContext(ExternalContext externalContext)
   {
-    RequestContextImpl impl =  new RequestContextImpl(_getBean(context));
-    impl.init(request);
+    RequestContextImpl impl =  new RequestContextImpl(_getBean(externalContext));
+    impl.init(externalContext);
     impl.__setPageResolver(_pageResolver);
     impl.__setPageFlowScopeProvider(_pageFlowScopeProvider);
     return impl;
   }
 
-  private RequestContextBean _getBean(Object context)
+  private RequestContextBean _getBean(ExternalContext externalContext)
   {
     if (_bean == null)
     {
       synchronized (this)
       {
-        if (context instanceof ServletContext)
+        if(externalContext != null)
         {
-          _bean = ConfigParser.parseConfigFile((ServletContext) context);
+          _bean = ConfigParser.parseConfigFile(externalContext);
         }
         else
         {
@@ -83,7 +83,7 @@
         {
           _pageFlowScopeProvider = PageFlowScopeProviderImpl.sharedInstance();
         }
-      }
+      }      
     }
 
     return _bean;

Modified: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextImpl.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextImpl.java?view=diff&rev=482451&r1=482450&r2=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextImpl.java (original)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/RequestContextImpl.java Mon Dec  4 18:02:50 2006
@@ -27,6 +27,7 @@
 
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIViewRoot;
+import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 
 import javax.servlet.http.HttpServletRequest;
@@ -88,7 +89,7 @@
     _partialTargets = new HashSet<String>();
   }
 
-  public void init(Object request)
+  public void init(ExternalContext request)
   {
     attach();
   }

Modified: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/TrinidadPhaseListener.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/TrinidadPhaseListener.java?view=diff&rev=482451&r1=482450&r2=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/TrinidadPhaseListener.java (original)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/context/TrinidadPhaseListener.java Mon Dec  4 18:02:50 2006
@@ -18,14 +18,12 @@
 import java.util.Map;
 
 import javax.faces.context.FacesContext;
-
 import javax.faces.event.PhaseEvent;
 import javax.faces.event.PhaseId;
 import javax.faces.event.PhaseListener;
 
 import org.apache.myfaces.trinidad.context.RequestContext;
 import org.apache.myfaces.trinidad.context.RequestContextFactory;
-
 import org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl;
 
 /**
@@ -36,6 +34,11 @@
  */
 public class TrinidadPhaseListener implements PhaseListener
 {
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -1249678874100309402L;
+
   static public final String CACHED_REQUEST_CONTEXT =
     "org.apache.myfaces.trinidadinternal.context.CachedRequestContext";
 
@@ -61,11 +64,12 @@
   @SuppressWarnings("unchecked")
   public void afterPhase(PhaseEvent event)
   {
+    FacesContext context = event.getFacesContext();
+
     if (event.getPhaseId() == PhaseId.RESTORE_VIEW)
     {
       // Store off the current ViewRoot so we can check for a full page
       // render in response to a partial event.
-      FacesContext context = event.getFacesContext();
       context.getExternalContext().getRequestMap().put(INITIAL_VIEW_ROOT_KEY,
                                                        context.getViewRoot());
     }
@@ -81,7 +85,9 @@
         (event.getFacesContext().getResponseComplete()))
     {
       _releaseContextIfNecessary(event.getFacesContext());
+      FacesContextFactoryImpl.endRequestIfNecessary(context);
     }
+        
   }
 
   @SuppressWarnings("unchecked")
@@ -128,6 +134,7 @@
   @SuppressWarnings("unchecked")
   static private void _createContextIfNecessary(FacesContext fContext)
   {
+    
     Map<String, Object> requestMap = fContext.getExternalContext().getRequestMap();
     Boolean createdContext = (Boolean)
       requestMap.get(_CREATED_CONTEXT_KEY);
@@ -159,9 +166,7 @@
           }
 
           assert(factory != null);
-          context = factory.createContext(
-                             fContext.getExternalContext().getContext(),
-                             fContext.getExternalContext().getRequest());
+          context = factory.createContext(fContext.getExternalContext());
           requestMap.put(CACHED_REQUEST_CONTEXT, context);
         }
       }
@@ -181,9 +186,8 @@
       if (context != null)
         context.release();
     }
-
   }
-
+  
   static public final String INITIAL_VIEW_ROOT_KEY =
     "org.apache.myfaces.trinidadinternal.InitialViewRoot";
 
@@ -192,5 +196,6 @@
 
   static private final String _POSTBACK_KEY =
     "org.apache.myfaces.trinidadinternal.context.AdfFacesPhaseListener.POSTBACK";
+  
     
 }

Modified: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/CoreRenderKit.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/CoreRenderKit.java?view=diff&rev=482451&r1=482450&r2=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/CoreRenderKit.java (original)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/CoreRenderKit.java Mon Dec  4 18:02:50 2006
@@ -18,7 +18,6 @@
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.Writer;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -26,8 +25,8 @@
 
 import javax.faces.FactoryFinder;
 import javax.faces.application.ViewHandler;
-import javax.faces.component.UIComponent;
 import javax.faces.component.UICommand;
+import javax.faces.component.UIComponent;
 import javax.faces.component.UIData;
 import javax.faces.component.UIForm;
 import javax.faces.component.UIGraphic;
@@ -43,45 +42,38 @@
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseStream;
 import javax.faces.context.ResponseWriter;
-import javax.faces.render.Renderer;
 import javax.faces.render.RenderKit;
 import javax.faces.render.RenderKitFactory;
+import javax.faces.render.Renderer;
 import javax.faces.render.ResponseStateManager;
-
 import javax.servlet.ServletResponse;
 
-import org.apache.myfaces.trinidad.logging.TrinidadLogger;
-
-import org.apache.myfaces.trinidad.context.RequestContext;
 import org.apache.myfaces.trinidad.context.Agent;
-
+import org.apache.myfaces.trinidad.context.PartialPageContext;
+import org.apache.myfaces.trinidad.context.RenderingContext;
+import org.apache.myfaces.trinidad.context.RequestContext;
+import org.apache.myfaces.trinidad.logging.TrinidadLogger;
 import org.apache.myfaces.trinidad.render.DialogRenderKitService;
 import org.apache.myfaces.trinidad.render.ExtendedRenderKitService;
-
+import org.apache.myfaces.trinidad.render.RenderUtils;
+import org.apache.myfaces.trinidadinternal.agent.AgentUtil;
+import org.apache.myfaces.trinidadinternal.agent.TrinidadAgent;
+import org.apache.myfaces.trinidadinternal.config.dispatch.DispatchResponseConfiguratorImpl;
 import org.apache.myfaces.trinidadinternal.context.TrinidadPhaseListener;
-
-import org.apache.myfaces.trinidadinternal.io.DebugResponseWriter;
 import org.apache.myfaces.trinidadinternal.io.DebugHtmlResponseWriter;
+import org.apache.myfaces.trinidadinternal.io.DebugResponseWriter;
 import org.apache.myfaces.trinidadinternal.io.HtmlResponseWriter;
 import org.apache.myfaces.trinidadinternal.io.IndentingResponseWriter;
 import org.apache.myfaces.trinidadinternal.io.XhtmlResponseWriter;
-
-import org.apache.myfaces.trinidad.context.RenderingContext;
 import org.apache.myfaces.trinidadinternal.renderkit.RenderKitBase;
-import org.apache.myfaces.trinidad.render.RenderUtils;
-import org.apache.myfaces.trinidad.context.PartialPageContext;
 import org.apache.myfaces.trinidadinternal.renderkit.core.ppr.PartialPageContextImpl;
 import org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.PartialPageUtils;
 import org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.XhtmlRenderer;
 import org.apache.myfaces.trinidadinternal.renderkit.core.xhtml.XhtmlUtils;
+import org.apache.myfaces.trinidadinternal.renderkit.htmlBasic.HtmlCommandButtonRenderer;
 import org.apache.myfaces.trinidadinternal.renderkit.htmlBasic.HtmlCommandLinkRenderer;
 import org.apache.myfaces.trinidadinternal.renderkit.htmlBasic.HtmlFormRenderer;
-
-import org.apache.myfaces.trinidadinternal.agent.TrinidadAgent;
-import org.apache.myfaces.trinidadinternal.agent.AgentUtil;
-import org.apache.myfaces.trinidadinternal.renderkit.htmlBasic.HtmlCommandButtonRenderer;
 import org.apache.myfaces.trinidadinternal.share.util.CaboHttpUtils;
-import org.apache.myfaces.trinidadinternal.webapp.DispatchServletResponse;
 
 /**
  * RenderKit based on UIX.
@@ -514,7 +506,7 @@
       if (contentTypeList == null)
       {
         // default to content type captured by ServletFilter
-        contentTypeList = DispatchServletResponse.getContentType(fContext);
+        contentTypeList = DispatchResponseConfiguratorImpl.getContentType(fContext);
       }
 
       String[] acceptedTypes = (contentTypeList == null)

Modified: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SimpleInputFileRenderer.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SimpleInputFileRenderer.java?view=diff&rev=482451&r1=482450&r2=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SimpleInputFileRenderer.java (original)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SimpleInputFileRenderer.java Mon Dec  4 18:02:50 2006
@@ -23,7 +23,7 @@
 import org.apache.myfaces.trinidad.component.core.input.CoreInputFile;
 
 import org.apache.myfaces.trinidad.context.RenderingContext;
-import org.apache.myfaces.trinidadinternal.webapp.UploadedFiles;
+import org.apache.myfaces.trinidadinternal.config.upload.UploadedFiles;
 
 /**
  */

Modified: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/util/MultipartFormHandler.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/util/MultipartFormHandler.java?view=diff&rev=482451&r1=482450&r2=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/util/MultipartFormHandler.java (original)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/share/util/MultipartFormHandler.java Mon Dec  4 18:02:50 2006
@@ -23,9 +23,9 @@
 
 import java.util.StringTokenizer;
 
-import javax.servlet.ServletRequest;
-
+import javax.faces.context.ExternalContext;
 
+import org.apache.myfaces.trinidad.util.ExternalContextUtils;
 
 /**
  * MultipartFormHandler - parses an incoming file upload post.
@@ -42,6 +42,7 @@
  * <p>
  * @version $Name:  $ ($Revision: adfrt/faces/adf-faces-impl/src/main/java/oracle/adfinternal/view/faces/share/util/MultipartFormHandler.java#1 $) $Date: 11-nov-2005.14:59:39 $
  * @author The Oracle ADF Faces Team
+ * @author Scott O'Bryan
  */
 public class MultipartFormHandler
 {
@@ -49,28 +50,30 @@
   /**
    * Returns true if the servlet request is a multipart request.
    */
-  static public boolean isMultipartRequest(ServletRequest request)
+  static public boolean isMultipartRequest(final ExternalContext externalContext)
   {
-    String contentType = request.getContentType();
+    final String contentType =   ExternalContextUtils.getContentType(externalContext);
+    
     if (contentType == null)
+    {
       return false;
+    }
 
-    return (contentType.startsWith(_MULTIPART_REQUEST_TYPE) &&
-            (request.getAttribute(_HANDLED) == null));
+    return contentType.startsWith(_MULTIPART_REQUEST_TYPE) && externalContext.getRequestMap().get(_HANDLED) == null;
   }
 
   /**
    * Create a MultipartFormHandler for the given servlet request.
    */
-  public MultipartFormHandler(ServletRequest request)
-    throws IOException
+  public MultipartFormHandler(final ExternalContext externalContext) throws IOException
   {
-    this(request.getContentType(), request.getInputStream());
+    
+    this(ExternalContextUtils.getContentType(externalContext), ExternalContextUtils.getRequestInputStream(externalContext));
 
     // make sure that we don't try to decode this multi part request at a
     // later time; ie: if we do a forward.
-    request.setAttribute(_HANDLED, Boolean.TRUE);
-    _contentStreamSize = request.getContentLength();
+    externalContext.getRequestMap().put(_HANDLED, Boolean.TRUE);
+    _contentStreamSize = ExternalContextUtils.getContentLength(externalContext);
   }
 
   /**
@@ -81,20 +84,18 @@
    *             must define the multipart boundary value.
    * @param in The InputStream which provides the multipart/form-data content
    */
-  public MultipartFormHandler(String type, InputStream in)
-    throws IOException
+  public MultipartFormHandler(final String type, final InputStream in) throws IOException
   {
     if (!type.startsWith(_MULTIPART_REQUEST_TYPE))
+    {
       throw new IllegalStateException("Content is not multipart form data");
+    }
 
     _boundary = _parseBoundary(type);
-
     _in = in;
-
     _skipBoundary();
   }
 
-
   /**
    * Gets the character enocoding.
    */
@@ -103,7 +104,6 @@
     return _characterEncoding;
   }
 
-
   /**
    * Sets the character encoding.  If left to default,
    * Strings will be decoded for ISO-8859-1.  Clients
@@ -111,8 +111,7 @@
    * expect another part of their processing to decode
    * the strings for them.
    */
-  public void setCharacterEncoding(String characterEncoding)
-    throws UnsupportedEncodingException
+  public void setCharacterEncoding(final String characterEncoding) throws UnsupportedEncodingException
   {
     CaboHttpUtils.validateEncoding(characterEncoding);
     _characterEncoding = characterEncoding;
@@ -137,7 +136,6 @@
     return _contentStreamSize;
   }
 
-
   /**
    * Sets the maximum number of bytes that MultipartFormItem.writeFile()
    * will be allowed to write.  This value may be set immediately
@@ -150,7 +148,7 @@
    * to 128MB.
    * @see org.apache.myfaces.trinidadinternal.share.util.MultipartFormItem#writeFile
    */
-  public void setMaximumAllowedBytes(long maxAllowedBytes)
+  public void setMaximumAllowedBytes(final long maxAllowedBytes)
   {
     _maxAllowedBytes = Math.max(0L, maxAllowedBytes);
   }
@@ -168,22 +166,27 @@
    * Returns the next MultipartStreamItem from the request, or null if no
    * more are present.
    */
-  public MultipartFormItem getNextPart()
-    throws IOException
+  public MultipartFormItem getNextPart() throws IOException
   {
-    MultipartFormItemImpl previous = _currentItem;
+    final MultipartFormItemImpl previous = _currentItem;
     if (previous != null)
+    {
       previous.finish();
+    }
 
     //The first line is content-disposition
-    String dispositionText = _readLine(false);
+    final String dispositionText = _readLine(false);
     if (dispositionText == null)
+    {
       return null;
-    Disposition disposition = new Disposition(dispositionText);
+    }
+    final Disposition disposition = new Disposition(dispositionText);
 
-    String contentTypeText = _readLine(false);
+    final String contentTypeText = _readLine(false);
     if (contentTypeText == null)
+    {
       return null;
+    }
     String contentType = _parseContentType(contentTypeText);
 
     if (contentType == null)
@@ -193,10 +196,12 @@
     else
     {
       //Eat empty line
-      String emptyLine = _readLine(true);
+      final String emptyLine = _readLine(true);
       if (emptyLine.length() > 0)
+      {
         // =-=AEW Better exception?
         throw new IOException();
+      }
     }
 
     // Create the MultipartFormItem using the previously created
@@ -205,13 +210,11 @@
     return _currentItem;
   }
 
-
   //Reads a line and makes sure it is a boundary.  Throws an exception
   //if the line is not a boundary
-  private void _skipBoundary()
-    throws IOException
+  private void _skipBoundary() throws IOException
   {
-    String line = _readLine(true);
+    final String line = _readLine(true);
 
     //A boundary must be a boundary, otherwise the stream is corrupt
     if (!line.startsWith(_boundary))
@@ -221,30 +224,28 @@
     }
   }
 
-
   //Reads a line from the stream.  If required is true then throws an
   //Exception if the line cannot be read.
-  private String _readLine(boolean required)
-    throws IOException
+  private String _readLine(final boolean required) throws IOException
   {
     return _readLine(required, false, true);
   }
 
   //Reads a line from the stream.  If required is true then throws an
   //Exception if the line cannot be read.
-  private String _readLine(boolean required,
-                           boolean decodeEncoding,
-                           boolean stripNewLines)
-    throws IOException
+  private String _readLine(final boolean required, final boolean decodeEncoding, final boolean stripNewLines)
+  throws IOException
   {
-    byte[] data  = _lineBuffer;
-    int    bytes = _readLine(data, 0, data.length);
+    final byte[] data = _lineBuffer;
+    final int bytes = _readLine(data, 0, data.length);
 
     String line = null;
     if (bytes < 0)
     {
       if (required)
+      {
         throw new EOFException();
+      }
     }
     else
     {
@@ -255,14 +256,12 @@
 
   // This is a replacement for ServletInputStream.readLine().  We use
   // this utility method instead as we don't always have a ServletInputStream.
-  private int _readLine(
-    byte[]      buffer,
-    int         offset,
-    int         length
-    ) throws IOException
+  private int _readLine(final byte[] buffer, int offset, final int length) throws IOException
   {
     if (length <= 0)
+    {
       return 0;
+    }
 
     int count = 0;
     int c;
@@ -274,24 +273,26 @@
     // be of doubtful value.
     while ((c = _in.read()) != -1)
     {
-      buffer[offset++] = (byte)c;
+      buffer[offset++] = (byte) c;
       count++;
 
       // Found a newline;  we're done.
       if (c == '\n')
+      {
         break;
+      }
 
       // Out of space; we're done too.
       // Read one character less so that we can account for CR
-      if (count == length-1)
+      if (count == length - 1)
       {
         // If we've found a CR, then we're not quite done;  we'd
         // better read over the next character (which might be a LF);
         // othewise, the LF gets processed as a bonus newline.
         if (c == '\r')
         {
-          int nextchar = _in.read();
-          buffer[offset++] = (byte)nextchar;
+          final int nextchar = _in.read();
+          buffer[offset++] = (byte) nextchar;
           count++;
         }
 
@@ -300,28 +301,28 @@
     }
 
     _totalBytesRead += count;
-    return (count > 0) ? count : -1;
+    return count > 0 ? count : -1;
   }
 
-  private String _dataToString(
-    byte[]  data,
-    int     start,
-    int     bytes,
-    boolean decodeEncoding,
-    boolean stripNewLines)
+  private String _dataToString(final byte[] data, final int start, int bytes, final boolean decodeEncoding,
+      boolean stripNewLines)
   {
     if (bytes > 0)
     {
       int i = 0;
 
       // Strip off up to the last two CR/LF's automatically
-      while ((i < 2) && (bytes > 0))
+      while (i < 2 && bytes > 0)
       {
-        byte lastChar = data[start + bytes - 1];
-        if ((lastChar == '\r') || (lastChar == '\n'))
+        final byte lastChar = data[start + bytes - 1];
+        if (lastChar == '\r' || lastChar == '\n')
+        {
           bytes--;
+        }
         else
+        {
           break;
+        }
 
         i++;
       }
@@ -329,7 +330,7 @@
       // If we *don't* want to strip new lines, but we just did,
       // then put back a '\n' (doing it this way means that
       // we force any combo of CR/LF/etc. into '\n', which is our intention.)
-      if (!stripNewLines && (i > 0))
+      if (!stripNewLines && i > 0)
       {
         bytes++;
         data[start + bytes - 1] = '\n';
@@ -343,13 +344,13 @@
       // platform byte converter.  Whereas we explicitly want
       // to do _no_ byte conversion whatsoever, which is what
       // this constructor does.
-      if (decodeEncoding && (_characterEncoding != null))
+      if (decodeEncoding && _characterEncoding != null)
       {
         try
         {
           return new String(data, start, bytes, _characterEncoding);
         }
-        catch (UnsupportedEncodingException uee)
+        catch (final UnsupportedEncodingException uee)
         {
           // Shouldn't happen - we trap unsupported encodings
           // in setCharacterEncoding()... but fall through anyway
@@ -362,7 +363,7 @@
         {
           return new String(data, start, bytes, "ISO-8859-1");
         }
-        catch (UnsupportedEncodingException uee)
+        catch (final UnsupportedEncodingException uee)
         {
           // Shouldn't happen - we trap unsupported encodings
           // in setCharacterEncoding()... but fall through anyway
@@ -375,22 +376,20 @@
   }
 
   // Parse out the boundary text from the content type
-  static private String _parseBoundary(String contentType)
+  static private String _parseBoundary(final String contentType)
   {
-    int boundaryStart = contentType.indexOf(_BOUNDARY_PARAMETER);
+    final int boundaryStart = contentType.indexOf(_BOUNDARY_PARAMETER);
     if (boundaryStart < 0)
+    {
       return null;
+    }
 
     // Boundary always starts with "--"
-    return "--" +
-           contentType.substring(boundaryStart +
-                                 _BOUNDARY_PARAMETER.length());
+    return "--" + contentType.substring(boundaryStart + _BOUNDARY_PARAMETER.length());
   }
 
-
   //Reads the ContentType string out of a line of the incoming request
-  private String _parseContentType(String line)
-    throws IOException
+  private String _parseContentType(String line) throws IOException
   {
     String contentType = null;
 
@@ -398,7 +397,7 @@
 
     if (line.startsWith(_CONTENT_TYPE_PARAMETER))
     {
-      int start = line.indexOf(" ");
+      final int start = line.indexOf(" ");
 
       if (start == -1)
       {
@@ -419,29 +418,25 @@
     return contentType;
   }
 
-
-
   // Implementation of MultipartFormItem
-  private class MultipartFormItemImpl
-    implements MultipartFormItem
+  private class MultipartFormItemImpl implements MultipartFormItem
   {
-    MultipartFormItemImpl(
-      Disposition disposition,
-      String contentType) throws IOException
+    MultipartFormItemImpl(final Disposition disposition, final String contentType) throws IOException
     {
       _disposition = disposition;
       _contentType = contentType;
 
       // This is a parameter
       if (disposition.getFilename() == null)
+      {
         _parameterValue = _readParameter();
+      }
 
     }
 
     public void finish() throws IOException
     {
-      if ((_parameterValue == null) &&
-          !_finished)
+      if (_parameterValue == null && !_finished)
       {
         if (_inputStream == null)
         {
@@ -476,54 +471,58 @@
       return _contentType;
     }
 
-    public long writeFile(OutputStream out)
-      throws IOException
+    public long writeFile(final OutputStream out) throws IOException
     {
       // This isn't a file!
       if (_parameterValue != null)
+      {
         // =-=AEW Better exception?  We could just write
         // the value out to their output stream instead
         // of complaining, but this is probably not what
         // they really want.
         throw new IOException("Item is not a file");
-
+      }
 
       // The file's already been written, or at least
       // skipped over.
       if (_finished)
+      {
         // =-=AEW Better exception?
         throw new IOException("Item has already been read past.");
+      }
 
       if (_inputStream != null)
+      {
         // =-=AEW Better exception?
         throw new IOException("Input stream has already been requested.");
+      }
 
-      long   totalBytesWritten = 0;
+      long totalBytesWritten = 0;
 
       // ServletInputStream.readLine() has the annoying habit of adding a \r\n
       // to the end of the last line.
       // Since we want a byte-for-byte transfer, don't write the \r\n from the
       // end of a line until we have verified that we have another line.
-      boolean addCRLF     = false;
-      int  numbuf  = 0;
-      byte[] buffer     = __getStreamBuffer();
-      int    bufferSize = buffer.length;
-      while((numbuf = _readLine(buffer, 0, bufferSize)) != -1)
+      boolean addCRLF = false;
+      int numbuf = 0;
+      final byte[] buffer = __getStreamBuffer();
+      final int bufferSize = buffer.length;
+      while ((numbuf = _readLine(buffer, 0, bufferSize)) != -1)
       {
         // Check for boundary
-        if(numbuf > 2 && buffer[0] == '-' && buffer[1] == '-')   // quick pre-check
+        if (numbuf > 2 && buffer[0] == '-' && buffer[1] == '-') // quick pre-check
         {
-          String line = _dataToString(buffer, 0, numbuf, false, true);
-          if(line.startsWith(_boundary))
+          final String line = _dataToString(buffer, 0, numbuf, false, true);
+          if (line.startsWith(_boundary))
           {
-              break;
+            break;
           }
         }
 
         // Are we supposed to write \r\n from the last iteration?
-        if(addCRLF)
+        if (addCRLF)
         {
-          if(out != null)
+          if (out != null)
           {
             out.write('\r');
             out.write('\n');
@@ -532,69 +531,75 @@
           addCRLF = false;
         }
         // Postpone any ending \r\n until the next iteration
-        if(numbuf >= 2 &&
-           buffer[numbuf - 2] == '\r' &&
-           buffer[numbuf - 1] == '\n')
+        if (numbuf >= 2 && buffer[numbuf - 2] == '\r' && buffer[numbuf - 1] == '\n')
         {
-            numbuf -= 2;    // skip the last 2 chars
-            addCRLF = true;     // make a note to write them on the next iteration
+          numbuf -= 2; // skip the last 2 chars
+          addCRLF = true; // make a note to write them on the next iteration
         }
-        if(out != null)
+        if (out != null)
         {
           totalBytesWritten += numbuf;
           if (totalBytesWritten <= _maxAllowedBytes)
+          {
             out.write(buffer, 0, numbuf);
+          }
         }
       }
-      
+
       _finished = true;
 
       if (totalBytesWritten >= _maxAllowedBytes)
-        throw new EOFException("Uploaded file of length " + totalBytesWritten +
-                               " bytes exceeded maximum allowed length ("
-                               + _maxAllowedBytes + " bytes)");
+      {
+        throw new EOFException("Uploaded file of length " + totalBytesWritten
+            + " bytes exceeded maximum allowed length (" + _maxAllowedBytes + " bytes)");
+      }
       return totalBytesWritten;
     }
 
-    public InputStream getInputStream()
-      throws IOException
+    public InputStream getInputStream() throws IOException
     {
       if (_parameterValue != null)
+      {
         // =-=AEW Better exception?  We could just give
         // them a StringInputStream, but this probably
         // isn't what they want
         throw new IOException("Item is not a file");
+      }
 
       if (_finished)
+      {
         // =-=AEW Better exception?
         throw new IOException("Item has already been read past.");
+      }
 
       if (_inputStream != null)
+      {
         // =-=AEW Better exception?
         throw new IOException("Input stream has already been requested.");
+      }
 
       _inputStream = new MultipartInputStream();
       return _inputStream;
     }
 
-    private String _readParameter()
-      throws IOException
+    private String _readParameter() throws IOException
     {
       // Create the buffer.  It's no use reusing the buffer,
       // since the String object sent out will end up "owning"
       // the storage of the StringBuffer
-      StringBuffer buffer = new StringBuffer(200);
-      for (String line = _readLine(false, true, false);
-           (line != null) && !line.startsWith(_boundary);
-           line = _readLine(false, true, false))
+      final StringBuffer buffer = new StringBuffer(200);
+      for (String line = _readLine(false, true, false); line != null
+      && !line.startsWith(_boundary); line = _readLine(false, true, false))
       {
         buffer.append(line);
       }
 
       // Trim the final newline
-      int length = buffer.length();
+      final int length = buffer.length();
       if (buffer.charAt(length - 1) == '\n')
+      {
         buffer.deleteCharAt(length - 1);
+      }
 
       // =-=AEW Trim the buffer before toString()'ing?  The
       // usual time/space tradeoff.
@@ -603,35 +608,36 @@
 
     private MultipartInputStream _inputStream;
 
-    private Disposition _disposition;
+    private Disposition          _disposition;
 
-    private String _contentType;
+    private String               _contentType;
 
-    private String _parameterValue;
+    private String               _parameterValue;
 
     // For a file item, has the file been read?
-    private boolean _finished;
-
+    private boolean              _finished;
 
     private class MultipartInputStream extends InputStream
     {
-      MultipartInputStream()
-        throws IOException
+      MultipartInputStream() throws IOException
       {
         // This isn't a file!
         if (_parameterValue != null)
+        {
           // =-=AEW Better exception?  We could just write
           // the value out to their output stream instead
           // of complaining, but this is probably not what
           // they really want.
           throw new IOException("Item is not a file");
-
+        }
 
         // The file's already been written, or at least
         // skipped over.
         if (_finished)
+        {
           // =-=AEW Better exception?
           throw new IOException("Item has already been read past.");
+        }
 
         _begin = 0;
         _end = 0;
@@ -650,7 +656,7 @@
             ;
           }
         }
-        catch (IOException e)
+        catch (final IOException e)
         {
           // Don't care...
           ;
@@ -659,8 +665,7 @@
 
       //Fills up the _buffer parameter with
       //Returns false on EOF
-      private void readLine()
-        throws IOException
+      private void readLine() throws IOException
       {
         if (_finished)
         {
@@ -674,39 +679,36 @@
           _addCRLF = false;
         }
 
-        int  bufferSize = _buffer.length;
-        int  numbuf  = _readLine(_buffer, _end, (bufferSize-_end));
+        final int bufferSize = _buffer.length;
+        int numbuf = _readLine(_buffer, _end, (bufferSize - _end));
         if (numbuf < 0)
         {
           _finished = true;
           return;
         }
-        
-        if(numbuf > 2 && _buffer[_end] == '-' && _buffer[_end+1] == '-')   // quick pre-check
+
+        if (numbuf > 2 && _buffer[_end] == '-' && _buffer[_end + 1] == '-') // quick pre-check
         {
           // Check for boundary
-          String line = _dataToString(_buffer, _end, numbuf, false, true);
-          if(line.startsWith(_boundary))
+          final String line = _dataToString(_buffer, _end, numbuf, false, true);
+          if (line.startsWith(_boundary))
           {
-            _finished = true; 
+            _finished = true;
             return;
           }
-        } 
-        
-        if(numbuf >= 2 &&
-           _buffer[_end+numbuf - 2] == '\r' &&
-           _buffer[_end+numbuf - 1] == '\n')
+        }
+
+        if (numbuf >= 2 && _buffer[_end + numbuf - 2] == '\r' && _buffer[_end + numbuf - 1] == '\n')
         {
           // Postpone any ending \r\n until the next iteration
-          numbuf -= 2;     // skip the last 2 chars
+          numbuf -= 2; // skip the last 2 chars
           _addCRLF = true; // make a note to write them on the next iteration
         }
         _end += numbuf;
       }
 
       @Override
-      public int read(byte[] buffer, int offset, int length)
-        throws IOException
+      public int read(final byte[] buffer, final int offset, final int length) throws IOException
       {
         int bytes = -1; // default to EOF
 
@@ -721,15 +723,15 @@
           {
             readLine();
           }
-          if(!_finished)
+          if (!_finished)
           {
             cachedBytes = _end - _begin;
-  
-            bytes = (length > cachedBytes) ? cachedBytes : length;
-  
+
+            bytes = length > cachedBytes ? cachedBytes : length;
+
             System.arraycopy(_buffer, _begin, buffer, offset, bytes);
             _begin += bytes;
-  
+
             //If we've written all the data out of the array, then reset
             //to the beginning of the array
             if (_begin == _end)
@@ -742,17 +744,15 @@
       }
 
       @Override
-      public int read(byte[] buffer)
-        throws IOException
+      public int read(final byte[] buffer) throws IOException
       {
         return read(buffer, 0, buffer.length);
       }
 
       @Override
-      public int read()
-        throws IOException
+      public int read() throws IOException
       {
-        byte[] temp = new byte[1];
+        final byte[] temp = new byte[1];
         int value;
 
         value = read(temp, 0, 1);
@@ -767,28 +767,29 @@
     }
 
     //Where data begins in the buffer
-    private int _begin;
+    private int     _begin;
+
     //Where date ends in the buffer
-    private int _end;
+    private int     _end;
 
     //Data read from the servlet
-    private byte[] _buffer;
+    private byte[]  _buffer;
 
     //If true then no more bytes can be read
     private boolean _addCRLF;
   }
 
-
   private class Disposition
   {
-    Disposition(String line)
-      throws IOException // =-=AEW Better exception?
+    Disposition(final String line) throws IOException // =-=AEW Better exception?
     {
       // =-=AEW This could be more efficient
-      StringTokenizer tokenizer = new StringTokenizer(line, ";");
+      final StringTokenizer tokenizer = new StringTokenizer(line, ";");
 
       if (!tokenizer.hasMoreTokens())
+      {
         throw new IOException();
+      }
 
       // The first token has to be "content-disposition: something"
       String disposition = tokenizer.nextToken().toLowerCase();
@@ -798,17 +799,18 @@
       }
 
       // Get everything after content-disposition, lose the white space...
-      disposition = disposition.substring(
-                     _CONTENT_DISPOSITION_PARAMETER.length()).trim();
+      disposition = disposition.substring(_CONTENT_DISPOSITION_PARAMETER.length()).trim();
 
       // ... and then make sure it's form-data.
       if (!disposition.equals(_FORM_DATA_DISPOSITION))
+      {
         throw new IOException();
+      }
 
       String filenameBuffer = null;
       while (tokenizer.hasMoreTokens())
       {
-        String keyValue = tokenizer.nextToken().trim();
+        final String keyValue = tokenizer.nextToken().trim();
         if (_name == null)
         {
           _name = _extractName(keyValue);
@@ -816,15 +818,21 @@
         else
         {
           if (filenameBuffer == null)
+          {
             filenameBuffer = keyValue;
           // Don't quit on the first semicolon - keep appending
+          }
           else
+          {
             filenameBuffer = filenameBuffer + ";" + keyValue;
+          }
         }
       }
 
       if (filenameBuffer != null)
+      {
         _filename = _extractFilename(filenameBuffer);
+      }
     }
 
     public final String getName()
@@ -837,21 +845,19 @@
       return _filename;
     }
 
-    private String _extractName(String keyValue)
+    private String _extractName(final String keyValue)
     {
       return _extractValue(keyValue, _NAME_PARAMETER);
     }
 
-    private String _extractFilename(String keyValue)
+    private String _extractFilename(final String keyValue)
     {
       String fileName = _extractValue(keyValue, _FILENAME_PARAMETER);
       try
       {
-        fileName = CaboHttpUtils.decodeRequestParameter(fileName,
-                                                        getCharacterEncoding(),
-                                                        null);
+        fileName = CaboHttpUtils.decodeRequestParameter(fileName, getCharacterEncoding(), null);
       }
-      catch (UnsupportedEncodingException uee)
+      catch (final UnsupportedEncodingException uee)
       {
         // Must never happen, because we always check the validity
         // of the encoding before it gets set
@@ -861,8 +867,7 @@
       // Strip off anything that corresponds to a path.
       if (fileName != null)
       {
-        int index =
-          Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
+        final int index = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
 
         if (index != -1)
         {
@@ -873,20 +878,22 @@
       return fileName;
     }
 
-    private String _extractValue(
-      String keyValue,
-      String param)
+    private String _extractValue(final String keyValue, final String param)
     {
-      int length = param.length();
+      final int length = param.length();
       if (keyValue.regionMatches(true, 0, param, 0, length))
       {
         // Remove the leading and trailing quotes
         int start = length;
         if (keyValue.charAt(start) == '"')
+        {
           start++;
+        }
         int end = keyValue.length();
         if (keyValue.charAt(end - 1) == '"')
+        {
           end--;
+        }
         return keyValue.substring(start, end);
       }
 
@@ -894,57 +901,61 @@
     }
 
     private String _name;
+
     private String _filename;
   }
 
   byte[] __getStreamBuffer()
   {
     if (_streamBuffer == null)
+    {
       _streamBuffer = new byte[_STREAM_BUFFER_SIZE];
+    }
     return _streamBuffer;
   }
 
+  private static final String   _MULTIPART_REQUEST_TYPE        = "multipart/form-data";
 
-  private static final String _MULTIPART_REQUEST_TYPE = "multipart/form-data";
-
-  private static final String _DEFAULT_CONTENT_TYPE =
-      "application/octet-stream";
+  private static final String   _DEFAULT_CONTENT_TYPE          = "application/octet-stream";
 
   //Parameter of the content type used to identify the boundary string
-  private static final String _BOUNDARY_PARAMETER = "boundary=";
+  private static final String   _BOUNDARY_PARAMETER            = "boundary=";
+
+  private static final String   _NAME_PARAMETER                = "name=";
 
-  private static final String _NAME_PARAMETER = "name=";
+  private static final String   _FILENAME_PARAMETER            = "filename=";
 
-  private static final String _FILENAME_PARAMETER = "filename=";
+  private static final String   _CONTENT_TYPE_PARAMETER        = "content-type";
 
-  private static final String _CONTENT_TYPE_PARAMETER = "content-type";
+  private static final String   _CONTENT_DISPOSITION_PARAMETER = "content-disposition:";
 
-  private static final String _CONTENT_DISPOSITION_PARAMETER =
-    "content-disposition:";
+  private static final String   _FORM_DATA_DISPOSITION         = "form-data";
 
-  private static final String _FORM_DATA_DISPOSITION =
-    "form-data";
+  private static final String   _HANDLED                       = "org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler.handled";
 
-  private static final String _HANDLED =
-    "org.apache.myfaces.trinidadinternal.share.util.MultipartFormHandler.handled";
+  private static final int      _STREAM_BUFFER_SIZE            = 65000;
 
-  private static final int _STREAM_BUFFER_SIZE = 65000;
-  private static final int _LINE_BUFFER_SIZE = 8000;
+  private static final int      _LINE_BUFFER_SIZE              = 8000;
 
   // Use one buffer for each of file streaming and line reading.
   // Not multithread
   // safe, but this class explicitly _can't_ multithread anyway.
-  private byte[]             _lineBuffer   = new byte[_LINE_BUFFER_SIZE];
-  private byte[]             _streamBuffer;
+  private final byte[]                _lineBuffer                    = new byte[_LINE_BUFFER_SIZE];
+
+  private byte[]                _streamBuffer;
+
+  private InputStream           _in;
+
+  private String                _boundary;
+
+  private MultipartFormItemImpl _currentItem;
+
+  private String                _characterEncoding;
 
-  private InputStream        _in;
-  private String             _boundary;
+  private long                  _maxAllowedBytes               = 1L << 27;
 
-  private MultipartFormItemImpl  _currentItem;
-  private String                 _characterEncoding;
+  private int                   _totalBytesRead;
 
-  private long _maxAllowedBytes = 1L << 27;
-  private int _totalBytesRead;
-  private int _contentStreamSize = -1;
+  private int                   _contentStreamSize             = -1;
 }
 

Modified: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinUtils.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinUtils.java?view=diff&rev=482451&r1=482450&r2=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinUtils.java (original)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/skin/SkinUtils.java Mon Dec  4 18:02:50 2006
@@ -29,9 +29,9 @@
 import java.util.Iterator;
 import java.util.List;
 
+import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 
-import javax.servlet.ServletContext;
 import javax.xml.parsers.SAXParserFactory;
 
 import org.apache.myfaces.trinidad.skin.SkinFactory;
@@ -102,7 +102,7 @@
    * @param context ServletContext, used to get the trinidad-skins.xml file.
    */
   static public void registerSkinExtensions(
-    ServletContext context)
+    ExternalContext context)
   {
 
     SkinFactory skinFactory = SkinFactory.getFactory();
@@ -292,7 +292,7 @@
    * @param skinFactory
    */
   private static void _registerSkinExtensions(
-    ServletContext context,
+    ExternalContext context,
     SkinFactory skinFactory)
   {
     if (context == null)
@@ -525,7 +525,7 @@
    * @return List of SkinNodes (skin elements) found in trinidad-skins.xml
    */
   private static SkinsNode _getWebInfSkinsNode(
-    ServletContext context)
+    ExternalContext context)
   {
     InputStream in = context.getResourceAsStream(_CONFIG_FILE);
     if (in != null)

Modified: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/ConfigParser.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/ConfigParser.java?view=diff&rev=482451&r1=482450&r2=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/ConfigParser.java (original)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/ConfigParser.java Mon Dec  4 18:02:50 2006
@@ -1,263 +0,0 @@
-/*
- * Copyright  2004-2006 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.myfaces.trinidadinternal.webapp;
-
-import java.io.InputStream;
-import java.io.IOException;
-import java.util.Locale;
-import java.util.TimeZone;
-
-import javax.servlet.ServletContext;
-
-import org.apache.myfaces.trinidad.logging.TrinidadLogger;
-import org.apache.myfaces.trinidad.bean.PropertyKey;
-import org.apache.myfaces.trinidad.webapp.UploadedFileProcessor;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.DefaultHandler;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParserFactory;
-
-import javax.faces.el.ValueBinding;
-
-import org.apache.myfaces.trinidad.util.ClassLoaderUtils;
-
-import org.apache.myfaces.trinidadinternal.context.RequestContextBean;
-import org.apache.myfaces.trinidadinternal.util.nls.LocaleUtils;
-
-
-
-/**
- *
- */
-public class ConfigParser
-{
-  /**
-   *
-   */
-  static public RequestContextBean parseConfigFile(
-    ServletContext context)
-  {
-    RequestContextBean bean = new RequestContextBean();
-
-    InputStream in = context.getResourceAsStream(_CONFIG_FILE);
-    if (in != null)
-    {
-      try
-      {
-        InputSource input = new InputSource();
-        input.setByteStream(in);
-        input.setPublicId(_CONFIG_FILE);
-
-        SAXParserFactory factory = SAXParserFactory.newInstance();
-        factory.setNamespaceAware(true);
-        XMLReader reader = factory.newSAXParser().getXMLReader();
-
-        reader.setContentHandler(new Handler(bean,context));
-        reader.parse(input);
-      }
-      catch (IOException ioe)
-      {
-        _LOG.warning(ioe);
-      }
-      catch (ParserConfigurationException pce)
-      {
-        _LOG.warning(pce);
-      }
-      catch (SAXException saxe)
-      {
-        _LOG.warning(saxe);
-      }
-      finally
-      {
-        try
-        {
-          in.close();
-        }
-        catch (IOException ioe)
-        {
-          // Ignore
-          ;
-        }
-      }
-    }
-
-    String className = (String)
-      bean.getProperty(RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY);
-    if (className != null)
-    {
-      className = className.trim();
-
-      try
-      {
-        Class<?> clazz = ClassLoaderUtils.loadClass(className);
-        bean.setProperty(RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY,
-                         clazz.newInstance());
-      }
-      catch (Exception e)
-      {
-        _LOG.severe("Could not instantiate UploadedFileProcessor", e);
-        bean.setProperty(RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY,
-                         new UploadedFileProcessorImpl());
-      }
-    }
-    else
-    {
-      bean.setProperty(RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY,
-                       new UploadedFileProcessorImpl());
-    }
-
-    UploadedFileProcessor ufp = (UploadedFileProcessor)
-      bean.getProperty(RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY);
-
-    ufp.init(context);
-
-    if (_LOG.isInfo())
-    {
-      Object debug = bean.getProperty(RequestContextBean.DEBUG_OUTPUT_KEY);
-      if (Boolean.TRUE.equals(debug))
-        _LOG.info("Trinidad is running in debug mode. "+
-                  "Do not use in a production environment. See:"+_CONFIG_FILE);
-    }
-    return bean;
-  }
-
-  static private class Handler extends DefaultHandler
-  {
-    public Handler(RequestContextBean bean,ServletContext context)
-    {
-      _context = context;
-      _bean = bean;
-    }
-
-    @Override
-    public void startElement(String uri,
-                             String localName,
-                             String qName,
-                             Attributes atts)
-    {
-      _currentText = "";
-    }
-
-    @Override
-    public void characters(char[] ch, int start, int length)
-    {
-      if (_currentText != null)
-        _currentText = _currentText + new String(ch, start, length);
-    }
-
-    @Override
-    public void endElement(String uri,
-                           String localName,
-                           String qName)
-    {
-      if ((_currentText != null) && !"".equals(_currentText))
-      {
-        PropertyKey key = _bean.getType().findKey(localName);
-        if (key == null)
-        {
-          if (_LOG.isWarning())
-            _LOG.warning("Element {0} is not understood", qName);
-        }
-        else
-        {
-          if (_currentText.startsWith("#{") &&
-              _currentText.endsWith("}"))
-          {
-            if (!key.getSupportsBinding())
-            {
-              if (_LOG.isWarning())
-                _LOG.warning("Element {0} does not support EL expressions.",
-                             qName);
-            }
-            else
-            {
-              ValueBinding binding =
-                LazyValueBinding.createValueBinding(_currentText);
-              _bean.setValueBinding(key, binding);
-            }
-          }
-          else
-          {
-            Object value;
-
-            if (key.getType() == Character.class)
-            {
-              value = _currentText.charAt(0);
-            }
-            else if (key.getType() == Integer.class)
-            {
-              value = _getIntegerValue(_currentText, qName);
-            }
-            else if (key.getType() == Boolean.class)
-            {
-              value = ("true".equalsIgnoreCase(_currentText)
-                       ? Boolean.TRUE : Boolean.FALSE);
-            }
-            else if (key.getType() == TimeZone.class)
-            {
-              value = TimeZone.getTimeZone(_currentText);
-            }
-            else if (key.getType() == Locale.class)
-            {
-              value = LocaleUtils.getLocaleForIANAString(_currentText);
-            }
-            else
-            {
-              value = _currentText;
-            }
-            if (key == RequestContextBean.REMOTE_DEVICE_REPOSITORY_URI){
-                _context.setAttribute("remote-device-repository-uri",value);
-            }
-            _bean.setProperty(key, value);
-          }
-        }
-      }
-
-      _currentText = null;
-    }
-
-  private static Integer _getIntegerValue(String text, String qName)
-  {
-    Integer value = null;
-    try
-    {
-      value = Integer.valueOf(text);
-    }
-    catch (NumberFormatException nfe)
-    {
-      if (_LOG.isWarning())
-      {
-        _LOG.warning("Element {0} only accepts integer values",
-                     qName);
-      }
-    }
-    return value;
-  }
-
-
-    private RequestContextBean _bean;
-    private String              _currentText;
-    private ServletContext _context;
-  }
-
-  static private final String _CONFIG_FILE = "/WEB-INF/trinidad-config.xml";
-  static private final TrinidadLogger _LOG = TrinidadLogger.createTrinidadLogger(ConfigParser.class);
-}

Modified: incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/DispatchServletResponse.java
URL: http://svn.apache.org/viewvc/incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/DispatchServletResponse.java?view=diff&rev=482451&r1=482450&r2=482451
==============================================================================
--- incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/DispatchServletResponse.java (original)
+++ incubator/adffaces/branches/jwaldman-portal/trinidad/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/webapp/DispatchServletResponse.java Mon Dec  4 18:02:50 2006
@@ -1,86 +0,0 @@
-/*
- * Copyright  2004-2006 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.myfaces.trinidadinternal.webapp;
-
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.faces.context.FacesContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpServletResponseWrapper;
-
-@SuppressWarnings("deprecation")
-public class DispatchServletResponse extends HttpServletResponseWrapper
-{
-  public DispatchServletResponse(
-    HttpServletResponse delegate,
-    HttpServletRequest  request)
-  {
-    super(delegate);
-    _request = request;
-  }
-
-  @Override
-  public void setContentType(
-    String contentTypeAndCharset)
-  {
-    if(contentTypeAndCharset != null)
-    {
-      Matcher matcher = _CONTENT_TYPE_PATTERN.matcher(contentTypeAndCharset);
-      if (matcher.matches())
-      {
-        String contentType = matcher.group(1);
-        String charset = (matcher.groupCount() > 1) ? matcher.group(2) : null; 
-        
-        // capture the content type on the request
-        _request.setAttribute(_CONTENT_TYPE_KEY, contentType);
-  
-        // TODO: use Agent APIs when available
-        if ("application/xhtml+xml".equals(contentType))
-        {
-          String userAgent = _request.getHeader("User-agent");
-          if (userAgent.indexOf("compatible; MSIE") != -1)
-          {
-            // IE must serve XHTML as text/html
-            contentTypeAndCharset = "text/html";
-  
-            if (charset != null)
-              contentTypeAndCharset += ";charset=" + charset;
-          }
-        }
-      }
-    }
-    super.setContentType(contentTypeAndCharset);
-  }
-  
-  @SuppressWarnings("unchecked")
-  static public String getContentType(
-    FacesContext context)
-  {
-    Map<String, Object> requestMap = context.getExternalContext().getRequestMap();
-    return (String) requestMap.get(_CONTENT_TYPE_KEY);
-  }
-  
-  private final HttpServletRequest _request;
- 
-  static private final String _CONTENT_TYPE_KEY = 
-                                  "org.apache.myfaces.trinidadinternal.CONTENT_TYPE";
-                                  
-  static private final Pattern _CONTENT_TYPE_PATTERN = 
-                                  Pattern.compile("([^;]+)(?:;charset=(.*))?");
-}