package org.jboss.seam.ui.renderkit; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.servlet.ServletRequest; import org.jboss.seam.ui.component.UIFileUpload; import org.jboss.seam.ui.util.HTML; import org.jboss.seam.ui.util.cdk.RendererBase; import org.jboss.seam.web.MultipartRequest; public class FileUploadRendererBase extends RendererBase { @Override protected Class getComponentClass() { return UIFileUpload.class; } @Override protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent component) throws IOException { UIFileUpload fileUpload = (UIFileUpload) component; writer.startElement(HTML.INPUT_ELEM, fileUpload); writer.writeAttribute(HTML.TYPE_ATTR, HTML.FILE_ATTR, null); String clientId = fileUpload.getClientId(context); writer.writeAttribute(HTML.ID_ATTR, clientId, null); writer.writeAttribute(HTML.NAME_ATTR, clientId, null); /*if (fileUpload.getAccept() != null) { writer.writeAttribute(HTML.ACCEPT_ATTR, fileUpload.getAccept(), "accept"); } if (fileUpload.getStyleClass() != null) { writer.writeAttribute(HTML.CLASS_ATTR, fileUpload.getStyleClass(), JSF.STYLE_CLASS_ATTR); } if (fileUpload.getStyle() != null) { writer.writeAttribute(HTML.STYLE_ATTR, fileUpload.getStyle(), "style"); }*/ HTML.renderHTMLAttributes(writer, component, HTML.INPUT_FILE_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED); writer.endElement(HTML.INPUT_ELEM); } @Override protected void doDecode(FacesContext context, UIComponent component) { UIFileUpload fileUpload = (UIFileUpload) component; ServletRequest request = (ServletRequest) context.getExternalContext().getRequest(); if (!(request instanceof MultipartRequest)) { request = unwrapMultipartRequest(request); } if (request instanceof MultipartRequest) { MultipartRequest multipartRequest = (MultipartRequest) request; String clientId = component.getClientId(context); fileUpload.setLocalInputStream(multipartRequest.getFileInputStream(clientId)); fileUpload.setLocalContentType(multipartRequest.getFileContentType(clientId)); fileUpload.setLocalFileName(multipartRequest.getFileName(clientId)); fileUpload.setLocalFileSize(multipartRequest.getFileSize(clientId)); } } /** * Finds an instance of MultipartRequest wrapped within a request or its * (recursively) wrapped requests. */ private static ServletRequest unwrapMultipartRequest(ServletRequest request) { while (!(request instanceof MultipartRequest)) { boolean found = false; for (Method m : request.getClass().getMethods()) { if (ServletRequest.class.isAssignableFrom(m.getReturnType()) && m.getParameterTypes().length == 0) { try { request = (ServletRequest) m.invoke(request); found = true; break; } catch (Exception ex) { /* Ignore, try the next one */ } } } if (!found) { for (Field f : request.getClass().getDeclaredFields()) { if (ServletRequest.class.isAssignableFrom(f.getType())) { try { request = (ServletRequest) f.get(request); } catch (Exception ex) { /* Ignore */ } } } } if (!found) break; } return request; } }