Upload File [servlet and portlet] context. One solution to everybody

Hello:

Here one solution to everybody for the uploadfile issue:

1-New faces-context-factory, In faces-config.xml file:

<faces-context-factory>com.sadiel.common.faces.context.FacesContextFactoryImplA</faces-context-factory>

2- FacesContextFactoryImplA:

package com.sadiel.common.faces.context;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import javax.faces.FacesException;

import javax.faces.context.ExternalContext;

import javax.faces.context.FacesContext;

import javax.faces.lifecycle.Lifecycle;

import javax.servlet.ServletContext;

import javax.servlet.http.HttpServletRequest;

import javax.portlet.ActionRequest;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileUploadException;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.portlet.PortletFileUpload;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

import org.apache.commons.fileupload.servlet.ServletRequestContext;

import org.apache.commons.lang.ArrayUtils;

import org.apache.myfaces.context.FacesContextFactoryImpl;

import org.apache.myfaces.portlet.PortletUtil;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

publicclass FacesContextFactoryImplAextends FacesContextFactoryImpl{

privatestaticfinal Logger logger_ = LoggerFactory.getLogger(FacesContextFactoryImplA.class);

public FacesContext getFacesContext(Object context,Object request,Object response,Lifecycle lifecycle)throws FacesException{

return wrapperFacesContext(super.getFacesContext(context, request, response, lifecycle));

}

protected FacesContext wrapperFacesContext(FacesContext facesContext)throws FacesException{

FacesContext fctx= facesContext;

ExternalContext xctx = facesContext.getExternalContext();

Object context = xctx.getContext();

//

if(contextinstanceof ServletContext){

HttpServletRequest request = (HttpServletRequest)facesContext.getExternalContext().getRequest();

ServletRequestContext requestctx =new ServletRequestContext(request);

if(ServletFileUpload.isMultipartContent(requestctx)){

fctx = parserMultipartServlet(facesContext,request);

}

}else{

//

boolean isjo= PortletUtil.isPortletRequest(facesContext);

if(PortletUtil.isPortletRequest(facesContext) && !PortletUtil.isRenderResponse(facesContext)){

ActionRequest request = (ActionRequest)xctx.getRequest();

boolean isMultipart = PortletFileUpload.isMultipartContent(request);

if(isMultipart){

fctx = parserMultipartPortlet(facesContext,request);

}

}

}

//

return fctx;

}

@SuppressWarnings("unchecked")

protected FacesContext parserMultipartPortlet(FacesContext facesContext,ActionRequest request)throws FacesException{

ExternalContextImplA wrapperExternalContext =new ExternalContextImplA(facesContext.getExternalContext());

FacesContextImplA wrapperFacesContext=new FacesContextImplA(facesContext, wrapperExternalContext);

//

DiskFileItemFactory factory =new DiskFileItemFactory();

PortletFileUpload pfu=new PortletFileUpload(factory);

List<FileItem> fileitems=null;

try{

fileitems = pfu.parseRequest(request);

prepareMultipartContext(fileitems, wrapperFacesContext);

}catch (FileUploadException e){

if(logger_.isErrorEnabled()){

logger_.error("parserMultipartPortlet()Error: "+e.getMessage());

}

thrownew FacesException(e.getMessage(),e);

}

return wrapperFacesContext;

}

@SuppressWarnings("unchecked")

protected FacesContext parserMultipartServlet(FacesContext facesContext,HttpServletRequest request)throws FacesException{

ExternalContextImplA wrapperExternalContext =new ExternalContextImplA(facesContext.getExternalContext());

FacesContextImplA wrapperFacesContext=new FacesContextImplA(facesContext, wrapperExternalContext);

//

DiskFileItemFactory factory =new DiskFileItemFactory();

ServletFileUpload sfu=new ServletFileUpload(factory);

List<FileItem> fileitems=null;

try{

fileitems = sfu.parseRequest(request);

prepareMultipartContext(fileitems, wrapperFacesContext);

}catch (FileUploadException e){

if(logger_.isErrorEnabled()){

logger_.error("parserMultipartServlet()Error: "+e.getMessage());

}

thrownew FacesException(e.getMessage(),e);

}

return wrapperFacesContext;

}

@SuppressWarnings("unchecked")

protectedvoid prepareMultipartContext(List<FileItem> fileUploadItems,FacesContextImplA wrapperFacesContext){

/** @see javax.faces.context.ExternalContext#getRequestParameterMap() */

Map requestParameterMap =new HashMap();

/** @see javax.faces.context.ExternalContext#getRequestParameterNames() */

List requestParameterNames =new ArrayList();

/** @see javax.faces.context.ExternalContext#getRequestParameterValuesMap() */

Map requestParameterValuesMap =new HashMap();

//Process the uploaded items

Iterator iter = fileUploadItems.iterator();

while (iter.hasNext()){

FileItem item = (FileItem) iter.next();

if (item.isFormField()){

//Form

//Process a regular form field

// see javax.faces.context.ExternalContext to understand how these differents map and list are constructed.

String name = item.getFieldName();

String value = item.getString();

if(logger_.isDebugEnabled()){

logger_.debug("prepareMultipartContext()Is Form Field Name: "+name+", "+value);

}

if (requestParameterValuesMap.containsKey(name)){

String[] valuesArray = (String[])requestParameterValuesMap.get(name);

String[] newValuesArray = (String[])ArrayUtils.add(valuesArray,valuesArray.length,value);

requestParameterValuesMap.put(name, newValuesArray);

}else{

requestParameterNames.add(name);

requestParameterMap.put(name, value);

requestParameterValuesMap.put(name,new String[]{ value});

}

}else{

String fieldName = item.getFieldName();

if(logger_.isDebugEnabled()){

logger_.debug("prepareMultipartContext()Is File Field Name: "+fieldName+", "+item);

}

requestParameterMap.put(fieldName, item);

requestParameterNames.add(fieldName);

}

}

ExternalContextImplA wrapperexternalContext =

(ExternalContextImplA) wrapperFacesContext.getExternalContext();

wrapperexternalContext.setRequestParameterMap(requestParameterMap);

wrapperexternalContext.setRequestParameterNames(requestParameterNames);

wrapperexternalContext.setRequestParameterValuesMap(requestParameterValuesMap);

}

}

