[richfaces-svn-commits] JBoss Rich Faces SVN: r6232 - in trunk/sandbox/ui/fileUpload/src/main: java/org/richfaces/org/jboss/seam/web and 1 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Thu Feb 21 06:37:39 EST 2008


Author: andrei_exadel
Date: 2008-02-21 06:37:38 -0500 (Thu, 21 Feb 2008)
New Revision: 6232

Modified:
   trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/ui/renderkit/FileUploadRendererBase.java
   trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/web/MultipartFilter.java
   trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/web/MultipartRequest.java
   trunk/sandbox/ui/fileUpload/src/main/resources/org/richfaces/renderkit/html/js/FileUpload.js
Log:
Fix code review notes

Modified: trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/ui/renderkit/FileUploadRendererBase.java
===================================================================
--- trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/ui/renderkit/FileUploadRendererBase.java	2008-02-21 10:21:54 UTC (rev 6231)
+++ trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/ui/renderkit/FileUploadRendererBase.java	2008-02-21 11:37:38 UTC (rev 6232)
@@ -15,7 +15,6 @@
 import javax.faces.render.RenderKit;
 import javax.faces.render.RenderKitFactory;
 import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpSession;
 
 import org.ajax4jsf.context.AjaxContext;
 import org.ajax4jsf.context.AjaxContextImpl;
@@ -25,11 +24,11 @@
 import org.ajax4jsf.javascript.JSLiteral;
 import org.ajax4jsf.javascript.JSReference;
 import org.ajax4jsf.renderkit.AjaxRendererUtils;
-import org.ajax4jsf.renderkit.RendererUtils;
 import org.ajax4jsf.resource.CountingOutputWriter;
 import org.richfaces.component.UIProgressBar;
 import org.richfaces.event.UploadEvent;
 import org.richfaces.org.jboss.seam.ui.component.UIFileUpload;
+import org.richfaces.org.jboss.seam.web.MultipartFilter;
 import org.richfaces.org.jboss.seam.web.MultipartRequest;
 import org.richfaces.renderkit.TemplateEncoderRendererBase;
 
@@ -42,17 +41,6 @@
 public abstract class FileUploadRendererBase extends
 	TemplateEncoderRendererBase {
 
-    /** File name parameter name */
-    private static final String FILE_NAME_PARAMETER = "fileName";
-
-    /** Session bean name to store the percent value of uploading process */
-    public static final String _percentBeanName = "__percentValue$";
-
-    /** Session bean name to store the percent value of uploading process */
-    public static final String _progressInfoBeanName = "__ProgressInfo$";
-
-    private static final String _reRenderAllFlag = "reRenderAll";
-
     /*
      * (non-Javadoc)
      * 
@@ -71,29 +59,21 @@
 		.getRequestParameterValuesMap();
 	
 	if ("progress".equals(request.getParameter("action"))) {
-	    AjaxContext ajaxContext = AjaxContextImpl.getCurrentInstance(context);
+	    AjaxContext ajaxContext = AjaxContextImpl
+		    .getCurrentInstance(context);
 	    String uid = request.getParameter("uid");
-	    /*
-	     * 
-	     * FIXME: Maksim --> Andrei
-	     * Why not use standard JSF  constructs?
-	     * 
+
 	    ExternalContext externalContext = context.getExternalContext();
-	    Map <String, Object> sessionMap = externalContext.getSessionMap();
-	    
-		*/
+	    Map<String, Object> sessionMap = externalContext.getSessionMap();
 
-	    HttpSession session = (HttpSession)context.getExternalContext().getSession(false);
-		Map<String, MultipartRequest> sessions = (Map<String, MultipartRequest>) session
-			.getAttribute("_richfaces_upload_sessions");
-
-		if (sessions != null) {
-			MultipartRequest multipartRequest = sessions.get(uid);
-			if (multipartRequest != null) {
-			    	ajaxContext.setResponseData(multipartRequest.getSize());
-			}
+	    Map<String, MultipartRequest> sessions = (Map<String, MultipartRequest>) sessionMap
+		    .get(MultipartFilter.REQUESTS_SESSIONS_BEAN_NAME);
+	    if (sessions != null) {
+		MultipartRequest multipartRequest = sessions.get(uid);
+		if (multipartRequest != null) {
+		    ajaxContext.setResponseData(multipartRequest.getSize());
 		}
-
+	    }
 	} else {
 	    new AjaxEvent(component).queue();
 	}
@@ -117,6 +97,12 @@
 
     }
 
