You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gr...@apache.org on 2006/01/02 21:02:35 UTC
svn commit: r365413 - in
/myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces:
component/html/util/MultipartRequestWrapper.java
custom/fileupload/HtmlFileUploadRenderer.java
Author: grantsmith
Date: Mon Jan 2 12:02:22 2006
New Revision: 365413
URL: http://svn.apache.org/viewcvs?rev=365413&view=rev
Log:
Patches for MYFACES-758
Modified:
myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/component/html/util/MultipartRequestWrapper.java
myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java
Modified: myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/component/html/util/MultipartRequestWrapper.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/component/html/util/MultipartRequestWrapper.java?rev=365413&r1=365412&r2=365413&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/component/html/util/MultipartRequestWrapper.java (original)
+++ myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/component/html/util/MultipartRequestWrapper.java Mon Jan 2 12:02:22 2006
@@ -29,45 +29,46 @@
* @version $Revision$ $Date$
*/
public class MultipartRequestWrapper
- extends HttpServletRequestWrapper
+ extends HttpServletRequestWrapper
{
private static Log log = LogFactory.getLog(MultipartRequestWrapper.class);
+ public static final String UPLOADED_FILES_ATTRIBUTE = "org.apache.myfaces.uploadedFiles";
- HttpServletRequest request = null;
- HashMap parametersMap = null;
- DiskFileUpload fileUpload = null;
- HashMap fileItems = null;
- int maxSize;
+ HttpServletRequest request = null;
+ HashMap parametersMap = null;
+ DiskFileUpload fileUpload = null;
+ HashMap fileItems = null;
+ int maxSize;
int thresholdSize;
String repositoryPath;
public MultipartRequestWrapper(HttpServletRequest request,
int maxSize, int thresholdSize,
String repositoryPath){
- super( request );
- this.request = request;
+ super( request );
+ this.request = request;
this.maxSize = maxSize;
this.thresholdSize = thresholdSize;
this.repositoryPath = repositoryPath;
- }
+ }
- private void parseRequest() {
- fileUpload = new DiskFileUpload();
- fileUpload.setFileItemFactory(new DefaultFileItemFactory());
- fileUpload.setSizeMax(maxSize);
+ private void parseRequest() {
+ fileUpload = new DiskFileUpload();
+ fileUpload.setFileItemFactory(new DefaultFileItemFactory());
+ fileUpload.setSizeMax(maxSize);
fileUpload.setSizeThreshold(thresholdSize);
if(repositoryPath != null && repositoryPath.trim().length()>0)
fileUpload.setRepositoryPath(repositoryPath);
- String charset = request.getCharacterEncoding();
- fileUpload.setHeaderEncoding(charset);
+ String charset = request.getCharacterEncoding();
+ fileUpload.setHeaderEncoding(charset);
- List requestParameters = null;
- try{
- requestParameters = fileUpload.parseRequest(request);
+ List requestParameters = null;
+ try{
+ requestParameters = fileUpload.parseRequest(request);
} catch (FileUploadBase.SizeLimitExceededException e) {
// TODO: find a way to notify the user about the fact that the uploaded file exceeded size limit
@@ -77,45 +78,45 @@
requestParameters = Collections.EMPTY_LIST;
- }catch(FileUploadException fue){
- log.error("Exception while uploading file.", fue);
- requestParameters = Collections.EMPTY_LIST;
- }
-
- parametersMap = new HashMap( requestParameters.size() );
- fileItems = new HashMap();
-
- for (Iterator iter = requestParameters.iterator(); iter.hasNext(); ){
- FileItem fileItem = (FileItem) iter.next();
-
- if (fileItem.isFormField()) {
- String name = fileItem.getFieldName();
-
- // The following code avoids commons-fileupload charset problem.
- // After fixing commons-fileupload, this code should be
- //
- // String value = fileItem.getString();
- //
- String value = null;
- if ( charset == null) {
- value = fileItem.getString();
- } else {
- try {
- value = new String(fileItem.get(), charset);
- } catch (UnsupportedEncodingException e){
- value = fileItem.getString();
- }
- }
-
- addTextParameter(name, value);
- } else { // fileItem is a File
- if (fileItem.getName() != null) {
- fileItems.put(fileItem.getFieldName(), fileItem);
- }
- }
- }
+ }catch(FileUploadException fue){
+ log.error("Exception while uploading file.", fue);
+ requestParameters = Collections.EMPTY_LIST;
+ }
+
+ parametersMap = new HashMap( requestParameters.size() );
+ fileItems = new HashMap();
+
+ for (Iterator iter = requestParameters.iterator(); iter.hasNext(); ){
+ FileItem fileItem = (FileItem) iter.next();
+
+ if (fileItem.isFormField()) {
+ String name = fileItem.getFieldName();
+
+ // The following code avoids commons-fileupload charset problem.
+ // After fixing commons-fileupload, this code should be
+ //
+ // String value = fileItem.getString();
+ //
+ String value = null;
+ if ( charset == null) {
+ value = fileItem.getString();
+ } else {
+ try {
+ value = new String(fileItem.get(), charset);
+ } catch (UnsupportedEncodingException e){
+ value = fileItem.getString();
+ }
+ }
+
+ addTextParameter(name, value);
+ } else { // fileItem is a File
+ if (fileItem.getName() != null) {
+ fileItems.put(fileItem.getFieldName(), fileItem);
+ }
+ }
+ }
- //Add the query string paramters
+ //Add the query string paramters
for (Iterator it = request.getParameterMap().entrySet().iterator(); it.hasNext(); )
{
Map.Entry entry = (Map.Entry)it.next();
@@ -125,61 +126,70 @@
addTextParameter((String)entry.getKey(), valuesArray[i]);
}
}
- }
+ }
+
+ private void addTextParameter(String name, String value){
+ if( ! parametersMap.containsKey( name ) ){
+ String[] valuesArray = {value};
+ parametersMap.put(name, valuesArray);
+ }else{
+ String[] storedValues = (String[])parametersMap.get( name );
+ int lengthSrc = storedValues.length;
+ String[] valuesArray = new String[lengthSrc+1];
+ System.arraycopy(storedValues, 0, valuesArray, 0, lengthSrc);
+ valuesArray[lengthSrc] = value;
+ parametersMap.put(name, valuesArray);
+ }
+ }
+
+ public Enumeration getParameterNames() {
+ if( parametersMap == null ) parseRequest();
+
+ return Collections.enumeration( parametersMap.keySet() );
+ }
- private void addTextParameter(String name, String value){
- if( ! parametersMap.containsKey( name ) ){
- String[] valuesArray = {value};
- parametersMap.put(name, valuesArray);
- }else{
- String[] storedValues = (String[])parametersMap.get( name );
- int lengthSrc = storedValues.length;
- String[] valuesArray = new String[lengthSrc+1];
- System.arraycopy(storedValues, 0, valuesArray, 0, lengthSrc);
- valuesArray[lengthSrc] = value;
- parametersMap.put(name, valuesArray);
- }
- }
-
- public Enumeration getParameterNames() {
- if( parametersMap == null ) parseRequest();
-
- return Collections.enumeration( parametersMap.keySet() );
- }
-
- public String getParameter(String name) {
- if( parametersMap == null ) parseRequest();
-
- String[] values = (String[])parametersMap.get( name );
- if( values == null )
- return null;
- return values[0];
- }
-
- public String[] getParameterValues(String name) {
- if( parametersMap == null ) parseRequest();
-
- return (String[])parametersMap.get( name );
- }
-
- public Map getParameterMap() {
- if( parametersMap == null ) parseRequest();
-
- return parametersMap;
- }
-
- // Hook for the x:inputFileUpload tag.
- public FileItem getFileItem(String fieldName) {
- if( fileItems == null ) parseRequest();
-
- return (FileItem) fileItems.get( fieldName );
- }
-
- /**
- * Not used internaly by MyFaces, but provides a way to handle the uploaded files
- * out of MyFaces.
- */
- public Map getFileItems(){
- return fileItems;
- }
+ public String getParameter(String name) {
+ if( parametersMap == null ) parseRequest();
+
+ String[] values = (String[])parametersMap.get( name );
+ if( values == null )
+ return null;
+ return values[0];
+ }
+
+ public String[] getParameterValues(String name) {
+ if( parametersMap == null ) parseRequest();
+
+ return (String[])parametersMap.get( name );
+ }
+
+ public Map getParameterMap() {
+ if( parametersMap == null ) parseRequest();
+
+ return parametersMap;
+ }
+
+ // Hook for the x:inputFileUpload tag.
+ public FileItem getFileItem(String fieldName) {
+ if( fileItems == null ) parseRequest();
+
+ return (FileItem) fileItems.get( fieldName );
+ }
+
+ /**
+ * Not used internaly by MyFaces, but provides a way to handle the uploaded files
+ * out of MyFaces.
+ */
+ public Map getFileItems(){
+ if( fileItems == null ) parseRequest();
+ return fileItems;
+ }
+
+
+ public Object getAttribute(String string) {
+ if (string.equals(UPLOADED_FILES_ATTRIBUTE)) {
+ return getFileItems();
+ }
+ return super.getAttribute(string);
+ }
}
Modified: myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java?rev=365413&r1=365412&r2=365413&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java (original)
+++ myfaces/tomahawk/trunk/src/main/java/org/apache/myfaces/custom/fileupload/HtmlFileUploadRenderer.java Mon Jan 2 12:02:22 2006
@@ -28,23 +28,25 @@
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
+import javax.faces.context.ExternalContext;
import javax.faces.render.Renderer;
import javax.faces.convert.ConverterException;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
+import java.util.Map;
/**
* @author Manfred Geiler (latest modification by $Author$)
* @version $Revision$ $Date$
*/
public class HtmlFileUploadRenderer
- extends Renderer
+ extends Renderer
{
private static final Log log = LogFactory.getLog(HtmlFileUploadRenderer.class);
public void encodeEnd(FacesContext facesContext, UIComponent uiComponent)
- throws IOException
+ throws IOException
{
super.encodeEnd(facesContext, uiComponent); //check for NP
@@ -57,10 +59,10 @@
UploadedFile value = (UploadedFile)((HtmlInputFileUpload)uiComponent).getValue();
if (value != null)
{
- if( value.getName() != null )
- {
- writer.writeAttribute(HTML.VALUE_ATTR, value.getName(), null);
- }
+ if( value.getName() != null )
+ {
+ writer.writeAttribute(HTML.VALUE_ATTR, value.getName(), null);
+ }
}
HtmlRendererUtils.renderHTMLAttributes(writer, uiComponent, HTML.INPUT_FILE_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED);
if (isDisabled(facesContext, uiComponent))
@@ -99,12 +101,38 @@
//Filters. We try to find the MultipartWrapper, but if a filter has wrapped
//the ServletRequest with a class other than HttpServletRequestWrapper
//this will fail.
- //todo: fix this to work in PortletRequest as well
+ Object request = facesContext.getExternalContext().getRequest();
+ if (!(request instanceof ServletRequest)) {
+ ExternalContext externalContext = facesContext.getExternalContext();
+ Map fileItems = (Map)externalContext.getRequestMap().
+ get(MultipartRequestWrapper.UPLOADED_FILES_ATTRIBUTE);
+ FileItem fileItem = null;
+ if (fileItems != null) {
+ String paramName = uiComponent.getClientId(facesContext);
+ fileItem = (FileItem) fileItems.get(paramName);
+ }
+ if (fileItem != null)
+ {
+ try{
+ UploadedFile upFile;
+ String implementation = ((HtmlInputFileUpload) uiComponent).getStorage();
+ if( implementation == null || ("memory").equals( implementation ) )
+ upFile = new UploadedFileDefaultMemoryImpl( fileItem );
+ else
+ upFile = new UploadedFileDefaultFileImpl( fileItem );
+ ((HtmlInputFileUpload)uiComponent).setSubmittedValue(upFile);
+ ((HtmlInputFileUpload)uiComponent).setValid(true);
+ }catch(IOException ioe){
+ log.error(ioe);
+ }
+ }
+ return;
+ }
if(facesContext.getExternalContext().getRequest() instanceof ServletRequest)
{
ServletRequest multipartRequest = (ServletRequest)facesContext.getExternalContext().getRequest();
while (multipartRequest != null &&
- !(multipartRequest instanceof MultipartRequestWrapper))
+ !(multipartRequest instanceof MultipartRequestWrapper))
{
if (multipartRequest instanceof HttpServletRequestWrapper)
{