3-New ExternalContext Implementation:

package com.sadiel.common.faces.context;

import java.io.IOException;

import java.io.InputStream;

import java.net.MalformedURLException;

import java.net.URL;

import java.security.Principal;

import java.util.Iterator;

import java.util.List;

import java.util.Locale;

import java.util.Map;

import java.util.Set;

import javax.faces.context.ExternalContext;

publicclass ExternalContextImplAextends ExternalContext{

private ExternalContextcontext_ =null;

private MaprequestParameterMap_ =null;

private Map requestParameterValuesMap_ =null;

private ListrequestParameterNames_ =null;

public ExternalContextImplA(ExternalContext context){

this.context_ = context;

}

publicvoid setRequestParameterMap(Map requestParameterMap){

this.requestParameterMap_ = requestParameterMap;

}

publicvoid setRequestParameterNames(List requestParameterNames){

this.requestParameterNames_ = requestParameterNames;

}

publicvoid setRequestParameterValuesMap(Map requestParameterValuesMap){

this.requestParameterValuesMap_ = requestParameterValuesMap;

}

@Override

publicvoid dispatch(String arg0)throws IOException{

//

this.context_.dispatch(arg0);

}

@Override

public String encodeActionURL(String arg0){

//

return this.context_.encodeActionURL(arg0);

}

@Override

public String encodeNamespace(String arg0){

//

return this.context_.encodeNamespace(arg0);

}

@Override

public String encodeResourceURL(String arg0){

//

return this.context_.encodeResourceURL(arg0);

}

@Override

public Map getApplicationMap(){

//

return this.context_.getApplicationMap();

}

@Override

public String getAuthType(){

//

return this.context_.getAuthType();

}

@Override

public Object getContext(){

//

return this.context_.getContext();

}

@Override

public String getInitParameter(String arg0){

//

return this.context_.getInitParameter(arg0);

}

@Override

public Map getInitParameterMap(){

//

return this.context_.getInitParameterMap();

}

@Override

public String getRemoteUser(){

//

return this.context_.getRemoteUser();

}

@Override

public Object getRequest(){

//

return this.context_.getRequest();

}

@Override

public String getRequestContextPath(){

//

return this.context_.getRequestContextPath();

}

@Override

public Map getRequestCookieMap(){

//

return this.context_.getRequestCookieMap();

}

@Override

public Map getRequestHeaderMap(){

//

return this.context_.getRequestHeaderMap();

}

@Override

public Map getRequestHeaderValuesMap(){

//

return this.context_.getRequestHeaderValuesMap();

}

@Override

public Locale getRequestLocale(){

//

return this.context_.getRequestLocale();

}

@Override

public Iterator getRequestLocales(){

//

return this.context_.getRequestLocales();

}

@Override

public Map getRequestMap(){

//

return this.context_.getRequestMap();

}

@Override

public Map getRequestParameterMap(){

//

return this.requestParameterMap_;

}

@Override

public Iterator getRequestParameterNames(){

//

return this.requestParameterNames_.iterator();

}

@Override

public Map getRequestParameterValuesMap(){

//

return this.requestParameterValuesMap_;

}

@Override

public String getRequestPathInfo(){

//

return this.context_.getRequestPathInfo();

}

@Override

public String getRequestServletPath(){

//

return this.context_.getRequestServletPath();

}

@Override

public URL getResource(String arg0)throws MalformedURLException{

//

return this.context_.getResource(arg0);

}

@Override

public InputStream getResourceAsStream(String arg0){

//

return this.context_.getResourceAsStream(arg0);

}

@Override

public Set getResourcePaths(String arg0){

//

return this.context_.getResourcePaths(arg0);

}

@Override

public Object getResponse(){

//

return this.context_.getResponse();

}

@Override

public Object getSession(boolean arg0){

//

return this.context_.getSession(arg0);

}

@Override

public Map getSessionMap(){

//

return this.context_.getSessionMap();

}

@Override

public Principal getUserPrincipal(){

//

return this.context_.getUserPrincipal();

}

@Override

publicboolean isUserInRole(String arg0){

//

return this.context_.isUserInRole(arg0);

}

@Override

publicvoid log(String arg0){

//

this.context_.log(arg0);

}

@Override

publicvoid log(String arg0, Throwable arg1){

//

this.context_.log(arg0, arg1);

}

@Override

publicvoid redirect(String arg0)throws IOException{

//

this.context_.redirect(arg0);

}

}

