/* Index ECM Engine - A system for managing the capture (when created
* or received), classification (cataloguing), storage, retrieval,
* revision, sharing, reuse and disposition of documents.
*
* Copyright (C) 2008 Regione Piemonte
* Copyright (C) 2008 Provincia di Torino
* Copyright (C) 2008 Comune di Torino
*
* 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; either version 2,
* 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, write to the Free Software
* Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
package it.doqui.index.ecmengine.business.foundation.repository;
import it.doqui.index.ecmengine.business.foundation.EcmEngineWrapperBean;
import it.doqui.index.ecmengine.business.foundation.util.FoundationErrorCodes;
import it.doqui.index.ecmengine.exception.repository.NodeRuntimeException;
import it.doqui.index.ecmengine.util.EcmEngineConstants;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.alfresco.service.cmr.dictionary.InvalidAspectException;
import org.alfresco.service.cmr.dictionary.InvalidTypeException;
import org.alfresco.service.cmr.lock.NodeLockedException;
import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.DuplicateChildNodeNameException;
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.Path;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.namespace.QName;
import org.alfresco.service.namespace.QNamePattern;
public class NodeSvcBean extends EcmEngineWrapperBean implements EcmEngineConstants {
private static final long serialVersionUID = 2664522005131086983L;
/* TODO: servizi non ancora esportati e che RICHIEDONO la gestione della AccessDeniedException
*
* org.alfresco.service.cmr.repository.NodeService.getStores=AFTER_ACL_NODE.sys:base.ReadProperties
* org.alfresco.service.cmr.repository.NodeService.createStore=ACL_METHOD.ROLE_ADMINISTRATOR
* org.alfresco.service.cmr.repository.NodeService.getNodeStatus=ACL_NODE.0.sys:base.ReadProperties
* org.alfresco.service.cmr.repository.NodeService.getRootNode=ACL_NODE.0.sys:base.ReadProperties
* org.alfresco.service.cmr.repository.NodeService.setChildAssociationIndex=ACL_PARENT.0.sys:base.WriteProperties
* org.alfresco.service.cmr.repository.NodeService.setType=ACL_NODE.0.sys:base.WriteProperties
* org.alfresco.service.cmr.repository.NodeService.deleteNode=ACL_NODE.0.sys:base.DeleteNode
* org.alfresco.service.cmr.repository.NodeService.setProperty=ACL_NODE.0.sys:base.WriteProperties
* org.alfresco.service.cmr.repository.NodeService.removeProperty=ACL_NODE.0.sys:base.WriteProperties
* org.alfresco.service.cmr.repository.NodeService.getChildByName=ACL_NODE.0.sys:base.ReadChildren,AFTER_ACL_NODE.sys:base.ReadProperties
* org.alfresco.service.cmr.repository.NodeService.getStoreArchiveNode=ACL_NODE.0.sys:base.Read
* org.alfresco.service.cmr.repository.NodeService.restoreNode=ACL_NODE.0.sys:base.DeleteNode,ACL_NODE.1.sys:base.CreateChildren
*/
public ChildAssociationRef createNode(NodeRef nodeRef, QName assocTypeQName,
QName assocQName, QName typeQName, Map<QName, Serializable> props)
throws NodeRuntimeException {
ChildAssociationRef assocRef = null;
logger.debug("[NodeSvcBean::createNode] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::createNode] Creating new node with parent: " + nodeRef.getId());
}
assocRef = serviceRegistry.getNodeService().createNode(nodeRef, assocTypeQName, assocQName, typeQName, props);
} catch (Exception e) {
handleNodeServiceException("createNode", e);
} finally {
logger.debug("[NodeSvcBean::createNode] END");
}
return assocRef;
}
public void deleteNode(NodeRef nodeRef) throws NodeRuntimeException {
logger.debug("[NodeSvcBean::deleteNode] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::deleteNode] Deleting node with uid: " + nodeRef.getId());
}
serviceRegistry.getNodeService().deleteNode(nodeRef);
} catch (Exception e) {
handleNodeServiceException("deleteNode", e);
} finally {
logger.debug("[NodeSvcBean::deleteNode] END");
}
}
public void addAspect(NodeRef nodeRef, QName aspectTypeQName, Map<QName, Serializable> props)
throws NodeRuntimeException {
logger.debug("[NodeSvcBean::addAspect] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::addAspect] Adding aspect \"" + aspectTypeQName + "\" to node: " + nodeRef);
}
serviceRegistry.getNodeService().addAspect(nodeRef, aspectTypeQName, props);
} catch (Exception e) {
handleNodeServiceException("addAspect", e);
} finally {
logger.debug("[NodeSvcBean::addAspect] END");
}
}
public Set<QName> getAspects(NodeRef nodeRef) throws NodeRuntimeException {
Set<QName> aspects = null;
logger.debug("[NodeSvcBean::getAspects] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::getAspects] Retrieving aspects for node: " + nodeRef.getId());
}
aspects = serviceRegistry.getNodeService().getAspects(nodeRef);
} catch (Exception e) {
handleNodeServiceException("getAspects", e);
} finally {
logger.debug("[NodeSvcBean::getAspects] END");
}
return aspects;
}
public boolean hasAspect(NodeRef nodeRef, QName aspectRef) throws NodeRuntimeException {
boolean result = false;
logger.debug("[NodeSvcBean::hasAspect] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::hasAspect] Checking if aspect \"" + aspectRef +
"\" is set on node: " + nodeRef.getId());
}
result = serviceRegistry.getNodeService().hasAspect(nodeRef, aspectRef);
} catch (Exception e) {
handleNodeServiceException("hasAspect", e);
} finally {
logger.debug("[NodeSvcBean::hasAspect] END");
}
return result;
}
public void removeAspect(NodeRef nodeRef, QName aspectTypeQName)
throws NodeRuntimeException {
logger.debug("[NodeSvcBean::removeAspect] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::removeAspect] Removing aspect \"" + aspectTypeQName +
"\" from node: " + nodeRef.getId());
}
serviceRegistry.getNodeService().removeAspect(nodeRef, aspectTypeQName);
} catch (Exception e) {
handleNodeServiceException("removeAspect", e);
} finally {
logger.debug("[NodeSvcBean::removeAspect] END");
}
}
public Map<QName, Serializable> getProperties(NodeRef nodeRef) throws NodeRuntimeException {
Map<QName,Serializable> props = null;
logger.debug("[NodeSvcBean::getProperties] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::getProperties] Retrieving properties for node: " + nodeRef.getId());
}
props = serviceRegistry.getNodeService().getProperties(nodeRef);
} catch (Exception e) {
handleNodeServiceException("getProperties", e);
} finally {
logger.debug("[NodeSvcBean::getProperties] END");
}
return (props != null) ? props : Collections.<QName, Serializable>emptyMap();
}
public void setProperties(NodeRef nodeRef, Map<QName, Serializable> properties) throws NodeRuntimeException {
logger.debug("[NodeSvcBean::setProperties] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::setProperties] Updating properties for node: " + nodeRef.getId());
}
serviceRegistry.getNodeService().setProperties(nodeRef, properties);
} catch (Exception e) {
handleNodeServiceException("setProperties", e);
} finally {
logger.debug("[NodeSvcBean::setProperties] END");
}
}
public ChildAssociationRef moveNode(NodeRef nodeToMoveRef, NodeRef newParentRef, QName assocTypeQName, QName assocQName)
throws NodeRuntimeException {
ChildAssociationRef assocRef = null;
logger.debug("[NodeSvcBean::moveNode] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::moveNode] Moving node \"" + nodeToMoveRef.getId() +
"\" to new parent: " + newParentRef.getId());
}
assocRef = serviceRegistry.getNodeService().moveNode(nodeToMoveRef, newParentRef, assocTypeQName, assocQName);
} catch (Exception e) {
handleNodeServiceException("moveNode", e);
} finally {
logger.debug("[NodeSvcBean::moveNode] END");
}
return assocRef;
}
public ChildAssociationRef addChild(NodeRef parentRef, NodeRef childRef, QName assocTypeQName, QName assocQName)
throws NodeRuntimeException {
ChildAssociationRef assocRef = null;
logger.debug("[NodeSvcBean::addChild] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::addChild] Adding child \"" + childRef.getId() +
"\" to parent: " + parentRef.getId());
}
assocRef = serviceRegistry.getNodeService().addChild(parentRef, childRef, assocTypeQName, assocQName);
} catch (Exception e) {
handleNodeServiceException("addChild", e);
} finally {
logger.debug("[NodeSvcBean::addChild] END");
}
return assocRef;
}
public AssociationRef createAssociation(NodeRef sourceRef, NodeRef targetRef, QName assocTypeQName)
throws NodeRuntimeException {
AssociationRef assocRef = null;
logger.debug("[NodeSvcBean::createAssociation] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::createAssociation] Create association between source \"" + sourceRef.getId() +
"\" and target: " + targetRef.getId());
}
assocRef = serviceRegistry.getNodeService().createAssociation(sourceRef, targetRef, assocTypeQName);
} catch (Exception e) {
handleNodeServiceException("createAssociation", e);
} finally {
logger.debug("[NodeSvcBean::createAssociation] END");
}
return assocRef;
}
public ChildAssociationRef getPrimaryParent(NodeRef nodeRef) throws NodeRuntimeException {
ChildAssociationRef assocRef = null;
logger.debug("[NodeSvcBean::getPrimaryParent] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::getPrimaryParent] " +
"Retrieving primary parent for node: " + nodeRef.getId());
}
assocRef = serviceRegistry.getNodeService().getPrimaryParent(nodeRef);
} catch (Exception e) {
handleNodeServiceException("getPrimaryParent", e);
} finally {
logger.debug("[NodeSvcBean::getPrimaryParent] END");
}
return assocRef;
}
public boolean removeChildAssociation(ChildAssociationRef childAssocRef)
throws NodeRuntimeException {
logger.debug("[NodeSvcBean::removeChildAssociation] BEGIN");
boolean assocExist=false;
try {
assocExist=serviceRegistry.getNodeService().removeChildAssociation(childAssocRef);
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::removeChildAssociation] " + "Removing child association \""
+ childAssocRef.getQName()+"\"");
}
} catch (Exception e) {
handleNodeServiceException("removeChildAssociation", e);
} finally {
logger.debug("[NodeSvcBean::removeChildAssociation] END");
}
return assocExist;
}
public boolean removeSecondaryChildAssociation(ChildAssociationRef childAssocRef)
throws NodeRuntimeException {
logger.debug("[NodeSvcBean::removeSecondaryChildAssociation] BEGIN");
boolean assocExist=false;
try {
assocExist=serviceRegistry.getNodeService().removeSeconaryChildAssociation(childAssocRef);
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::removeSecondaryChildAssociation] Removing secondary child association \""
+ childAssocRef.getQName() + "\"");
}
} catch (Exception e) {
handleNodeServiceException("removeSecondaryChildAssociation", e);
} finally {
logger.debug("[NodeSvcBean::removeSecondaryChildAssociation] END");
}
return assocExist;
}
public void removeChild(NodeRef parentRef, NodeRef childRef) throws NodeRuntimeException {
logger.debug("[NodeSvcBean::removeChild] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::removeChild] Removing child \"" + childRef.getId() + "\" from parent: " + parentRef.getId());
}
serviceRegistry.getNodeService().removeChild(parentRef, childRef);
} catch (Exception e) {
handleNodeServiceException("removeChild", e);
} finally {
logger.debug("[NodeSvcBean::removeChild] END");
}
}
public void removeAssociation(NodeRef sourceRef, NodeRef targetRef, QName assocTypeQName)
throws NodeRuntimeException {
logger.debug("[NodeSvcBean::removeAssociation] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::removeAssociation] Removing association between source \"" + sourceRef.getId() +
"\" and target: " + targetRef.getId());
}
serviceRegistry.getNodeService().removeAssociation(sourceRef, targetRef, assocTypeQName);
} catch (Exception e) {
handleNodeServiceException("removeAssociation", e);
} finally {
logger.debug("[NodeSvcBean::removeAssociation] END");
}
}
public QName getType(NodeRef nodeRef) throws NodeRuntimeException {
logger.debug("[NodeSvcBean::getType] BEGIN");
QName type = null;
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::getType] Retrieving type for node: " + nodeRef.getId());
}
type = serviceRegistry.getNodeService().getType(nodeRef);
} catch (Exception e) {
handleNodeServiceException("getType", e);
} finally {
logger.debug("[NodeSvcBean::getType] END");
}
return type;
}
public List<ChildAssociationRef> getChildAssocs(NodeRef nodeRef)
throws NodeRuntimeException {
logger.debug("[NodeSvcBean::getChildAssocs] BEGIN");
List<ChildAssociationRef> childAssociations = null;
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::getChildAssocs] Retrieving child assocs for node: " + nodeRef.getId());
}
childAssociations = serviceRegistry.getNodeService().getChildAssocs(nodeRef);
} catch (Exception e) {
handleNodeServiceException("getChildAssocs", e);
} finally {
logger.debug("[NodeSvcBean::getChildAssocs] END");
}
return childAssociations;
}
public List<ChildAssociationRef> getParentAssocs(NodeRef nodeRef)
throws NodeRuntimeException {
logger.debug("[NodeSvcBean::getParentAssocs] BEGIN");
List<ChildAssociationRef> parentAssociations = null;
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::getParentAssocs] Retrieving parent assocs for node: " + nodeRef.getId());
}
parentAssociations = serviceRegistry.getNodeService().getParentAssocs(nodeRef);
} catch (Exception e) {
handleNodeServiceException("getParentAssocs", e);
} finally {
logger.debug("[NodeSvcBean::getParentAssocs] END");
}
return parentAssociations;
}
public List<AssociationRef> getTargetAssocs(NodeRef sourceRef, QNamePattern qnamePattern)
throws NodeRuntimeException {
logger.debug("[NodeSvcBean::getTargetAssocs] BEGIN");
List<AssociationRef> assocs = null;
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::getTargetAssocs] Retrieving target assocs for node: " +
sourceRef.getId() + " [Pattern: " + qnamePattern + "]");
}
assocs = serviceRegistry.getNodeService().getTargetAssocs(sourceRef, qnamePattern);
} catch (Exception e) {
handleNodeServiceException("getTargetAssocs", e);
} finally {
logger.debug("[NodeSvcBean::getTargetAssocs] END");
}
return assocs;
}
public List<AssociationRef> getSourceAssocs(NodeRef targetRef, QNamePattern qnamePattern)
throws NodeRuntimeException {
logger.debug("[NodeSvcBean::getSourceAssocs] BEGIN");
List<AssociationRef> assocs = null;
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::getSourceAssocs] Retrieving source assocs for node: " +
targetRef.getId() + " [Pattern: " + qnamePattern + "]");
}
assocs = serviceRegistry.getNodeService().getSourceAssocs(targetRef, qnamePattern);
} catch (Exception e) {
handleNodeServiceException("getSourceAssocs", e);
} finally {
logger.debug("[NodeSvcBean::getSourceAssocs] END");
}
return assocs;
}
public boolean exists(NodeRef nodeRef) throws NodeRuntimeException {
logger.debug("[NodeSvcBean::exists] BEGIN");
boolean exists = false;
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::exists] Exists the node: " + nodeRef.getId());
}
exists = serviceRegistry.getNodeService().exists(nodeRef);
} catch (Exception e) {
handleNodeServiceException("exists", e);
} finally {
logger.debug("[NodeSvcBean::exists] END");
}
return exists;
}
public boolean exists(StoreRef storeRef) throws NodeRuntimeException {
logger.debug("[NodeSvcBean::exists] BEGIN");
boolean exists = false;
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::exists] Store: " + storeRef.getIdentifier());
}
exists = serviceRegistry.getNodeService().exists(storeRef);
} catch (Exception e) {
handleNodeServiceException("exists", e);
} finally {
logger.debug("[NodeSvcBean::exists] END");
}
return exists;
}
public Serializable getProperty(NodeRef nodeRef, QName propertyQName) throws NodeRuntimeException {
Serializable value = null;
logger.debug("[NodeSvcBean::getProperty] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::getProperty] Retrieving property '" + propertyQName + "' for node: " + nodeRef.getId());
}
value = serviceRegistry.getNodeService().getProperty(nodeRef, propertyQName);
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::getProperty] Value: " + value);
}
} catch (Exception e) {
handleNodeServiceException("getProperty", e);
} finally {
logger.debug("[NodeSvcBean::getProperty] END");
}
return value;
}
public void setProperty(NodeRef nodeRef, QName propertyQName, Serializable value) throws NodeRuntimeException {
logger.debug("[NodeSvcBean::setProperty] BEGIN");
try {
if (logger.isDebugEnabled()) {
logger.debug("[NodeSvcBean::setProperty] Retrieving property '" + propertyQName + "' for node: " + nodeRef.getId());
}
serviceRegistry.getNodeService().setProperty(nodeRef, propertyQName, value);
logger.debug("[NodeSvcBean::setProperty] Value: " + value);
} catch (Exception e) {
handleNodeServiceException("setProperty", e);
} finally {
logger.debug("[NodeSvcBean::setProperty] END");
}
}
public Path getPath(NodeRef nodeRef) throws NodeRuntimeException {
logger.debug("[NodeSvcBean::getPath] BEGIN");
Path result = null;
try {
result = serviceRegistry.getNodeService().getPath(nodeRef);
} catch (Exception e) {
handleNodeServiceException("getPath", e);
} finally {
logger.debug("[NodeSvcBean::getPath] END");
}
return result;
}
public List<Path> getPaths(NodeRef nodeRef, boolean primaryOnly) throws NodeRuntimeException {
logger.debug("[NodeSvcBean::getPaths] BEGIN");
List<Path> results = null;
try {
results = serviceRegistry.getNodeService().getPaths(nodeRef, primaryOnly);
} catch (Exception e) {
handleNodeServiceException("getPaths", e);
} finally {
logger.debug("[NodeSvcBean::getPaths] END");
}
return results;
}
private void handleNodeServiceException(String methodName, Throwable e) throws NodeRuntimeException {
logger.warn("[NodeSvcBean::handleNodeServiceException] Exception in method '" + methodName + "': " + e.getMessage(), e);
if (e instanceof org.alfresco.repo.security.permissions.AccessDeniedException) {
throw new NodeRuntimeException(FoundationErrorCodes.ACCESS_DENIED_ERROR);
} else if (e instanceof NodeLockedException) {
throw new NodeRuntimeException(FoundationErrorCodes.NODE_LOCKED_ERROR);
} else if (e instanceof InvalidNodeRefException) {
throw new NodeRuntimeException(FoundationErrorCodes.INVALID_NODE_REF_ERROR);
} else if (e instanceof InvalidTypeException) {
throw new NodeRuntimeException(FoundationErrorCodes.INVALID_TYPE_ERROR);
} else if (e instanceof InvalidAspectException) {
throw new NodeRuntimeException(FoundationErrorCodes.INVALID_ASPECT_ERROR);
} else if (e instanceof DuplicateChildNodeNameException) {
throw new NodeRuntimeException(FoundationErrorCodes.DUPLICATE_CHILD_ERROR);
} else {
throw new NodeRuntimeException(FoundationErrorCodes.GENERIC_NODE_SERVICE_ERROR);
}
}
}