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