4- New FacesContextImplementation:

package com.sadiel.common.faces.context;

import java.util.Iterator;

import javax.faces.application.Application;

import javax.faces.application.FacesMessage;

import javax.faces.application.FacesMessage.Severity;

import javax.faces.component.UIViewRoot;

import javax.faces.context.ExternalContext;

import javax.faces.context.FacesContext;

import javax.faces.context.ResponseStream;

import javax.faces.context.ResponseWriter;

import javax.faces.render.RenderKit;

publicclass FacesContextImplAextends FacesContext{

private FacesContext context_;

private ExternalContext externalContext_;

public FacesContextImplA(FacesContext context,ExternalContext externalContext){

this.context_ = context;

this.externalContext_ = externalContext;

}

public FacesContext getContext(){

return context_;

}

publicvoid setContext(FacesContext context){

this.context_ = context;

}

publicvoid setExternalContext(ExternalContext externalContext){

this.externalContext_ = externalContext;

}

@Override

public ExternalContext getExternalContext(){

// return our own context!!!

return externalContext_;

}

@Override

publicvoid addMessage(String arg0, FacesMessage arg1){

//

this.context_.addMessage(arg0, arg1);

}

@Override

public Application getApplication(){

//

return this.context_.getApplication();

}

@Override

public Iterator getClientIdsWithMessages(){

//

return this.context_.getClientIdsWithMessages();

}

@Override

public Severity getMaximumSeverity(){

//

return this.context_.getMaximumSeverity();

}

@Override

public Iterator getMessages(){

//

return this.context_.getMessages();

}

@Override

public Iterator getMessages(String arg0){

//

return this.context_.getMessages(arg0);

}

@Override

public RenderKit getRenderKit(){

//

return this.context_.getRenderKit();

}

@Override

publicboolean getRenderResponse(){

//

return this.context_.getRenderResponse();

}

@Override

publicboolean getResponseComplete(){

//

return this.context_.getResponseComplete();

}

@Override

public ResponseStream getResponseStream(){

//

return this.context_.getResponseStream();

}

@Override

public ResponseWriter getResponseWriter(){

//

return this.context_.getResponseWriter();

}

@Override

public UIViewRoot getViewRoot(){

//

return this.context_.getViewRoot();

}

@Override

publicvoid release(){

//

this.context_.release();

}

@Override

publicvoid renderResponse(){

//

this.context_.renderResponse();

}

@Override

publicvoid responseComplete(){

//

this.context_.responseComplete();

}

@Override

publicvoid setResponseStream(ResponseStream arg0){

//

this.context_.setResponseStream(arg0);

}

@Override

publicvoid setResponseWriter(ResponseWriter arg0){

//

this.context_.setResponseWriter(arg0);

}

@Override

publicvoid setViewRoot(UIViewRoot arg0){

//

this.context_.setViewRoot(arg0);

}

}

5- New Portlet

package com.sadiel.common.faces.portlet;

import javax.portlet.PortletException;

import javax.portlet.RenderRequest;

