/* * Copyright (C) 2003-2011 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * 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, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.webui.form.input; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.exoplatform.upload.UploadResource; import org.exoplatform.upload.UploadService; import org.exoplatform.upload.UploadService.UploadUnit; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIComponent; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIFormInputBase; /** * @author <a href="mailto:haint@exoplatform.com">Nguyen Thanh Hai</a> * * @datJul 19, 2011 * * This is instead of UIFormUploadInput. */ @ComponentConfig(template = "system:/groovy/webui/form/UIUploadInput.gtmpl", events = { @EventConfig(listeners = UIUploadInput.CreateUploadIdActionListener.class), @EventConfig(listeners = UIUploadInput.RemoveUploadIdActionListener.class) }) public class UIUploadInput extends UIFormInputBase<String> { private LinkedList<String> uploadIds = new LinkedList<String>(); private boolean dynamic = false; private Integer limitSize; private UploadUnit limitUnit; public UIUploadInput(String name, String bindingExpression) { this(name, bindingExpression, 1); } /** * @param limitFile the amount of field(s) input upload. If limitFile less than one , the dynamic mode will enable */ public UIUploadInput(String name, String bindingExpression, int limitFile) { super(name, bindingExpression, String.class); if (limitFile < 1) { dynamic = true; limitFile = 1; } for (int i = 0; i < limitFile; i++) { uploadIds.add(new StringBuffer().append(Math.abs(this.hashCode())).append('-').append(i).toString()); } UploadService service = getApplicationComponent(UploadService.class); for (int i = 0; i < uploadIds.size(); i++) { service.addUploadLimit(uploadIds.get(i), null); // Use the limit set by the service. Warning, the service can allow // no size limit (value to 0) } setComponentConfig(UIUploadInput.class, null); } /** * @param limitFile the amount of field(s) input upload. If limitFile less than one , the dynamic mode will enable * @param limitSize the limitation file size (MB) for each upload */ public UIUploadInput(String name, String bindingExpression, int limitFile, int limitSize) { this(name, bindingExpression, limitFile, limitSize, UploadUnit.MB); } /** * @param limitFile the amount of field(s) input upload. If limitFile less than one , the dynamic mode will enable * @param limitSize the limitation file size for each upload * @param unit the unit value of file size (UploadUnit.KB, UploadUnit.MB, UploadUnit.GB) */ public UIUploadInput(String name, String bindingExpression, int limitFile, int limitSize, UploadUnit unit) { super(name, bindingExpression, String.class); if (limitFile < 1) { dynamic = true; limitFile = 1; } this.limitUnit = unit; for (int i = 0; i < limitFile; i++) { uploadIds.add(new StringBuffer().append(Math.abs(hashCode())).append('-').append(i).toString()); } UploadService service = getApplicationComponent(UploadService.class); for (int i = 0; i < limitFile; i++) { service.addUploadLimit(uploadIds.get(i), Integer.valueOf(limitSize), unit); } setComponentConfig(UIUploadInput.class, null); } public String[] getUploadIds() { return uploadIds.toArray(new String[uploadIds.size()]); } public boolean isDynamicMode() { return dynamic; } public void addNewUploadId() { String lastedUploadId = uploadIds.getLast(); String hash = lastedUploadId.substring(0, lastedUploadId.indexOf('-')); int newIndex = Integer.valueOf(lastedUploadId.substring(hash.length() + 1)) + 1; String newUploadId = new StringBuffer().append(hash).append('-').append(newIndex).toString(); uploadIds.addLast(newUploadId); UploadService service = getApplicationComponent(UploadService.class); service.addUploadLimit(newUploadId, limitSize, limitUnit); } public void removeUploadId(String uploadId) { uploadIds.remove(uploadId); UploadService service = getApplicationComponent(UploadService.class); service.removeUploadLimit(uploadId); } public UploadResource[] getUploadResources() { List<UploadResource> holder = new ArrayList<UploadResource>(); UploadService service = getApplicationComponent(UploadService.class); for (int i = 0; i < uploadIds.size(); i++) { UploadResource uploadResource = service.getUploadResource(uploadIds.get(i)); if (uploadResource == null) continue; holder.add(uploadResource); } return holder.toArray(new UploadResource[holder.size()]); } public UploadResource getUploadResource(String uploadId) { UploadService service = getApplicationComponent(UploadService.class); return service.getUploadResource(uploadId); } public InputStream[] getUploadDataAsStreams() throws FileNotFoundException { List<InputStream> holder = new ArrayList<InputStream>(); UploadService service = getApplicationComponent(UploadService.class); for (int i = 0; i < uploadIds.size(); i++) { UploadResource uploadResource = service.getUploadResource(uploadIds.get(i)); if (uploadResource == null) continue; File file = new File(uploadResource.getStoreLocation()); holder.add(new FileInputStream(file)); } return holder.toArray(new InputStream[holder.size()]); } public InputStream getUploadDataAsStream(String uploadId) throws FileNotFoundException { UploadService service = getApplicationComponent(UploadService.class); UploadResource uploadResource = service.getUploadResource(uploadId); if (uploadResource == null) return null; else return new FileInputStream(new File(uploadResource.getStoreLocation())); } public void decode(Object input, WebuiRequestContext context) { } public static class CreateUploadIdActionListener extends EventListener<UIUploadInput> { public void execute(Event<UIUploadInput> event) throws Exception { UIUploadInput input = event.getSource(); input.addNewUploadId(); event.getRequestContext().addUIComponentToUpdateByAjax(input); } } public static class RemoveUploadIdActionListener extends EventListener<UIUploadInput> { public void execute(Event<UIUploadInput> event) throws Exception { UIUploadInput input = event.getSource(); WebuiRequestContext context = event.getRequestContext(); String uploadId = context.getRequestParameter(UIComponent.OBJECTID); input.removeUploadId(uploadId); context.addUIComponentToUpdateByAjax(input); } } }