+    /**
+     * Put uploaded file into data attribute defined 
+     * @param context
+     * @param fileUpload
+     * @param file
+     */
     private void storeData(FacesContext context, UIFileUpload fileUpload, File file) {
 	ValueExpression data = fileUpload.getValueExpression("data");
 	if (data != null) {
@@ -124,13 +110,16 @@
 	    if (clazz.isAssignableFrom(Map.class)) {
 		Map map = (Map) data.getValue(context.getELContext());
 		map.put(fileUpload.getLocalFileName(), file);
-		//FIXME: Maksim --> Andrei
-		// What does Map.empty mean?
-		map.isEmpty();
 	    }
 	}
     }
 
+    /**
+     * Call with method after uploading completed
+     * @param context
+     * @param file
+     * @param fileUpload
+     */
     private void onUploadComplete(FacesContext context, File file,
 	    UIFileUpload fileUpload) {
 	storeData(context, fileUpload, file);	
@@ -146,27 +135,28 @@
      * 
      * @see org.ajax4jsf.renderkit.RendererBase#getComponentClass()
      */
-    //FIXME: Maksim --> Andrei
-    //Better use UIFileUpload here. Otherwise you can get NPE here
     @Override
     protected Class<? extends UIComponent> getComponentClass() {
-	// TODO Auto-generated method stub
-	return null;
+	return UIFileUpload.class;
     }
     
+    /**
+     * Generates common JS script by action value 
+     * @param context
+     * @param component
+     * @param action
+     * @param oncomplete
+     * @return
+     * @throws IOException
+     */
     private String getActionScript(FacesContext context, UIComponent component,
 	    String action, Object oncomplete) throws IOException {
 	JSFunction ajaxFunction = AjaxRendererUtils.buildAjaxFunction(
 		component, context);
-	
-	//FIXME: Maksim --> Andrei
-	//Why multiple map.get?  In eclipse, use Ctrl+2 then L to introduce local variable
-	//
-	
 	Map options = AjaxRendererUtils.buildEventOptions(context, component);
-	
-	((Map) options.get("parameters")).put("action", action);
-	((Map) options.get("parameters")).put("uid", new JSReference("uid"));
+	Map parameters = (Map) options.get("parameters");
+	parameters.put("action", action);
+	parameters.put("uid", new JSReference("uid"));
 	if (oncomplete != null) {
 	    options.put("onbeforedomupdate", oncomplete);
 	}
@@ -179,13 +169,26 @@
 	return function.toScript();
     }
 
+    /**
+     * Generates JS script for stopping uploading process
+     * @param context
+     * @param component
+     * @return
+     * @throws IOException
+     */
     public String getStopScript(FacesContext context, UIComponent component)
 	    throws IOException {
 	return getActionScript(context, component, "stop", null);
     }
 
-    // TODO : complete this one
     
+    /**
+     * Generates JS script for getting file size from server 
+     * @param context
+     * @param component
+     * @return
+     * @throws IOException
+     */
     public String getFileSizeScript(FacesContext context, UIComponent component)
 	    throws IOException {
 	JSFunctionDefinition oncomplete = new JSFunctionDefinition();
@@ -200,9 +203,13 @@
 
     }
     
-    //FIXME: Maksim --> Andrei
-    //Method not used anywhere
-    //WHY?
+    /**
+     * Generates progress label markup
+     * @param context
+     * @param component
+     * @return
+     * @throws IOException
+     */
     public Object getLabelMarkup(FacesContext context, UIComponent component)
 	    throws IOException {
 	CountingOutputWriter customWriter = new CountingOutputWriter();
@@ -226,7 +233,6 @@
 		ResponseWriter responseWriter = renderKit.createResponseWriter(
 			customWriter, null, "UTF-8");
 		context.setResponseWriter(responseWriter);
-		//renderChild(context, label);
 		writeScriptBody(context, label, false);
 		if (writer != null) {
 		    context.setResponseWriter(writer);
@@ -279,17 +285,36 @@
     }
   
 
+    /**
+     * Gets progress bar Id 
+     * @param context
+     * @param component
+     * @return
+     * @throws IOException
+     */
     public String getProgressBarId(FacesContext context, UIComponent component)
 	    throws IOException {
 	return getProgressBar(context, component).getClientId(context);
     }
 
+    /**
+     * Renders progress bar 
+     * @param context
+     * @param component
+     * @throws IOException
+     */
     public void renderProgress(FacesContext context, UIComponent component)
 	    throws IOException {
 	UIComponent progressBar = getProgressBar(context, component);
 	renderChild(context, progressBar);
     }
 
+    /**
+     * Creates progress bar component
+     * @param context
+     * @param fileUpload
+     * @return
+     */
     private UIComponent createProgressBar(FacesContext context,
 	    UIComponent fileUpload) {
 	UIComponent progressBar = fileUpload.getFacet("progress");
@@ -301,6 +326,12 @@
 	return progressBar;
     }
 
+    /**
+     * Returns progress bar
+     * @param context
+     * @param component
+     * @return
+     */
     private UIComponent getProgressBar(FacesContext context,
 	    UIComponent component) {
 	UIComponent progressBar = component.getFacet("progress");
@@ -308,45 +339,18 @@
 	    progressBar = createProgressBar(context, component);
 	}
 	
-	//FIXME: Maksim --> Andrei
-	//What happens if we have two fileuploads on the page?
-	//Two progress bars with identical value?
-	String exprStr = "#{" + _percentBeanName + "}";
+	//We associate progress bar's percent value in session scope with file upload component id
+	String exprStr = "#{" + MultipartFilter.PERCENT_BEAN_NAME + "['"+component.getClientId(context)+"']}";
 	ValueExpression ex = context.getApplication().getExpressionFactory()
 		.createValueExpression(context.getELContext(), exprStr,
 			Integer.class);
 	progressBar.setValueExpression("value", ex);
-	
-	
-	//FIXME: Maksim --> Andrei
-	//Why set id for user-defined component
-	progressBar.setId("progressBar");
 	progressBar.getAttributes().put("minValue", -1);
 	progressBar.getAttributes().put("enabled", false);
 	progressBar.setTransient(false);
-	if (getProgressLabel(component) != null) {
-	    progressBar.getAttributes().put("reRender", "progressLabel");
-	}
-
 	return progressBar;
     }
 
-    private StringBuffer getJSScriptStart(String clientId) {
-	StringBuffer buffer = new StringBuffer("$('");
-	buffer.append(clientId).append("').component");
-	return buffer;
-    }
-
-    private UIComponent getProgressLabel(UIComponent component) {
-	UIComponent label = component.getFacet("progressLabel");
-	if (label != null) {
-		//FIXME: Maksim --> Andrei
-		//Why set id for user-defined component
-	    label.setId("progressLabel");
-	}
-	return label;
-    }
-
     /*
      * (non-Javadoc)
      * 

Modified: trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/web/MultipartFilter.java
===================================================================
--- trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/web/MultipartFilter.java	2008-02-21 10:21:54 UTC (rev 6231)
+++ trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/web/MultipartFilter.java	2008-02-21 11:37:38 UTC (rev 6232)
@@ -16,8 +16,6 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
-import org.richfaces.org.jboss.seam.ui.renderkit.FileUploadRendererBase;
-
 /**
  * A filter for decoding multipart requests, for
  * use with the file upload control.
@@ -34,6 +32,10 @@
 {
    public static final String MULTIPART = "multipart/";
    
+   public static final String REQUESTS_SESSIONS_BEAN_NAME = "_richfaces_upload_sessions";
+   
+   public static final String PERCENT_BEAN_NAME = "_richfaces_upload_percents"; 
+   
    /**
     * Flag indicating whether a temporary file should be used to cache the uploaded file
     */
@@ -73,34 +75,36 @@
 
 		HttpServletRequest httpRequest = (HttpServletRequest) request;
 		String uid = httpRequest.getParameter("uid");
+		String componentId = httpRequest.getParameter("clientId");
 		if (isMultipartRequest(httpRequest)) {
 			MultipartRequest multipartRequest = new MultipartRequest(
-					httpRequest, createTempFiles, maxRequestSize);
+					httpRequest, createTempFiles, maxRequestSize, componentId);
 
 			Map<String, MultipartRequest> sessionsMap = null;
+			Map<String, Object> percentMap = null;
 			try {
 				HttpSession session = httpRequest.getSession();
 				synchronized (session) {
 					sessionsMap = (Map<String, MultipartRequest>) session
-							.getAttribute("_richfaces_upload_sessions");
+							.getAttribute(REQUESTS_SESSIONS_BEAN_NAME);
+					percentMap = (Map<String, Object>) session.getAttribute(PERCENT_BEAN_NAME);		
 					if (sessionsMap == null) {
 						sessionsMap = Collections.synchronizedMap(new HashMap<String, MultipartRequest>());
 						session.setAttribute(
-										"_richfaces_upload_sessions", sessionsMap);
+										REQUESTS_SESSIONS_BEAN_NAME, sessionsMap);
 					}
+					if (percentMap == null) {
+						percentMap = new HashMap<String, Object>();
+						session.setAttribute(PERCENT_BEAN_NAME, percentMap);
+					}
 				}
 				
-				//FIXME: Maksim --> Andrei
-				//Can we make _percentBeanName uid-dependent?
-				
-				session.setAttribute(FileUploadRendererBase._percentBeanName, 0);
+				percentMap.put(componentId, 0);  // associate percent value with file upload component ID
+				sessionsMap.put(uid, multipartRequest); 
 
-				sessionsMap.put(uid, multipartRequest);
-
 				if (multipartRequest.parseRequest()) {
 					chain.doFilter(multipartRequest, response);
 				} else {
-					// TODO
 					HttpServletResponse httpResponse = (HttpServletResponse) response;
 					httpResponse.setStatus(HttpServletResponse.SC_OK);
 					httpResponse.setContentType("text/html");
@@ -119,7 +123,7 @@
 			if ("stop".equals(httpRequest.getParameter("action"))) {
 				HttpSession session = httpRequest.getSession();
 				Map<String, MultipartRequest> sessions = (Map<String, MultipartRequest>) session
-					.getAttribute("_richfaces_upload_sessions");
+					.getAttribute(REQUESTS_SESSIONS_BEAN_NAME);
 
 				if (sessions != null) {
 					MultipartRequest multipartRequest = sessions.get(uid);
@@ -159,7 +163,6 @@
    }
 
 public void destroy() {
-	// TODO Auto-generated method stub
 	
 }
 

Modified: trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/web/MultipartRequest.java
===================================================================
--- trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/web/MultipartRequest.java	2008-02-21 10:21:54 UTC (rev 6231)
+++ trunk/sandbox/ui/fileUpload/src/main/java/org/richfaces/org/jboss/seam/web/MultipartRequest.java	2008-02-21 11:37:38 UTC (rev 6232)
@@ -12,7 +12,6 @@
 import java.rmi.server.UID;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
@@ -23,9 +22,6 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequestWrapper;
 
-import org.richfaces.org.jboss.seam.ui.component.ProgressData;
-import org.richfaces.org.jboss.seam.ui.renderkit.FileUploadRendererBase;
-
 /**
  * Request wrapper for supporting multipart requests, used for file uploading.
  * 
@@ -40,6 +36,8 @@
     private static final int CHUNK_SIZE = 512;
 
     private boolean createTempFiles;
+    
+    private String clientId;
 
     private String encoding = null;
 
@@ -47,9 +45,9 @@
 
     private int read = 0;
 
-    private String beanName;
-
     private Map<String, Param> parameters = null;
+    
+    private Map<String, Object> percentMap = null;
 
     private enum ReadState {
 	BOUNDARY, HEADERS, DATA
@@ -248,14 +246,14 @@
 	private boolean shouldStop = false;
 
     public MultipartRequest(HttpServletRequest request,
-	    boolean createTempFiles, int maxRequestSize) {
+	    boolean createTempFiles, int maxRequestSize, String clientId) {
 	super(request);
 	this.request = request;
 	this.createTempFiles = createTempFiles;
+	this.clientId = clientId;
 
 	String contentLength = request.getHeader("Content-Length");
 	this.contentLength = Integer.parseInt(contentLength);
-	//initProgressInfo(this.contentLength);
 	if (contentLength != null && maxRequestSize > 0
 		&& this.contentLength > maxRequestSize) {
 	    throw new FileUploadException(
@@ -292,6 +290,7 @@
     	encoding = request.getCharacterEncoding();
 
     	parameters = new HashMap<String, Param>();
+	this.percentMap = getProgressData();
 
     	try {
     		byte[] buffer = new byte[BUFFER_SIZE];
@@ -430,36 +429,17 @@
     	}
     }
     
-    private ProgressData getProgressData () {
-	ProgressData progressData = null;
-	String beanName = (String)getSession().getAttribute(FileUploadRendererBase._progressInfoBeanName);
-	if (beanName != null) {
-	    progressData = (ProgressData)getSession().getAttribute(beanName);
-	}
-	return progressData;
+    @SuppressWarnings("unchecked")
+    private Map<String, Object> getProgressData () {
+	percentMap  = (Map<String, Object>)getSession().getAttribute(MultipartFilter.PERCENT_BEAN_NAME);
+	return percentMap;
     }
     
     private void fillProgressInfo () {
 	Double percent = (Double) (100.0 * this.read / this.contentLength);
-	getSession().setAttribute(FileUploadRendererBase._percentBeanName,percent);
-	/*if (this.progressData != null) {
-	    progressData.setPercent(percent);
-	    progressData.setUploaded((long)this.read);
-	    progressData.setTime((new Date().getTime() / 1000)- this.time);
-	}*/
+	percentMap.put(clientId, percent);
     }
-    
-  /*  private void initProgressInfo(int size) {
-	time = new Date().getTime()/1000;
-	progressData = getProgressData();
-	if (progressData != null) {  
-	    progressData.setSize((long)size);
-	    progressData.setTime(0L);
-	}
 
-    }
-    */
-
     private byte[] getBoundaryMarker(String contentType) {
 	Map<String, Object> params = parseParams(contentType, ";");
 	String boundaryStr = (String) params.get("boundary");

Modified: trunk/sandbox/ui/fileUpload/src/main/resources/org/richfaces/renderkit/html/js/FileUpload.js
===================================================================
--- trunk/sandbox/ui/fileUpload/src/main/resources/org/richfaces/renderkit/html/js/FileUpload.js	2008-02-21 10:21:54 UTC (rev 6231)
+++ trunk/sandbox/ui/fileUpload/src/main/resources/org/richfaces/renderkit/html/js/FileUpload.js	2008-02-21 11:37:38 UTC (rev 6232)
@@ -139,6 +139,7 @@
 	},
 	
 	setupLabelUpdate: function () {
+		this.updateLabel();
 		this.labelUpdateInterval = setInterval(function () { this.updateLabel(); }.bind(this), this.uploadObject.progressBar.options['pollinterval']);
 	},
 	
@@ -164,20 +165,12 @@
 	},
 	
 	_clearInput: function() {
-		//remove input type="file" element
 		Richfaces.removeNode(this.fileInput);
-		/*var inputs = $(this.uploadObject.id + ":add1")
-		try{
-		inputs.removeChild(this.fileInput);
-		}catch(e) {}*/
 		this.fileInput = null;
 	},
 	
 	_clearEntry: function() {
 		Richfaces.removeNode(this.entryElement);
-		/*try{
-		this.uploadObject.items.removeChild(this.entryElement);
-		}catch(e) {}*/
 		this.entryElement = null;
 	},
 	
@@ -365,7 +358,6 @@
 	initialize: function(id, stopScript, getFileSizeScript, progressBarId, classes, label, maxFiles, options) {
 		this.id = id;
 		this.element = $(this.id);
-		//this.progressBarId = progressBarId;
 		this._progressBar = $(progressBarId);
 		this.progressBar = this._progressBar.component;
 		
@@ -402,6 +394,7 @@
 	prepareProgressBar: function () {
 		this.progressBar.setValue(0);
 		Element.show(this._progressBar);
+		this.progressBar.enable();
 	},
 	
 	finishProgressBar: function () {
@@ -439,7 +432,6 @@
 		entry.clear();
 		this.entries = this.entries.without(entry);
 
-		//this.disableAddButton(this.maxFileBatchSize && this.entries.length >= this.maxFileBatchSize);
 	},
 
 	_selectEntryForUpload: function() {
@@ -576,9 +568,6 @@
 
 	_endUpload: function() {
 		this.activeEntry = null;
-		//this.progressBar.setValue(100);
-		//this.progressBar.disable();
-		//Element.hide(this._progressBar);
 	},
 	
 	_updateEntriesState: function() {
@@ -628,7 +617,6 @@
 			}
 
 			this._updateEntriesState();
-			//this.disableUploadButton(false);
 
 		} else if (newState == FileUploadEntry.UPLOAD_CANCELED ||
 				newState == FileUploadEntry.UPLOAD_TRANSFER_ERROR ||
@@ -641,17 +629,12 @@
 			
 			this._updateEntriesState();
 
-			//this.disableUploadButton(false);
-
 		} else if (newState == FileUploadEntry.UPLOAD_IN_PROGRESS) {
 		
 			this.activeEntry = entry;
-			this.progressBar.setValue(0);
-			this.progressBar.enable();
 		
 			this._updateEntriesState();
 
-			//this.disableUploadButton(true);
 		}
 		this.processButtons();
 	},
@@ -676,7 +659,7 @@
 		parentForm.encoding = "multipart/form-data"; 
 		parentForm.enctype = "multipart/form-data"; 
 		parentForm.target = this.id;
-		parentForm.action = oldAction + (/\?/.test(oldAction) ? '&uid' : '?uid') + '=' + encodeURI(entry.uid);
+		parentForm.action = oldAction + (/\?/.test(oldAction) ? '&uid' : '?uid') + '=' + encodeURI(entry.uid) + '&clientId=' + this.id;
 
 		try {
 			var inputs = parentForm.elements;




More information about the richfaces-svn-commits mailing list