import javax.portlet.RenderResponse;

import org.apache.myfaces.context.servlet.ServletFacesContextImpl;

import org.apache.myfaces.portlet.MyFacesGenericPortlet;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.sadiel.common.faces.context.FacesContextImplA;

publicclass SadielFacesPortletextends MyFacesGenericPortlet{

privatestatic Logger logger_ = LoggerFactory.getLogger(SadielFacesPortlet.class);

@Override

protectedvoid facesRender(RenderRequest request, RenderResponse response)throws PortletException, java.io.IOException{

setContentType(request, response);

String viewId = request.getParameter(VIEW_ID);

if ((viewId ==null) || sessionTimedOut(request)){

setPortletRequestFlag(request);

nonFacesRequest(request, response);

return;

}

setPortletRequestFlag(request);

try{

Object fcimplementation = request.getPortletSession().getAttribute(CURRENT_FACES_CONTEXT);

ServletFacesContextImpl facesContext =null;

if(fcimplementationinstanceof ServletFacesContextImpl){

facesContext = (ServletFacesContextImpl)fcimplementation;

}else{

facesContext = (ServletFacesContextImpl)((FacesContextImplA)fcimplementation).getContext();

}

//

if (facesContext.getResponseComplete())return;

facesContext.setExternalContext(makeExternalContext(request, response));

lifecycle.render(facesContext);

}catch (Throwable e){

handleExceptionFromLifecycle(e);

}

}

}

6-In portlet.xml:

<portlet-class>com.sadiel.common.faces.portlet.SadielFacesPortlet</portlet-class>

7-UIComponent:

7.1 HtmlInputFileUpload

package com.sadiel.web.fileupload;

import javax.faces.component.html.HtmlInputText;

import javax.faces.context.FacesContext;

import javax.faces.el.ValueBinding;

import org.apache.myfaces.custom.fileupload.UploadedFile;

publicclass HtmlInputFileUploadextends HtmlInputText{

publicstaticfinal String COMPONENT_TYPE="com.sadiel.jsf.HtmlInputFileUpload";

publicstaticfinal String DEFAULT_RENDERER_TYPE ="com.sadiel.jsf.FileUpload";

publicstaticfinal String SIZE_LIMIT_MESSAGE_ID ="com.sadiel.jsf.FileUpload.SIZE_LIMIT";

publicstaticfinal String STORAGE ="storage";

publicstaticfinal String ACCEPT ="accept";

private String _accept =null;

private String _storage =null;

public HtmlInputFileUpload(){

setRendererType(DEFAULT_RENDERER_TYPE);

}

publicvoid setUploadedFile(UploadedFile upFile){

setValue(upFile);

}

public UploadedFile getUploadedFile(){

return (UploadedFile)getValue();

}

public String getStorage(){

if (_storage !=null)return _storage;

ValueBinding vb = getValueBinding(STORAGE);

return vb !=null ? (String)vb.getValue(getFacesContext()) :null;

}

publicvoid setStorage(String string){

_storage = string;

}

publicvoid setAccept(String accept){

_accept = accept;

}

public String getAccept(){

if (_accept !=null)return _accept;

ValueBinding vb = getValueBinding(ACCEPT);

return vb !=null ? (String)vb.getValue(getFacesContext()) :null;

}

//protected void validateValue(FacesContext context, Object convertedValue)

//{

//super.validateValue(context, convertedValue);

//if (isValid())

//{

//UploadedFile file = (UploadedFile) convertedValue;

//if(file != null && file.getSize() > getMaxlength())

//{

//MessageUtils.addMessage(FacesMessage.SEVERITY_ERROR,

//SIZE_LIMIT_MESSAGE_ID, new Object[] { getId(),

//new Integer(getMaxlength()) },

//getClientId(context), context);

//setValid(false);

//}

//}

//}

public Object saveState(FacesContext context){

Object values[] =new Object[5];

values[0] = super.saveState(context);

values[1] = _accept;

values[2] = _storage;

return ((Object) (values));

}

publicvoid restoreState(FacesContext context, Object state){

Object values[] = (Object[])state;

super.restoreState(context, values[0]);

_accept = (String)values[1];

_storage = (String)values[2];

}

}

7.2- HtmlFileUploadRenderer

package com.sadiel.web.renderkit;

import java.util.Map;

import java.io.IOException;

import javax.faces.component.UIComponent;

import javax.faces.context.FacesContext;

import javax.faces.context.ResponseWriter;

import javax.faces.convert.ConverterException;

import javax.faces.render.Renderer;

import org.apache.myfaces.custom.fileupload.UploadedFile;

