/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.gui.common.upload; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import javax.el.ValueExpression; import javax.faces.FacesException; import javax.faces.component.EditableValueHolder; import javax.faces.component.UIComponent; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.render.Renderer; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; public class UploadRenderer extends Renderer { // UploadRenderer Implementation -------------------------------------------- public void encodeBegin(FacesContext context, UIComponent component) throws IOException { if (!component.isRendered()) { return; } ResponseWriter writer = context.getResponseWriter(); String clientId = component.getClientId(context); writer.startElement("input", component); writer.writeAttribute("type", "file", "type"); writer.writeAttribute("name", clientId, "clientId"); writer.endElement("input"); // TODO: Make the file input's Browse button look consistent with other RHQ buttons. // (see http://www.quirksmode.org/dom/inputfile.html for a way this can be done). writer.flush(); } public void decode(FacesContext context, UIComponent component) { ExternalContext external = context.getExternalContext(); HttpServletRequest request = (HttpServletRequest) external.getRequest(); String clientId = component.getClientId(context); FileItem item = (FileItem) request.getAttribute(clientId); Object newValue; ValueExpression valueExpression = component.getValueExpression("value"); if (valueExpression != null) { Class valueType = valueExpression.getType(context.getELContext()); if (valueType == byte[].class) { newValue = item.get(); } else if (valueType == InputStream.class) { try { newValue = item.getInputStream(); } catch (IOException ex) { throw new FacesException(ex); } } else { String encoding = request.getCharacterEncoding(); if (encoding != null) { try { newValue = item.getString(encoding); } catch (UnsupportedEncodingException ex) { newValue = item.getString(); } } else { newValue = item.getString(); } } ((EditableValueHolder) component).setSubmittedValue(newValue); ((EditableValueHolder) component).setValid(true); } Object target = component.getAttributes().get("target"); if (target != null) { File file; if (target instanceof File) { file = (File) target; } else { ServletContext servletContext = (ServletContext) external.getContext(); String realPath = servletContext.getRealPath(target.toString()); file = new File(realPath); } try { item.write(file); } catch (Exception ex) { throw new FacesException(ex); } } } }