/* * Copyright (C) 2003-2007 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero 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.ecm.webui.component.explorer.upload; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.security.AccessControlException; import java.util.ArrayList; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.MissingResourceException; import javax.jcr.AccessDeniedException; import javax.jcr.ItemExistsException; import javax.jcr.ItemNotFoundException; import javax.jcr.NamespaceRegistry; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.lock.LockException; import javax.jcr.nodetype.ConstraintViolationException; import javax.portlet.PortletPreferences; import org.apache.commons.lang.StringUtils; import org.exoplatform.ecm.utils.text.Text; import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer; import org.exoplatform.ecm.webui.form.validator.IllegalDMSCharValidator; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.ecm.webui.tree.selectone.UIOneTaxonomySelector; import org.exoplatform.ecm.webui.utils.JCRExceptionManager; import org.exoplatform.ecm.utils.lock.LockUtil; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.services.cms.BasePath; import org.exoplatform.services.cms.CmsService; import org.exoplatform.services.cms.JcrInputProperty; import org.exoplatform.services.cms.documents.DocumentTypeService; import org.exoplatform.services.cms.impl.DMSConfiguration; import org.exoplatform.services.cms.impl.DMSRepositoryConfiguration; import org.exoplatform.services.cms.link.LinkManager; import org.exoplatform.services.cms.mimetype.DMSMimeTypeResolver; import org.exoplatform.services.cms.taxonomy.TaxonomyService; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.access.PermissionType; import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator; import org.exoplatform.services.jcr.impl.core.NodeImpl; import org.exoplatform.services.listener.ListenerService; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.core.NodeLocation; import org.exoplatform.services.wcm.core.NodetypeConstant; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.upload.UploadResource; import org.exoplatform.upload.UploadService; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.application.portlet.PortletRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.ComponentConfigs; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIComponent; import org.exoplatform.webui.core.UIPopupComponent; import org.exoplatform.webui.core.UIPopupWindow; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.exception.MessageException; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.UIFormMultiValueInputSet; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.input.UIUploadInput; import org.exoplatform.webui.form.validator.MandatoryValidator; /** * Created by The eXo Platform SARL * Author : nqhungvn * nguyenkequanghung@yahoo.com * July 3, 2006 * 10:07:15 AM */ @ComponentConfigs( { @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/groovy/webui/component/explorer/upload/UIUploadForm.gtmpl", events = { @EventConfig(listeners = UIUploadForm.SaveActionListener.class), @EventConfig(listeners = UIUploadForm.CancelActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIUploadForm.AddUploadActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIUploadForm.RemoveUploadActionListener.class, phase = Phase.DECODE) } ), @ComponentConfig( type = UIFormMultiValueInputSet.class, id="UploadMultipleInputset", events = { @EventConfig(listeners = UIUploadForm.RemoveActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIUploadForm.AddActionListener.class, phase = Phase.DECODE) } ) } ) public class UIUploadForm extends UIForm implements UIPopupComponent, UISelectable { /** * Logger. */ private static final Log LOG = ExoLogger.getLogger(UIUploadForm.class.getName()); final static public String FIELD_NAME = "name" ; final static public String FIELD_UPLOAD = "upload" ; final static public String JCRCONTENT = "jcr:content"; final static public String FIELD_TAXONOMY = "fieldTaxonomy"; final static public String FIELD_LISTTAXONOMY = "fieldListTaxonomy"; final static public String POPUP_TAXONOMY = "UIPopupTaxonomy"; final static public String ACCESSIBLE_MEDIA = "accessibleMedia"; private boolean isMultiLanguage_; private List<String> listTaxonomy = new ArrayList<String>(); private List<String> listTaxonomyName = new ArrayList<String>(); private int numberUploadFile = 1; private HashMap<String, List<String>> mapTaxonomies = new HashMap<String, List<String>>(); private List<NodeLocation> listUploadedNodes = new ArrayList<NodeLocation>(); private boolean taxonomyMandatory = false; private DocumentTypeService docService; public UIUploadForm() throws Exception { setMultiPart(true) ; addUIFormInput(new UIFormStringInput(FIELD_NAME, FIELD_NAME, null). addValidator(IllegalDMSCharValidator.class)); PortletRequestContext pcontext = (PortletRequestContext)WebuiRequestContext.getCurrentInstance(); PortletPreferences portletPref = pcontext.getRequest().getPreferences(); String limitPref = portletPref.getValue(Utils.UPLOAD_SIZE_LIMIT_MB, ""); UIUploadInput uiInput = null; if (limitPref != null) { try { uiInput = new UIUploadInput(FIELD_UPLOAD, FIELD_UPLOAD, 1, Integer.parseInt(limitPref.trim())); } catch (NumberFormatException e) { uiInput = new UIUploadInput(FIELD_UPLOAD, FIELD_UPLOAD); } } else { uiInput = new UIUploadInput(FIELD_UPLOAD, FIELD_UPLOAD); } addUIFormInput(uiInput); docService = WCMCoreUtils.getService(DocumentTypeService.class); } public int getNumberUploadFile() { return numberUploadFile; } public void setNumberUploadFile(int numberUpload) { numberUploadFile = numberUpload; } public HashMap<String, List<String>> getMapTaxonomies() { return mapTaxonomies; } public void setMapTaxonomies(HashMap<String, List<String>> mapTaxonomiesAvaiable) { mapTaxonomies = mapTaxonomiesAvaiable; } public List<String> getListTaxonomy() { return listTaxonomy; } public List<String> getlistTaxonomyName() { return listTaxonomyName; } public void setListTaxonomy(List<String> listTaxonomyNew) { listTaxonomy = listTaxonomyNew; } public void setListTaxonomyName(List<String> listTaxonomyNameNew) { listTaxonomyName = listTaxonomyNameNew; } public boolean getTaxonomyMandatory() { return taxonomyMandatory; } public void setTaxonomyMandatory(boolean taxoMandatory) { taxonomyMandatory = taxoMandatory; } public String getPathTaxonomy() throws Exception { UIJCRExplorer uiExplorer = getAncestorOfType(UIJCRExplorer.class); DMSConfiguration dmsConfig = getApplicationComponent(DMSConfiguration.class); DMSRepositoryConfiguration dmsRepoConfig = dmsConfig.getConfig(); String workspaceName = dmsRepoConfig.getSystemWorkspace(); NodeHierarchyCreator nodeHierarchyCreator = getApplicationComponent(NodeHierarchyCreator.class); Session session = uiExplorer.getSessionByWorkspace(workspaceName); return ((Node)session.getItem(nodeHierarchyCreator.getJcrPath(BasePath.TAXONOMIES_TREE_STORAGE_PATH))).getPath(); } public void initFieldInput() throws Exception { PortletRequestContext pcontext = (PortletRequestContext)WebuiRequestContext.getCurrentInstance(); PortletPreferences portletPref = pcontext.getRequest().getPreferences(); String categoryMandatoryWhenFileUpload = portletPref.getValue(Utils.CATEGORY_MANDATORY, "").trim(); UIFormMultiValueInputSet uiFormMultiValue = createUIComponent(UIFormMultiValueInputSet.class, "UploadMultipleInputset", null); uiFormMultiValue.setId(FIELD_LISTTAXONOMY); uiFormMultiValue.setName(FIELD_LISTTAXONOMY); uiFormMultiValue.setType(UIFormStringInput.class); uiFormMultiValue.setEditable(false); if (categoryMandatoryWhenFileUpload.equalsIgnoreCase("true")) { uiFormMultiValue.addValidator(MandatoryValidator.class); setTaxonomyMandatory(true); } else { setTaxonomyMandatory(false); } uiFormMultiValue.setValue(listTaxonomyName); addUIFormInput(uiFormMultiValue); } public String[] getActions() { return new String[] {"Save", "Cancel"}; } public void setIsMultiLanguage(boolean isMultiLanguage, String language) { isMultiLanguage_ = isMultiLanguage ; } public void resetComponent() { removeChildById(FIELD_UPLOAD); addUIFormInput(new UIUploadInput(FIELD_UPLOAD, FIELD_UPLOAD)); } public boolean isMultiLanguage() { return isMultiLanguage_ ; } public void activate() {} public void deActivate() {} public void doSelect(String selectField, Object value) throws Exception { String valueTaxonomy = String.valueOf(value).trim(); List<String> indexMapTaxonomy = new ArrayList<String>(); if (mapTaxonomies.containsKey(selectField)){ indexMapTaxonomy = mapTaxonomies.get(selectField); mapTaxonomies.remove(selectField); } if (!indexMapTaxonomy.contains(valueTaxonomy)) indexMapTaxonomy.add(valueTaxonomy); mapTaxonomies.put(selectField, indexMapTaxonomy); updateAdvanceTaxonomy(selectField); UIUploadManager uiUploadManager = getParent(); uiUploadManager.removeChildById(POPUP_TAXONOMY); } public List<String> getListSameNames(Event<UIUploadForm> event) throws Exception { List<String> sameNameList = new ArrayList<String>(); Node selectedNode = getAncestorOfType(UIJCRExplorer.class).getCurrentNode(); int index = 0; String name = null; for (UIComponent uiComp : getChildren()) { if(uiComp instanceof UIUploadInput) { String[] arrayId = uiComp.getId().split(FIELD_UPLOAD); if ((arrayId.length > 0) && (arrayId[0].length() > 0)) index = new Integer(arrayId[0]).intValue(); UIUploadInput uiUploadInput; if (index == 0){ uiUploadInput = (UIUploadInput)getUIInput(FIELD_UPLOAD); } else { uiUploadInput = (UIUploadInput)getUIInput(index + FIELD_UPLOAD); } String uploadId = uiUploadInput.getUploadIds()[0]; if (uiUploadInput.getUploadResource(uploadId) == null) return sameNameList; String fileName = uiUploadInput.getUploadResource(uploadId).getFileName(); if (index == 0){ name = getUIStringInput(FIELD_NAME).getValue(); } else { name = getUIStringInput(index + FIELD_NAME).getValue(); } if(name == null) { name = fileName; } else { name = name.trim(); } name = Text.escapeIllegalJcrChars(name); if (!passNameValidation(name)) { return new ArrayList<String>(); } if(selectedNode.hasNode(name)) sameNameList.add(name); } } return sameNameList; } @SuppressWarnings("rawtypes") public void doUpload(Event event, boolean isKeepFile) throws Exception { UIApplication uiApp = getAncestorOfType(UIApplication.class) ; UIJCRExplorer uiExplorer = getAncestorOfType(UIJCRExplorer.class) ; UIUploadManager uiManager = getParent(); UIUploadContainer uiUploadContainer = uiManager.getChild(UIUploadContainer.class); UploadService uploadService = getApplicationComponent(UploadService.class); UIUploadContent uiUploadContent = uiManager.findFirstComponentOfType(UIUploadContent.class); List<String[]> listArrValues = new ArrayList<String[]>(); CmsService cmsService = getApplicationComponent(CmsService.class) ; List<UIComponent> listFormChildren = getChildren(); int index = 0; InputStream inputStream; String name = null; TaxonomyService taxonomyService = getApplicationComponent(TaxonomyService.class); if(uiExplorer.getCurrentNode().isLocked()) { String lockToken = LockUtil.getLockToken(uiExplorer.getCurrentNode()); if(lockToken != null) uiExplorer.getSession().addLockToken(lockToken); } PortletRequestContext pcontext = (PortletRequestContext)WebuiRequestContext.getCurrentInstance(); PortletPreferences portletPref = pcontext.getRequest().getPreferences(); String categoryMandatoryWhenFileUpload = portletPref.getValue(Utils.CATEGORY_MANDATORY, "").trim(); DMSMimeTypeResolver mimeTypeSolver = DMSMimeTypeResolver.getInstance(); Node selectedNode = uiExplorer.getCurrentNode(); if (categoryMandatoryWhenFileUpload.equalsIgnoreCase("true") && (getMapTaxonomies().size() == 0) && !uiExplorer.getCurrentNode().hasNode(JCRCONTENT)) { uiApp.addMessage(new ApplicationMessage("UIUploadForm.msg.taxonomyPath-error", null, ApplicationMessage.WARNING)) ; return ; } String pers = PermissionType.ADD_NODE + "," + PermissionType.SET_PROPERTY ; selectedNode.getSession().checkPermission(selectedNode.getPath(), pers); try { int indexValidate = 0; for (UIComponent uiCompValidate : listFormChildren) { if(uiCompValidate instanceof UIUploadInput) { String[] arrayIdValidate = uiCompValidate.getId().split(FIELD_UPLOAD); if ((arrayIdValidate.length > 0) && (arrayIdValidate[0].length() > 0)) indexValidate = new Integer(arrayIdValidate[0]).intValue(); UIUploadInput uiUploadInput; if (indexValidate == 0){ uiUploadInput = (UIUploadInput) getUIInput(FIELD_UPLOAD); } else { uiUploadInput = (UIUploadInput) getUIInput(indexValidate + FIELD_UPLOAD); } String uploadId = uiUploadInput.getUploadIds()[0]; if(uiUploadInput.getUploadResource(uploadId) == null) { uiApp.addMessage(new ApplicationMessage("UIUploadForm.msg.fileName-error", null, ApplicationMessage.WARNING)) ; return ; } String fileName = uiUploadInput.getUploadResource(uploadId).getFileName(); if(fileName == null || fileName.length() == 0) { uiApp.addMessage(new ApplicationMessage("UIUploadForm.msg.fileName-error", null, ApplicationMessage.WARNING)) ; return; } } } for (UIComponent uiComp : listFormChildren) { if(uiComp instanceof UIUploadInput) { String[] arrayId = uiComp.getId().split(FIELD_UPLOAD); if ((arrayId.length > 0) && (arrayId[0].length() > 0)) index = new Integer(arrayId[0]).intValue(); UIUploadInput uiUploadInput; if (index == 0){ uiUploadInput = (UIUploadInput) getUIInput(FIELD_UPLOAD); } else { uiUploadInput = (UIUploadInput) getUIInput(index + FIELD_UPLOAD); } String uploadId = uiUploadInput.getUploadIds()[0]; if(uiUploadInput.getUploadResource(uploadId) == null) { if ((listUploadedNodes != null) && (listUploadedNodes.size() > 0)) { for (Object uploadedNode : NodeLocation.getNodeListByLocationList(listUploadedNodes)) { ((Node)uploadedNode).remove(); } uiExplorer.getCurrentNode().save(); listUploadedNodes.clear(); } uiApp.addMessage(new ApplicationMessage("UIUploadForm.msg.fileName-error", null, ApplicationMessage.WARNING)) ; return ; } String fileName = uiUploadInput.getUploadResource(uploadId).getFileName(); if(fileName == null || fileName.length() == 0) { if ((listUploadedNodes != null) && (listUploadedNodes.size() > 0)) { for (Object uploadedNode : NodeLocation.getNodeListByLocationList(listUploadedNodes)) { ((Node)uploadedNode).remove(); } uiExplorer.getCurrentNode().save(); listUploadedNodes.clear(); } uiApp.addMessage(new ApplicationMessage("UIUploadForm.msg.fileName-error", null, ApplicationMessage.WARNING)) ; return; } try { inputStream = new BufferedInputStream(uiUploadInput.getUploadDataAsStream(uploadId)); } catch (FileNotFoundException e) { inputStream = new BufferedInputStream(new ByteArrayInputStream(new byte[] {})); } if (index == 0){ name = getUIStringInput(FIELD_NAME).getValue(); } else { name = getUIStringInput(index + FIELD_NAME).getValue(); } if(name == null) name = fileName; else name = name.trim(); if (!passNameValidation(name)) { uiApp.addMessage(new ApplicationMessage("UIUploadForm.msg.fileName-invalid-with-name", new Object[] {name}, ApplicationMessage.WARNING)); return; } name = Text.escapeIllegalJcrChars(name); // Append extension if necessary String mimeType = mimeTypeSolver.getMimeType(fileName); String ext = "." + fileName.substring(fileName.lastIndexOf(".") + 1); if (name.lastIndexOf(ext) < 0 && !mimeTypeSolver.getMimeType(name).equals(mimeType)) { StringBuffer sb = new StringBuffer(); sb.append(name).append(ext); name = sb.toString(); } List<String> listTaxonomyNameNew = new ArrayList<String>(); if (index == 0) listTaxonomyNameNew = mapTaxonomies.get(FIELD_LISTTAXONOMY); else listTaxonomyNameNew = mapTaxonomies.get(index + FIELD_LISTTAXONOMY); String taxonomyTree = null; String taxonomyPath = null; if (listTaxonomyNameNew != null) { for(String categoryPath : listTaxonomyNameNew) { try { if (categoryPath.startsWith("/")) categoryPath = categoryPath.substring(1); if(categoryPath.indexOf("/")>0) { taxonomyTree = categoryPath.substring(0, categoryPath.indexOf("/")); taxonomyPath = categoryPath.substring(categoryPath.indexOf("/") + 1); taxonomyService.getTaxonomyTree(taxonomyTree).hasNode(taxonomyPath); } else { taxonomyTree = categoryPath; taxonomyPath = ""; } } catch (ItemNotFoundException e) { uiApp.addMessage(new ApplicationMessage("UISelectedCategoriesGrid.msg.non-categories", null, ApplicationMessage.WARNING)) ; return; } catch (RepositoryException re) { uiApp.addMessage(new ApplicationMessage("UISelectedCategoriesGrid.msg.non-categories", null, ApplicationMessage.WARNING)) ; return; } catch(Exception e) { if (LOG.isErrorEnabled()) { LOG.error("An unexpected error occurs", e); } uiApp.addMessage(new ApplicationMessage("UISelectedCategoriesGrid.msg.non-categories", null, ApplicationMessage.WARNING)) ; return; } } } boolean isExist = selectedNode.hasNode(name) ; String newNodeUUID = null; if(selectedNode.getPrimaryNodeType().isNodeType(Utils.NT_FILE)) { if(!selectedNode.isCheckedOut()) selectedNode.checkout() ; Node contentNode = selectedNode.getNode(Utils.JCR_CONTENT); if(contentNode.getProperty(Utils.JCR_MIMETYPE).getString().equals(mimeType)) { contentNode.setProperty(Utils.JCR_DATA, inputStream); contentNode.setProperty(Utils.JCR_LASTMODIFIED, new GregorianCalendar()); selectedNode.save() ; uiManager.setRendered(false); uiExplorer.updateAjax(event); return; } } if(!isExist || isKeepFile) { String nodeType = contains(docService.getMimeTypes(ACCESSIBLE_MEDIA), mimeType) ? NodetypeConstant.EXO_ACCESSIBLE_MEDIA : Utils.NT_FILE; newNodeUUID = cmsService.storeNodeByUUID(nodeType, selectedNode, getInputProperties(name, inputStream, mimeType), true) ; selectedNode.save(); selectedNode.getSession().save(); if ((listTaxonomyNameNew != null) && (listTaxonomyNameNew.size() > 0)) { Node newNode = null; try { newNode = selectedNode.getSession().getNodeByUUID(newNodeUUID); } catch(ItemNotFoundException e) { newNode = Utils.findNodeByUUID(newNodeUUID); } if (newNode != null) { for (String categoryPath : listTaxonomyNameNew) { try { if (categoryPath.startsWith("/")) categoryPath = categoryPath.substring(1); if(categoryPath.indexOf("/")>0) { taxonomyTree = categoryPath.substring(0, categoryPath.indexOf("/")); taxonomyPath = categoryPath.substring(categoryPath.indexOf("/") + 1); } else { taxonomyTree = categoryPath; taxonomyPath = ""; } taxonomyService.addCategory(newNode, taxonomyTree, taxonomyPath); } catch (ItemExistsException e) { uiApp.addMessage(new ApplicationMessage("UIUploadForm.msg.ItemExistsException", null, ApplicationMessage.WARNING)); return; } catch (RepositoryException e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error", e); } JCRExceptionManager.process(uiApp, e); return; } } } } } else { Node node = selectedNode.getNode(name) ; if (isTaxonomyChildNode(node)) { LinkManager linkManager = getApplicationComponent(LinkManager.class); node = linkManager.getTarget(node); } if(!node.getPrimaryNodeType().isNodeType(Utils.NT_FILE)) { Object[] args = { name } ; uiApp.addMessage(new ApplicationMessage("UIUploadForm.msg.name-is-exist", args, ApplicationMessage.WARNING)) ; return ; } String nodetypes = System.getProperty("wcm.nodetypes.ignoreversion"); if(nodetypes == null || nodetypes.length() == 0) nodetypes = "exo:webContent"; if(Utils.isMakeVersionable(node, nodetypes.split(","))) { if(!node.isNodeType(Utils.MIX_VERSIONABLE) && node.canAddMixin(Utils.MIX_VERSIONABLE)) { node.addMixin(Utils.MIX_VERSIONABLE); } } Node contentNode = node.getNode(Utils.JCR_CONTENT); if(!node.isCheckedOut()) node.checkout() ; contentNode.setProperty(Utils.JCR_DATA, inputStream); contentNode.setProperty(Utils.JCR_MIMETYPE, mimeType); contentNode.setProperty(Utils.JCR_LASTMODIFIED, new GregorianCalendar()); if (node.isNodeType("exo:datetime")) { node.setProperty("exo:dateModified",new GregorianCalendar()) ; } node.save(); ListenerService listenerService = getApplicationComponent(ListenerService.class); listenerService.broadcast(CmsService.POST_EDIT_CONTENT_EVENT, this, node); if (listTaxonomyNameNew != null) { for (String categoryPath : listTaxonomyNameNew) { try { if (categoryPath.startsWith("/")) categoryPath = categoryPath.substring(1); if(categoryPath.indexOf("/")>0) { taxonomyTree = categoryPath.substring(0, categoryPath.indexOf("/")); taxonomyPath = categoryPath.substring(categoryPath.indexOf("/") + 1); } else { taxonomyTree = categoryPath; taxonomyPath = ""; } taxonomyService.addCategory(node, taxonomyTree, taxonomyPath); } catch (ItemExistsException e) { uiApp.addMessage(new ApplicationMessage("UIUploadForm.msg.ItemExistsException", null, ApplicationMessage.WARNING)); return; } catch (RepositoryException e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error", e); } JCRExceptionManager.process(uiApp, e); return; } } } } uiExplorer.getSession().save() ; Node uploadedNode = null; if(isMultiLanguage_) { uiUploadContainer.setUploadedNode(selectedNode); uploadedNode = selectedNode; } else { Node newNode = null ; if(!isExist) { try { newNode = selectedNode.getSession().getNodeByUUID(newNodeUUID); } catch(ItemNotFoundException e) { newNode = Utils.findNodeByUUID(newNodeUUID); } } else { newNode = selectedNode.getNode(name) ; } if(newNode != null) { uiUploadContainer.setUploadedNode(newNode); uploadedNode = newNode; } } if(mimeType.indexOf(Utils.FLASH_MIMETYPE) >= 0 && uploadedNode.canAddMixin(Utils.EXO_RISIZEABLE)) { uploadedNode.addMixin(Utils.EXO_RISIZEABLE); uploadedNode.save(); } //get file size double size = 0; if (uploadedNode.hasNode(Utils.JCR_CONTENT)) { Node contentNode = uploadedNode.getNode(Utils.JCR_CONTENT); if (contentNode.hasProperty(Utils.JCR_DATA)) { size = contentNode.getProperty(Utils.JCR_DATA).getLength(); } } else { size = uploadService.getUploadResource(uiUploadInput.getUploadIds()[0]).getEstimatedSize(); } String fileSize = Utils.calculateFileSize(size); String iconUpload = Utils.getNodeTypeIcon(uploadedNode, "16x16Icon").replaceAll("nt_file16x16Icon ", ""); String[] arrValues = {iconUpload, Text.unescapeIllegalJcrChars(fileName), Text.unescapeIllegalJcrChars(name), fileSize, mimeType, uploadedNode.getPath()}; listUploadedNodes.add(NodeLocation.getNodeLocationByNode(uploadedNode)); listArrValues.add(arrValues); inputStream.close(); } } uiUploadContent.setListUploadValues(listArrValues); uiManager.setRenderedChild(UIUploadContainer.class); uiExplorer.setIsHidePopup(true); uiExplorer.updateAjax(event); event.getRequestContext().addUIComponentToUpdateByAjax(uiManager); } catch(ConstraintViolationException con) { Object[] args = {name, } ; throw new MessageException(new ApplicationMessage("UIUploadForm.msg.contraint-violation", args, ApplicationMessage.WARNING)) ; } catch(LockException lock) { throw new MessageException(new ApplicationMessage("UIUploadForm.msg.lock-exception", null, ApplicationMessage.WARNING)) ; } catch(AccessDeniedException ade) { throw new MessageException(new ApplicationMessage("UIActionBar.msg.access-add-denied", null, ApplicationMessage.WARNING)); } catch(AccessControlException ace) { throw new MessageException(new ApplicationMessage("UIActionBar.msg.access-add-denied", null, ApplicationMessage.WARNING)); } catch (ItemExistsException iee) { uiApp.addMessage(new ApplicationMessage("UIActionBar.msg.item-existed", null, ApplicationMessage.WARNING)); } catch(Exception e) { if (LOG.isErrorEnabled()) { LOG.error("An unexpected error occurs", e); } JCRExceptionManager.process(uiApp, e); return ; } } /** * Check if a node is child node of taxonomy node or not * * @param node * @return */ private boolean isTaxonomyChildNode(Node node) throws RepositoryException { Node parrentNode = node.getParent(); while (!((NodeImpl) parrentNode).isRoot()) { if (parrentNode.isNodeType(Utils.EXO_TAXONOMY)) { return true; } parrentNode = parrentNode.getParent(); } return false; } private Map<String, JcrInputProperty> getInputProperties(String name, InputStream inputStream, String mimeType) { Map<String,JcrInputProperty> inputProperties = new HashMap<String,JcrInputProperty>() ; JcrInputProperty nodeInput = new JcrInputProperty() ; nodeInput.setJcrPath("/node") ; nodeInput.setValue(name) ; nodeInput.setMixintype("mix:i18n,mix:votable,mix:commentable") ; nodeInput.setType(JcrInputProperty.NODE) ; inputProperties.put("/node",nodeInput) ; JcrInputProperty jcrContent = new JcrInputProperty() ; jcrContent.setJcrPath("/node/jcr:content") ; jcrContent.setValue("") ; jcrContent.setMixintype("dc:elementSet") ; jcrContent.setNodetype(Utils.NT_RESOURCE) ; jcrContent.setType(JcrInputProperty.NODE) ; inputProperties.put("/node/jcr:content",jcrContent) ; JcrInputProperty jcrData = new JcrInputProperty() ; jcrData.setJcrPath("/node/jcr:content/jcr:data") ; jcrData.setValue(inputStream) ; inputProperties.put("/node/jcr:content/jcr:data",jcrData) ; JcrInputProperty jcrMimeType = new JcrInputProperty() ; jcrMimeType.setJcrPath("/node/jcr:content/jcr:mimeType") ; jcrMimeType.setValue(mimeType) ; inputProperties.put("/node/jcr:content/jcr:mimeType",jcrMimeType) ; JcrInputProperty jcrLastModified = new JcrInputProperty() ; jcrLastModified.setJcrPath("/node/jcr:content/jcr:lastModified") ; jcrLastModified.setValue(new GregorianCalendar()) ; inputProperties.put("/node/jcr:content/jcr:lastModified",jcrLastModified) ; JcrInputProperty jcrEncoding = new JcrInputProperty() ; jcrEncoding.setJcrPath("/node/jcr:content/jcr:encoding") ; jcrEncoding.setValue("UTF-8") ; inputProperties.put("/node/jcr:content/jcr:encoding",jcrEncoding) ; return inputProperties; } private void updateAdvanceTaxonomy(String selectField) throws Exception { List<UIComponent> listChildren = getChildren(); for (UIComponent uiComp : listChildren) { if (uiComp.getId().equals(selectField)) { UIFormMultiValueInputSet uiFormMultiValueInputSet = getChildById(selectField); if (mapTaxonomies.containsKey(selectField)) uiFormMultiValueInputSet.setValue(getTaxonomyLabel(mapTaxonomies.get(selectField))); } } } private List<String> getTaxonomyLabel(List<String> taxonomyPaths) { List<String> taxonomyLabels = new ArrayList<String>(); String[] taxonomyPathSplit = null; StringBuilder buildlabel; StringBuilder buildPathlabel; for (String taxonomyPath : taxonomyPaths) { if (taxonomyPath.startsWith("/")) taxonomyPath = taxonomyPath.substring(1); taxonomyPathSplit = taxonomyPath.split("/"); buildlabel = new StringBuilder(); buildPathlabel = new StringBuilder(); for (int i = 0; i < taxonomyPathSplit.length; i++) { buildlabel = new StringBuilder("eXoTaxonomies"); try { for (int j = 0; j <= i; j++) { buildlabel.append(".").append(taxonomyPathSplit[j]); } buildPathlabel.append(Utils.getResourceBundle(buildlabel.append(".label").toString())).append("/"); } catch (MissingResourceException me) { buildPathlabel.append(taxonomyPathSplit[i]).append("/"); } } taxonomyLabels.add(buildPathlabel.substring(0, buildPathlabel.length() - 1)); } return taxonomyLabels; } private boolean passNameValidation(String name) throws Exception { if (name == null || name.contains("[") || name.contains("]") || name.contains("\"") || name.contains("/")) return false; int count = 0; for (char c : name.toCharArray()) { if (c == ':') count ++; if (count > 1) return false; } if (count == 1) { if (name.split(":").length < 2) return false; String namespace = name.split(":")[0]; NamespaceRegistry namespaceRegistry = getApplicationComponent(RepositoryService.class) .getRepository(getAncestorOfType(UIJCRExplorer.class).getRepositoryName()).getNamespaceRegistry() ; String[] prefixs = namespaceRegistry.getPrefixes(); for (String prefix : prefixs) if (namespace.equals(prefix)) return true; return false; } return true; } private boolean contains(String[] arr, String item) { if (arr != null) { for (String arrItem : arr) { if (StringUtils.equals(arrItem, item)) return true; } } return false; } static public class SaveActionListener extends EventListener<UIUploadForm> { public void execute(Event<UIUploadForm> event) throws Exception { UIUploadForm uiForm = event.getSource(); UIUploadManager uiManager = uiForm.getParent(); if(uiForm.getListSameNames(event).size() > 0) { UIPopupWindow uiPopupWindow = uiManager.initPopupWhenHaveSameName(); UIUploadBehaviorWithSameName uiUploadBehavior = uiManager.createUIComponent(UIUploadBehaviorWithSameName.class, null, null); uiUploadBehavior.setMessageKey("UIUploadForm.msg.confirm-behavior"); uiUploadBehavior.setArguments( uiForm.getListSameNames(event).toArray(new String[uiForm.getListSameNames(event).size()])); uiPopupWindow.setUIComponent(uiUploadBehavior); uiPopupWindow.setShow(true); uiPopupWindow.setRendered(true); event.getRequestContext().addUIComponentToUpdateByAjax(uiManager); return; } uiForm.doUpload(event, false); } } static public class CancelActionListener extends EventListener<UIUploadForm> { public void execute(Event<UIUploadForm> event) throws Exception { UIJCRExplorer uiExplorer = event.getSource().getAncestorOfType(UIJCRExplorer.class) ; uiExplorer.cancelAction() ; } } static public class RemoveActionListener extends EventListener<UIFormMultiValueInputSet> { public void execute(Event<UIFormMultiValueInputSet> event) throws Exception { UIFormMultiValueInputSet uiSet = event.getSource(); UIComponent uiComponent = uiSet.getParent(); if (uiComponent instanceof UIUploadForm) { UIUploadForm uiUploadForm = (UIUploadForm)uiComponent; String id = event.getRequestContext().getRequestParameter(OBJECTID); String[] arrayId = id.split(FIELD_LISTTAXONOMY); int index = 0; int indexRemove = 0; if ((arrayId.length > 0) && (arrayId[0].length() > 0)) index = new Integer(arrayId[0]).intValue(); if ((arrayId.length > 0) && (arrayId[1].length() > 0)) indexRemove = new Integer(arrayId[1]).intValue(); String idFieldListTaxonomy; if (index == 0) idFieldListTaxonomy = FIELD_LISTTAXONOMY; else idFieldListTaxonomy = index + FIELD_LISTTAXONOMY; if (uiUploadForm.mapTaxonomies.containsKey(idFieldListTaxonomy)) { List<String> indexMapTaxonomy = new ArrayList<String>(); indexMapTaxonomy = uiUploadForm.mapTaxonomies.get(idFieldListTaxonomy); uiUploadForm.mapTaxonomies.remove(idFieldListTaxonomy); if (indexMapTaxonomy.size() > indexRemove) indexMapTaxonomy.remove(indexRemove); uiUploadForm.mapTaxonomies.put(idFieldListTaxonomy, indexMapTaxonomy); } uiSet.removeChildById(id); event.getRequestContext().addUIComponentToUpdateByAjax(uiUploadForm); } } } static public class AddActionListener extends EventListener<UIFormMultiValueInputSet> { public void execute(Event<UIFormMultiValueInputSet> event) throws Exception { UIFormMultiValueInputSet uiSet = event.getSource(); UIUploadForm uiUploadForm = (UIUploadForm) uiSet.getParent(); UIApplication uiApp = uiUploadForm.getAncestorOfType(UIApplication.class); try { String fieldTaxonomyId = event.getRequestContext().getRequestParameter(OBJECTID); String[] arrayId = fieldTaxonomyId.split(FIELD_LISTTAXONOMY); int index = 0; if ((arrayId.length > 0) && (arrayId[0].length() > 0)) index = new Integer(arrayId[0]).intValue(); String idFieldUpload; if (index == 0) idFieldUpload = FIELD_UPLOAD; else idFieldUpload = index + FIELD_UPLOAD; UIUploadInput uiUploadInput = uiUploadForm.getChildById(idFieldUpload); UploadResource uploadResource = uiUploadInput.getUploadResource(uiUploadInput.getUploadIds()[0]); if (uploadResource == null) { uiApp.addMessage(new ApplicationMessage("UIUploadForm.msg.upload-not-null", null, ApplicationMessage.WARNING)); return; } UIUploadManager uiUploadManager = uiUploadForm.getParent(); UIJCRExplorer uiExplorer = uiUploadForm.getAncestorOfType(UIJCRExplorer.class); String repository = uiExplorer.getRepositoryName(); UIPopupWindow uiPopupWindow = uiUploadManager.initPopupTaxonomy(POPUP_TAXONOMY); UIOneTaxonomySelector uiOneTaxonomySelector = uiUploadManager.createUIComponent(UIOneTaxonomySelector.class, null, null); uiPopupWindow.setUIComponent(uiOneTaxonomySelector); TaxonomyService taxonomyService = uiUploadForm.getApplicationComponent(TaxonomyService.class); List<Node> lstTaxonomyTree = taxonomyService.getAllTaxonomyTrees(); if (lstTaxonomyTree.size() == 0) throw new AccessDeniedException(); String workspaceName = lstTaxonomyTree.get(0).getSession().getWorkspace().getName(); uiOneTaxonomySelector.setIsDisable(workspaceName, false); uiOneTaxonomySelector.setRootNodeLocation(repository, workspaceName, lstTaxonomyTree.get(0).getPath()); uiOneTaxonomySelector.setExceptedNodeTypesInPathPanel(new String[] {Utils.EXO_SYMLINK}); uiOneTaxonomySelector.init(uiExplorer.getSystemProvider()); String param = "returnField=" + fieldTaxonomyId; uiOneTaxonomySelector.setSourceComponent(uiUploadForm, new String[]{param}); uiPopupWindow.setRendered(true); uiPopupWindow.setShow(true); event.getRequestContext().addUIComponentToUpdateByAjax(uiUploadManager); } catch (AccessDeniedException accessDeniedException) { uiApp.addMessage(new ApplicationMessage("Taxonomy.msg.AccessDeniedException", null, ApplicationMessage.WARNING)); return; } catch (Exception e) { JCRExceptionManager.process(uiApp, e); return; } } } static public class AddUploadActionListener extends EventListener<UIUploadForm> { public void execute(Event<UIUploadForm> event) throws Exception { UIUploadForm uiUploadForm = event.getSource(); List<UIComponent> listChildren = uiUploadForm.getChildren(); int index = 0; int numberUploadFile = 0; String fieldFieldUpload = null; for (UIComponent uiComp : listChildren) { if(uiComp instanceof UIUploadInput) { fieldFieldUpload = uiComp.getId(); numberUploadFile++; } } if (fieldFieldUpload != null) { String[] arrayId = fieldFieldUpload.split(FIELD_UPLOAD); if ((arrayId.length > 0) && (arrayId[0].length() > 0)) index = new Integer(arrayId[0]).intValue(); } index++; uiUploadForm.addUIFormInput(new UIFormStringInput(index + FIELD_NAME, index + FIELD_NAME, null)); PortletRequestContext pcontext = (PortletRequestContext)WebuiRequestContext.getCurrentInstance(); PortletPreferences portletPref = pcontext.getRequest().getPreferences(); String limitPref = portletPref.getValue(Utils.UPLOAD_SIZE_LIMIT_MB, ""); UIUploadInput uiInput = null; if (limitPref != null) { try { uiInput = new UIUploadInput(index + FIELD_UPLOAD, index + FIELD_UPLOAD, Integer.parseInt(limitPref.trim())); } catch (NumberFormatException e) { uiInput = new UIUploadInput(index + FIELD_UPLOAD, index + FIELD_UPLOAD); } } else { uiInput = new UIUploadInput(index + FIELD_UPLOAD, index + FIELD_UPLOAD); } uiUploadForm.addUIFormInput(uiInput); UIFormMultiValueInputSet uiFormMultiValue = uiUploadForm.createUIComponent(UIFormMultiValueInputSet.class, "UploadMultipleInputset", null); uiFormMultiValue.setId(index + FIELD_LISTTAXONOMY); uiFormMultiValue.setName(index + FIELD_LISTTAXONOMY); uiFormMultiValue.setType(UIFormStringInput.class); uiFormMultiValue.setEditable(false); uiUploadForm.addUIFormInput(uiFormMultiValue); uiUploadForm.setNumberUploadFile(numberUploadFile + 1); uiUploadForm.setRendered(true); event.getRequestContext().addUIComponentToUpdateByAjax(uiUploadForm.getParent()); } } static public class RemoveUploadActionListener extends EventListener<UIUploadForm> { public void execute(Event<UIUploadForm> event) throws Exception { String id = event.getRequestContext().getRequestParameter(OBJECTID); UIUploadForm uiUploadForm = event.getSource(); List<UIComponent> listChildren = uiUploadForm.getChildren(); int index = 0; for (UIComponent uiComp : listChildren) { if(uiComp instanceof UIUploadInput) index++; } String[] arrayId = id.split(FIELD_NAME); int indexRemove = 0; if ((arrayId.length > 0) && (arrayId[0].length() > 0)) indexRemove = new Integer(arrayId[0]).intValue(); if (indexRemove == 0) { uiUploadForm.removeChildById(FIELD_NAME); uiUploadForm.removeChildById(FIELD_UPLOAD); uiUploadForm.removeChildById(FIELD_LISTTAXONOMY); if (uiUploadForm.mapTaxonomies.containsKey(FIELD_LISTTAXONOMY)) uiUploadForm.mapTaxonomies.remove(FIELD_LISTTAXONOMY); } else { uiUploadForm.removeChildById(indexRemove + FIELD_NAME); uiUploadForm.removeChildById(indexRemove + FIELD_UPLOAD); uiUploadForm.removeChildById(indexRemove + FIELD_LISTTAXONOMY); if (uiUploadForm.mapTaxonomies.containsKey(indexRemove + FIELD_LISTTAXONOMY)) uiUploadForm.mapTaxonomies.remove(indexRemove + FIELD_LISTTAXONOMY); } uiUploadForm.setNumberUploadFile(index - 1); uiUploadForm.setRendered(true); event.getRequestContext().addUIComponentToUpdateByAjax(uiUploadForm.getParent()); } } }