import org.apache.myfaces.custom.fileupload.UploadedFileDefaultFileImpl;

import org.apache.myfaces.custom.fileupload.UploadedFileDefaultMemoryImpl;

import org.apache.myfaces.renderkit.RendererUtils;

import org.apache.myfaces.renderkit.html.HTML;

import org.apache.myfaces.renderkit.html.HtmlRendererUtils;

import org.apache.commons.fileupload.FileItem;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.sadiel.web.fileupload.HtmlInputFileUpload;

publicclass HtmlFileUploadRendererextends Renderer{

privatestatic Logger logger_ = LoggerFactory.getLogger(HtmlFileUploadRenderer.class);

publicstaticfinal String MEMORY ="memory";

publicvoid encodeEnd(FacesContext facesContext, UIComponent uiComponent)throws IOException{

super.encodeEnd(facesContext, uiComponent);//check for NP

ResponseWriter writer = facesContext.getResponseWriter();

writer.startElement(HTML.INPUT_ELEM, uiComponent);

writer.writeAttribute(HTML.TYPE_ATTR,"file",null);

String clientId = uiComponent.getClientId(facesContext);

writer.writeAttribute(HTML.ID_ATTR, clientId,null);

writer.writeAttribute(HTML.NAME_ATTR, clientId,null);

UploadedFile value = (UploadedFile)((HtmlInputFileUpload)uiComponent).getValue();

if (value !=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)){

writer.writeAttribute(HTML.DISABLED_ATTR, Boolean.TRUE,null);

}

writer.endElement(HTML.INPUT_ELEM);

}

@SuppressWarnings("unchecked")

publicvoid decode(FacesContext facesContext, UIComponent uiComponent){

//

Map paramMap = facesContext.getExternalContext().getRequestParameterMap();

String clientId = uiComponent.getClientId(facesContext);

UploadedFile upFile =null;

FileItem fileItem = (FileItem) paramMap.get(clientId);

String implementation = ((HtmlInputFileUpload) uiComponent).getStorage();

if(fileItem!=null){

//

try{

if( implementation ==null || (MEMORY).equals( implementation ) ){

upFile =new UploadedFileDefaultMemoryImpl( fileItem );

}else{

upFile =new UploadedFileDefaultFileImpl( fileItem );

}

((HtmlInputFileUpload)uiComponent).setValid(true);

((HtmlInputFileUpload) uiComponent).setSubmittedValue(upFile);

}catch (IOException e){

if(logger_.isErrorEnabled()){

logger_.error("decode()Error: "+e.getMessage());

}

}

}

}

protectedboolean isDisabled(FacesContext facesContext, UIComponent uiComponent){

if (uiComponentinstanceof HtmlInputFileUpload){

return ((HtmlInputFileUpload)uiComponent).isDisabled();

}else{

return RendererUtils.getBooleanAttribute(uiComponent, HTML.DISABLED_ATTR,false);

}

}

public Object getConvertedValue(FacesContext context, UIComponent component, Object submittedValue)throws ConverterException{

UploadedFile file =null;

if(submittedValueinstanceof UploadedFile){

file = (UploadedFile) submittedValue;

if(file.getName()!=null && file.getName().length()>0){

return file;

}

}

return file;

}

}

7.3- In faces-config.xml file:

<component>

<component-type>com.sadiel.jsf.HtmlInputFileUpload</component-type>

<component-class>com.sadiel.web.fileupload.HtmlInputFileUpload</component-class>

</component>

<render-kit>

<renderer>

<component-family>javax.faces.Input</component-family>

<renderer-type>com.sadiel.jsf.FileUpload</renderer-type>

<renderer-class>com.sadiel.web.renderkit.HtmlFileUploadRenderer</renderer-class>

</renderer>

...

8- In JSP:

<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<%@ taglib prefix="s" uri="http://bcn.sadiel.com/jsf"%>

...

<s:inputFileUpload id="infuUpload" value="#{bean.myFile}" storage="file" required="true"/>

...

9- The Backing Bean:

import org.apache.myfaces.custom.fileupload.UploadedFile;

publicclass BanckingBean{

private UploadedFile myFile_ =null;

public UploadedFile getMyFile(){

return this.myFile_;

}

publicvoid setMyFile(UploadedFile myFile){

this.myFile_ = myFile;

}

Ufff

[49523 byte] By [nvecesxa] at [2007-11-27 8:32:47]
# 1
I have a better solution - get Sun to add file uploading to the servlet specification!Sorry, I just needed to get that off my chest.
RaymondDeCampoa at 2007-7-12 20:28:43 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...