package org.jboss.seam.ui.component; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.el.ValueExpression; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; /** * JSF component class * */ public abstract class UIFileUpload extends UIInput { private String localContentType; private String localFileName; private Integer localFileSize; private InputStream localInputStream; @Override public void processUpdates(FacesContext context) { // Skip processing if rendered flag is false. // this logic is in javax.faces.component.UIInput.processUpdates(FacesContext context) if (!isRendered()) { return; } ValueExpression dataBinding = getValueExpression("data"); if (dataBinding != null) { if (getLocalContentType() != null) { ValueExpression valueExpression = getValueExpression("contentType"); if (valueExpression != null) { valueExpression.setValue(context.getELContext(), getLocalContentType()); } } if (getLocalFileName() != null) { ValueExpression valueExpression = getValueExpression("fileName"); if (valueExpression != null) { valueExpression.setValue(context.getELContext(), getLocalFileName()); } } if (getLocalFileSize() != null) { ValueExpression valueExpression = getValueExpression("fileSize"); if (valueExpression != null) { valueExpression.setValue(context.getELContext(), getLocalFileSize()); } } Class clazz = dataBinding.getType(context.getELContext()); if (clazz.isAssignableFrom(InputStream.class)) { dataBinding.setValue(context.getELContext(), getLocalInputStream()); } else if (clazz.isAssignableFrom(byte[].class)) { byte[] bytes = null; if (getLocalInputStream() != null) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { byte[] buffer = new byte[512]; int read = getLocalInputStream().read(buffer); while (read != -1) { bos.write(buffer, 0, read); read = getLocalInputStream().read(buffer); } bytes = bos.toByteArray(); } catch (IOException e) { throw new RuntimeException(e); } } dataBinding.setValue(context.getELContext(), bytes); } } } public String getLocalContentType() { return localContentType; } public void setLocalContentType(String localContentType) { this.localContentType = localContentType; } public String getLocalFileName() { return localFileName; } public void setLocalFileName(String localFileName) { this.localFileName = extractFilename(localFileName); } /** * Workaround for IE, which includes the full path to the file. */ private String extractFilename(String filename) { if (filename != null && filename.lastIndexOf("\\") > -1) { return filename.substring(filename.lastIndexOf("\\") + 1); } else { return filename; } } public Integer getLocalFileSize() { return localFileSize; } public void setLocalFileSize(Integer localFileSize) { this.localFileSize = localFileSize; } public InputStream getLocalInputStream() { return localInputStream; } public void setLocalInputStream(InputStream localInputStream) { this.localInputStream = localInputStream; } /** * {@inheritDoc} * * @see javax.faces.component.UIOutput#getLocalValue() */ @Override public Object getLocalValue() { return new LocalUploadValue(localContentType, localFileName, localFileSize, localInputStream); } /** * {@inheritDoc} * * @see javax.faces.component.UIInput#setValue(java.lang.Object) */ @Override public void setValue(Object value) { // Check if the local values get restored if (value != null && value instanceof LocalUploadValue) { LocalUploadValue localValue = (LocalUploadValue) value; localFileName = localValue.getFileName(); localFileSize = localValue.getFileSize(); localContentType = localValue.getContentType(); localInputStream = localValue.getInputStream(); } else { super.setValue(value); } } /** * {@inheritDoc} * * @see javax.faces.component.UIInput#isLocalValueSet() */ @Override public boolean isLocalValueSet() { return localContentType != null || localFileName != null || localFileSize != null || localInputStream != null; } /** * Helper class to store the local values. */ protected class LocalUploadValue { /** Stores the local content type. */ private String contentType; /** Stores the local file name. */ private String fileName; /** Stores the local file size. */ private Integer fileSize; /** Stores the local stream information. */ private InputStream inputStream; /** * Constructor for this class. * * @param contentType * The local content type to save * @param fileName * The local file name to save * @param fileSize * The local file size to save * @param inputStream * The local input stream to save */ public LocalUploadValue(String contentType, String fileName, Integer fileSize, InputStream inputStream) { super(); this.contentType = contentType; this.fileName = fileName; this.fileSize = fileSize; this.inputStream = inputStream; } /** * Returns the contentType value. * * @return the contentType value */ public String getContentType() { return contentType; } /** * Returns the fileName value. * * @return the fileName value */ public String getFileName() { return fileName; } /** * Returns the fileSize value. * * @return the fileSize value */ public Integer getFileSize() { return fileSize; } /** * Returns the inputStream value. * * @return the inputStream value */ public InputStream getInputStream() { return inputStream; } } public abstract void setAccept(String accept); public abstract String getAccept(); public abstract String getStyleClass(); public abstract String getStyle(); public abstract void setStyleClass(String styleClass); public abstract void setStyle(String style); }