/* * 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.services.cms.metadata.impl; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeIterator; import javax.jcr.nodetype.PropertyDefinition; import org.exoplatform.container.component.ComponentPlugin; import org.exoplatform.services.cms.BasePath; import org.exoplatform.services.cms.impl.DMSConfiguration; import org.exoplatform.services.cms.impl.DMSRepositoryConfiguration; import org.exoplatform.services.cms.metadata.MetadataService; import org.exoplatform.services.cms.templates.TemplateService; import org.exoplatform.services.cms.templates.impl.TemplatePlugin; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager; import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.picocontainer.Startable; /** * Process with meta data for system */ public class MetadataServiceImpl implements MetadataService, Startable{ /** * NodeType NT_UNSTRUCTURED */ final static public String NT_UNSTRUCTURED = "nt:unstructured"; /** * Property name INTERNAL_USE */ final static public String INTERNAL_USE = "exo:internalUse"; /** * NodeType METADATA_TYPE */ final static public String METADATA_TYPE = "exo:metadata"; /** * Node name DIALOGS */ final static public String DIALOGS = "dialogs"; /** * Node name VIEWS */ final static public String VIEWS = "views"; /** * Node name DIALOG1 */ final static public String DIALOG1 = "dialog1"; /** * Node name VIEW1 */ final static public String VIEW1 = "view1"; /** * RepositoryService object process with repository */ private RepositoryService repositoryService_; /** * NodeHierarchyCreator object */ private NodeHierarchyCreator nodeHierarchyCreator_; /** * Path to Metadata node in System workspace */ private String baseMetadataPath_; /** * List of TemplatePlugin plugins_ */ private List<TemplatePlugin> plugins_ = new ArrayList<TemplatePlugin>(); /** * DMS configuration which used to store informations */ private DMSConfiguration dmsConfiguration_; private static final Log LOG = ExoLogger.getLogger(MetadataServiceImpl.class.getName()); private TemplateService templateService; /** * Constructor method * @param nodeHierarchyCreator NodeHierarchyCreator object * @param repositoryService RepositoryService object * @param dmsConfiguration DMSConfiguration object * @throws Exception */ public MetadataServiceImpl(NodeHierarchyCreator nodeHierarchyCreator, RepositoryService repositoryService, DMSConfiguration dmsConfiguration) throws Exception { nodeHierarchyCreator_ = nodeHierarchyCreator; repositoryService_ = repositoryService; baseMetadataPath_ = nodeHierarchyCreator_.getJcrPath(BasePath.METADATA_PATH); dmsConfiguration_ = dmsConfiguration; templateService = WCMCoreUtils.getService(TemplateService.class); } /** * {@inheritDoc} */ public void start() { try { init(); } catch (Exception e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error", e); } } } /** * {@inheritDoc} */ public void stop() {} /** * Add TemplatePlugin * @param plugin */ public void addPlugins(ComponentPlugin plugin) { if (plugin instanceof TemplatePlugin) plugins_.add((TemplatePlugin) plugin); } /** * Call all available in list of TemplatePlugin to * add some predefine template to all repository got * from configuration * @throws Exception */ public void init() throws Exception{ for(TemplatePlugin plugin : plugins_) { try { plugin.setBasePath(baseMetadataPath_); plugin.init(); } catch(Exception e) { if (LOG.isErrorEnabled()) { LOG.error("Unexpected error", e); } } } } /** * {@inheritDoc} */ public String addMetadata(String nodetype, boolean isDialog, String role, String content, boolean isAddNew) throws Exception { return addMetadata(nodetype, isDialog, role, content, nodetype, isAddNew); } /** * {@inheritDoc} */ public String addMetadata(String nodetype, boolean isDialog, String role, String content, String label, boolean isAddNew) throws Exception { Session session = getSession(); Node metadataHome = (Node)session.getItem(baseMetadataPath_); String path = null; if(!isAddNew) { if(isDialog) { Node dialog1 = metadataHome.getNode(nodetype).getNode(DIALOGS).getNode(DIALOG1); path = templateService.updateTemplate(dialog1, new ByteArrayInputStream(content.getBytes()), role.split(";")); metadataHome.getNode(nodetype).setProperty("label", label); metadataHome.save(); } else { Node view1 = metadataHome.getNode(nodetype).getNode(VIEWS).getNode(VIEW1); path = templateService.updateTemplate(view1, new ByteArrayInputStream(content.getBytes()), role.split(";")); metadataHome.getNode(nodetype).setProperty("label", label); metadataHome.save(); } return path; } Node metadata = null; if(metadataHome.hasNode(nodetype)) metadata = metadataHome.getNode(nodetype); else metadata = metadataHome.addNode(nodetype, NT_UNSTRUCTURED); metadata.setProperty("label", label); metadataHome.save(); addTemplate(metadata, role, new ByteArrayInputStream(content.getBytes()), isDialog); metadataHome.save(); return metadata.getPath(); } /** * Add new node named nodetype * And child node for dialog template node or view template node * Set property EXO_ROLES_PROP, EXO_TEMPLATE_FILE_PROP for child node * @param nodetype Node name for processing * @param isDialog true for dialog template * @param role permission * @param content content of template * @throws Exception */ private void addTemplate(Node nodetype, String role, InputStream content, boolean isDialog) throws Exception { Node templateHome = createTemplateHome(nodetype, isDialog); String[] arrRoles = {}; if(role != null) arrRoles = role.split(";"); if(isDialog) { templateService.createTemplate(templateHome, DIALOG1, DIALOG1, content, arrRoles); } else { templateService.createTemplate(templateHome, VIEW1, VIEW1, content, arrRoles); } } /** * {@inheritDoc} */ public void removeMetadata(String nodetype) throws Exception { Session session = getSession(); Node metadataHome = (Node)session.getItem(baseMetadataPath_); Node metadata = metadataHome.getNode(nodetype); metadata.remove(); metadataHome.save(); } /** * {@inheritDoc} */ public List<String> getMetadataList() throws Exception { List<String> metadataTypes = new ArrayList<String>(); for(NodeType metadata:getAllMetadatasNodeType()) { metadataTypes.add(metadata.getName()); } return metadataTypes; } /** * {@inheritDoc} */ public List<NodeType> getAllMetadatasNodeType() throws Exception { List<NodeType> metadataTypes = new ArrayList<NodeType>(); ExtendedNodeTypeManager ntManager = repositoryService_.getCurrentRepository().getNodeTypeManager(); NodeTypeIterator ntIter = ntManager.getMixinNodeTypes(); while(ntIter.hasNext()) { NodeType nt = ntIter.nextNodeType(); if(nt.isNodeType(METADATA_TYPE) && !nt.getName().equals(METADATA_TYPE)) metadataTypes.add(nt); } return metadataTypes; } /** * Create node for Dialog template or view template * @param nodetype Node name for processing * @param isDialog true for dialog template, false for view template * @return Node for dialog template if isDialog = true * Node for dialog template if isDialog = false * @throws Exception */ private Node createTemplateHome(Node nodetype, boolean isDialog) throws Exception{ if(isDialog) { Node dialogs = null; if(nodetype.hasNode(DIALOGS)) dialogs = nodetype.getNode(DIALOGS); else dialogs = nodetype.addNode(DIALOGS, NT_UNSTRUCTURED); return dialogs; } Node views = null; if(nodetype.hasNode(VIEWS)) views = nodetype.getNode(VIEWS); else views = nodetype.addNode(VIEWS, NT_UNSTRUCTURED); return views; } /** * {@inheritDoc} */ public String getMetadataTemplate(String name, boolean isDialog) throws Exception { Session session = getSession(); Node metadataHome = (Node)session.getItem(baseMetadataPath_); Node template = null; if(!hasMetadata(name)) return null; if(isDialog) template = metadataHome.getNode(name).getNode(DIALOGS).getNode(DIALOG1); else template = metadataHome.getNode(name).getNode(VIEWS).getNode(VIEW1); String ret = templateService.getTemplate(template); return ret; } /** * {@inheritDoc} */ public String getMetadataPath(String name, boolean isDialog) throws Exception { Session session = getSession(); Node metadataHome = (Node)session.getItem(baseMetadataPath_); if(!hasMetadata(name)) return null; Node template = null; if(isDialog){ template = metadataHome.getNode(name).getNode(DIALOGS).getNode(DIALOG1); } else { template = metadataHome.getNode(name).getNode(VIEWS).getNode(VIEW1); } String ret = template.getPath(); return ret; } /** * {@inheritDoc} */ public String getMetadataRoles(String name, boolean isDialog) throws Exception { Session session = getSession(); Node metadataHome = (Node)session.getItem(baseMetadataPath_); Node template = null; if(!hasMetadata(name)) return null; if(isDialog){ template = metadataHome.getNode(name).getNode(DIALOGS).getNode(DIALOG1); } else { template = metadataHome.getNode(name).getNode(VIEWS).getNode(VIEW1); } String ret = templateService.getTemplateRoles(template); return ret; } /** * {@inheritDoc} */ public boolean hasMetadata(String name) throws Exception { Session session = getSession(); Node metadataHome = (Node)session.getItem(baseMetadataPath_); if(metadataHome.hasNode(name)) { return true; } return false; } /** * {@inheritDoc} */ public List<String> getExternalMetadataType() throws Exception { List<String> extenalMetaTypes = new ArrayList<String>(); for (NodeType metadata : getAllMetadatasNodeType()) { for (PropertyDefinition pro : metadata.getPropertyDefinitions()) { if (pro.getName().equals(INTERNAL_USE)) { if (!pro.getDefaultValues()[0].getBoolean() && !metadata.getName().equals(METADATA_TYPE)) extenalMetaTypes.add(metadata.getName()); break; } } } return extenalMetaTypes; } @Override /** * {@inheritDoc} */ public Node getMetadata(String metaName) throws Exception { Node metadataHome = (Node)getSession().getItem(baseMetadataPath_); try { return metadataHome.getNode(metaName); } catch(PathNotFoundException pne) { return null; } } @Override /** * {@inheritDoc} */ public String getMetadataLabel(String metaName) throws Exception { if(getMetadata(metaName) != null) { try { return getMetadata(metaName).getProperty("label").getString(); } catch(PathNotFoundException pne) { return metaName; } } return null; } private Session getSession() throws Exception{ DMSRepositoryConfiguration dmsRepoConfig = dmsConfiguration_.getConfig(); return WCMCoreUtils.getSystemSessionProvider().getSession(dmsRepoConfig.getSystemWorkspace(), repositoryService_.getCurrentRepository()); } }