Merged HEAD (5.1) to 5.1.N (5.1.1)

118887 jvonka: ACE-198 / ACE-202 / ACE-4734: Perf improvements for CMIS (getChildren et al)\n Merge BRANCHES/DEV/HEAD_ACE198_2


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/DEV/5.1.N/root@119389 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Ancuta Morarasu
2015-12-02 10:14:31 +00:00
parent be48287050
commit 60408a953b
8 changed files with 162 additions and 142 deletions

View File

@@ -140,6 +140,8 @@ import org.apache.commons.logging.LogFactory;
* *
* @author florian.mueller * @author florian.mueller
* @author Derek Hulley * @author Derek Hulley
* @author janv
*
* @since 4.0 * @since 4.0
*/ */
public class AlfrescoCmisServiceImpl extends AbstractCmisService implements AlfrescoCmisService public class AlfrescoCmisServiceImpl extends AbstractCmisService implements AlfrescoCmisService
@@ -159,8 +161,8 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
public AlfrescoCmisServiceImpl(CMISConnector connector) public AlfrescoCmisServiceImpl(CMISConnector connector)
{ {
this.connector = connector; this.connector = connector;
nodeInfoMap = new HashMap<String, CMISNodeInfo>(); nodeInfoMap = new HashMap<>();
objectInfoMap = new HashMap<String, ObjectInfo>(); objectInfoMap = new HashMap<>();
} }
@Override @Override
@@ -187,12 +189,17 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
protected CMISNodeInfoImpl createNodeInfo(NodeRef nodeRef) protected CMISNodeInfoImpl createNodeInfo(NodeRef nodeRef)
{ {
return createNodeInfo(nodeRef, null); return createNodeInfo(nodeRef, null, true);
} }
protected CMISNodeInfoImpl createNodeInfo(NodeRef nodeRef, VersionHistory versionHistory) protected CMISNodeInfoImpl createNodeInfo(NodeRef nodeRef, VersionHistory versionHistory, boolean checkExists)
{ {
CMISNodeInfoImpl result = connector.createNodeInfo(nodeRef, versionHistory); return createNodeInfo(nodeRef, null, null, versionHistory, checkExists);
}
protected CMISNodeInfoImpl createNodeInfo(NodeRef nodeRef, QName nodeType, Map<QName,Serializable> nodeProps, VersionHistory versionHistory, boolean checkExists)
{
CMISNodeInfoImpl result = connector.createNodeInfo(nodeRef, nodeType, nodeProps, versionHistory, checkExists);
nodeInfoMap.put(result.getObjectId(), result); nodeInfoMap.put(result.getObjectId(), result);
return result; return result;
@@ -494,20 +501,19 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
} }
// create a child CMIS object // create a child CMIS object
CMISNodeInfo ni = createNodeInfo(child.getNodeRef()); CMISNodeInfo ni = createNodeInfo(child.getNodeRef(), child.getType(), child.getProperties(), null, false); // note: checkExists=false (don't need to check again)
if (getObjectInfo(repositoryId, ni.getObjectId(), includeRelationships)==null)
{
// ignore invalid children // ignore invalid children
// Skip non-cmis objects
if (ni.getObjectVariant() == CMISObjectVariant.INVALID_ID
|| ni.getObjectVariant() == CMISObjectVariant.NOT_EXISTING
|| ni.getObjectVariant() == CMISObjectVariant.NOT_A_CMIS_OBJECT
|| ni.getObjectVariant() == CMISObjectVariant.PERMISSION_DENIED)
{
continue; continue;
} }
if (CMISObjectVariant.NOT_A_CMIS_OBJECT.equals(ni.getObjectVariant())) ObjectData object = connector.createCMISObject(ni, filter, includeAllowableActions,
{
continue; //Skip non-cmis objects
}
ObjectData object = connector.createCMISObject(ni, child, filter, includeAllowableActions,
includeRelationships, renditionFilter, false, false/*, getContext().getCmisVersion()*/); includeRelationships, renditionFilter, false, false/*, getContext().getCmisVersion()*/);
boolean isObjectInfoRequired = getContext().isObjectInfoRequired(); boolean isObjectInfoRequired = getContext().isObjectInfoRequired();
@@ -731,7 +737,7 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
// create a child CMIS object // create a child CMIS object
ObjectInFolderDataImpl object = new ObjectInFolderDataImpl(); ObjectInFolderDataImpl object = new ObjectInFolderDataImpl();
CMISNodeInfo ni = createNodeInfo(child.getChildRef()); CMISNodeInfo ni = createNodeInfo(child.getChildRef(), null, false); // note: checkExists=false (don't need to check again)
object.setObject(connector.createCMISObject( object.setObject(connector.createCMISObject(
ni, filter, includeAllowableActions, includeRelationships, ni, filter, includeAllowableActions, includeRelationships,
renditionFilter, false, false)); renditionFilter, false, false));
@@ -2050,10 +2056,9 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
throw new CmisObjectNotFoundException("Object not found: " + path); throw new CmisObjectNotFoundException("Object not found: " + path);
} }
CMISNodeInfo info = createNodeInfo(fileInfo.getNodeRef()); CMISNodeInfo info = createNodeInfo(fileInfo.getNodeRef(), fileInfo.getType(), fileInfo.getProperties(), null, false);
object = connector.createCMISObject( object = connector.createCMISObject(info, filter, includeAllowableActions,
info, fileInfo, filter, includeAllowableActions,
includeRelationships, renditionFilter, includePolicyIds, includeAcl); includeRelationships, renditionFilter, includePolicyIds, includeAcl);
isObjectInfoRequired = getContext().isObjectInfoRequired(); isObjectInfoRequired = getContext().isObjectInfoRequired();
@@ -2357,7 +2362,7 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
// convert the version history // convert the version history
for (Version version : versionHistory.getAllVersions()) for (Version version : versionHistory.getAllVersions())
{ {
CMISNodeInfo versionInfo = createNodeInfo(version.getFrozenStateNodeRef(), versionHistory); CMISNodeInfo versionInfo = createNodeInfo(version.getFrozenStateNodeRef(), versionHistory, true); // TODO do we need to check existence ?
// MNT-9557 fix. Replace head version with current node info // MNT-9557 fix. Replace head version with current node info
if (versionHistory.getHeadVersion().equals(version)) if (versionHistory.getHeadVersion().equals(version))
{ {

View File

@@ -65,7 +65,6 @@ import org.alfresco.opencmis.dictionary.FolderTypeDefintionWrapper;
import org.alfresco.opencmis.dictionary.ItemTypeDefinitionWrapper; import org.alfresco.opencmis.dictionary.ItemTypeDefinitionWrapper;
import org.alfresco.opencmis.dictionary.PropertyDefinitionWrapper; import org.alfresco.opencmis.dictionary.PropertyDefinitionWrapper;
import org.alfresco.opencmis.dictionary.TypeDefinitionWrapper; import org.alfresco.opencmis.dictionary.TypeDefinitionWrapper;
import org.alfresco.opencmis.mapping.DirectProperty;
import org.alfresco.opencmis.search.CMISQueryOptions; import org.alfresco.opencmis.search.CMISQueryOptions;
import org.alfresco.opencmis.search.CMISQueryOptions.CMISQueryMode; import org.alfresco.opencmis.search.CMISQueryOptions.CMISQueryMode;
import org.alfresco.opencmis.search.CMISQueryService; import org.alfresco.opencmis.search.CMISQueryService;
@@ -1188,15 +1187,15 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
*/ */
public CMISNodeInfoImpl createNodeInfo(NodeRef nodeRef) public CMISNodeInfoImpl createNodeInfo(NodeRef nodeRef)
{ {
return createNodeInfo(nodeRef, null); return createNodeInfo(nodeRef, null, null, null, true);
} }
/** /**
* Creates an object info object. * Creates an object info object.
*/ */
public CMISNodeInfoImpl createNodeInfo(NodeRef nodeRef, VersionHistory versionHistory) public CMISNodeInfoImpl createNodeInfo(NodeRef nodeRef, QName nodeType, Map<QName,Serializable> nodeProps, VersionHistory versionHistory, boolean checkExists)
{ {
return new CMISNodeInfoImpl(this, nodeRef, versionHistory); return new CMISNodeInfoImpl(this, nodeRef, nodeType, nodeProps, versionHistory, checkExists);
} }
/** /**
@@ -1395,7 +1394,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
try try
{ {
QName typeQName = nodeService.getType(nodeRef); QName typeQName = nodeService.getType(nodeRef);
return getType(typeQName); return getOpenCMISDictionaryService().findNodeType(typeQName);
} }
catch(InvalidNodeRefException inre) catch(InvalidNodeRefException inre)
{ {
@@ -1403,11 +1402,6 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
} }
} }
private TypeDefinitionWrapper getType(QName typeQName)
{
return getOpenCMISDictionaryService().findNodeType(typeQName);
}
/** /**
* Returns the type definition of an association or <code>null</code> if no * Returns the type definition of an association or <code>null</code> if no
* type definition could be found. * type definition could be found.
@@ -1520,21 +1514,6 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
/** /**
* Creates the CMIS object for a node. * Creates the CMIS object for a node.
*/ */
public ObjectData createCMISObject(CMISNodeInfo info, FileInfo node, String filter,
boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter,
boolean includePolicyIds, boolean includeAcl)
{
if (info.getType() == null)
{
throw new CmisObjectNotFoundException("No corresponding type found! Not a CMIS object?");
}
Properties nodeProps = getNodeProperties(info, node, filter, info.getType());
return createCMISObjectImpl(info, nodeProps, filter, includeAllowableActions, includeRelationships,
renditionFilter, includePolicyIds, includeAcl);
}
public ObjectData createCMISObject(CMISNodeInfo info, String filter, boolean includeAllowableActions, public ObjectData createCMISObject(CMISNodeInfo info, String filter, boolean includeAllowableActions,
IncludeRelationships includeRelationships, String renditionFilter, boolean includePolicyIds, IncludeRelationships includeRelationships, String renditionFilter, boolean includePolicyIds,
boolean includeAcl) boolean includeAcl)
@@ -1544,8 +1523,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
throw new CmisObjectNotFoundException("No corresponding type found! Not a CMIS object?"); throw new CmisObjectNotFoundException("No corresponding type found! Not a CMIS object?");
} }
Properties nodeProps = (info.isRelationship() ? getAssocProperties(info, filter) : getNodeProperties(info, Properties nodeProps = (info.isRelationship() ? getAssocProperties(info, filter) : getNodeProperties(info, filter));
filter));
return createCMISObjectImpl(info, nodeProps, filter, includeAllowableActions, includeRelationships, return createCMISObjectImpl(info, nodeProps, filter, includeAllowableActions, includeRelationships,
renditionFilter, includePolicyIds, includeAcl); renditionFilter, includePolicyIds, includeAcl);
@@ -1630,6 +1608,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
// add aspects // add aspects
List<CmisExtensionElement> extensions = getAspectExtensions(info, filter, result.getProperties() List<CmisExtensionElement> extensions = getAspectExtensions(info, filter, result.getProperties()
.getProperties().keySet()); .getProperties().keySet());
if (!extensions.isEmpty()) if (!extensions.isEmpty())
{ {
result.getProperties().setExtensions( result.getProperties().setExtensions(
@@ -1891,10 +1870,10 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
{ {
if (getRequestCmisVersion().equals(CmisVersion.CMIS_1_1)) if (getRequestCmisVersion().equals(CmisVersion.CMIS_1_1))
{ {
Set<String> propertyIds = new HashSet<String>(); Set<String> propertyIds = new HashSet<>();
Set<String> filterSet = splitFilter(filter); Set<String> filterSet = splitFilter(filter);
Set<QName> aspects = nodeService.getAspects(info.getNodeRef()); Set<QName> aspects = info.getNodeAspects();
for (QName aspect : aspects) for (QName aspect : aspects)
{ {
TypeDefinitionWrapper aspectType = getOpenCMISDictionaryService().findNodeType(aspect); TypeDefinitionWrapper aspectType = getOpenCMISDictionaryService().findNodeType(aspect);
@@ -1954,46 +1933,6 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
return result; return result;
} }
public Properties getNodeProperties(CMISNodeInfo info, FileInfo node, String filter, TypeDefinitionWrapper type)
{
PropertiesImpl result = new PropertiesImpl();
Set<String> filterSet = splitFilter(filter);
Map<QName, Serializable> nodeProps = node.getProperties();
for (PropertyDefinitionWrapper propDef : type.getProperties())
{
if (!propDef.getPropertyId().equals(PropertyIds.OBJECT_ID))
{
// don't filter the object id
if ((filterSet != null) && (!filterSet.contains(propDef.getPropertyDefinition().getQueryName())))
{
// skip properties that are not in the filter
continue;
}
}
Serializable value = null;
CMISPropertyAccessor accessor = propDef.getPropertyAccessor();
if (accessor instanceof DirectProperty)
{
value = nodeProps.get(accessor.getMappedProperty());
}
else
{
value = propDef.getPropertyAccessor().getValue(info);
}
result.addProperty(getProperty(propDef.getPropertyDefinition().getPropertyType(), propDef, value));
}
addAspectProperties(info, filter, result);
return result;
}
public Properties getAssocProperties(CMISNodeInfo info, String filter) public Properties getAssocProperties(CMISNodeInfo info, String filter)
{ {
PropertiesImpl result = new PropertiesImpl(); PropertiesImpl result = new PropertiesImpl();
@@ -2022,15 +1961,14 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
/** /**
* Builds aspect extension. * Builds aspect extension.
*/ */
public List<CmisExtensionElement> getAspectExtensions(CMISNodeInfo info, String filter, public List<CmisExtensionElement> getAspectExtensions(CMISNodeInfo info, String filter, Set<String> alreadySetProperties)
Set<String> alreadySetProperties)
{ {
List<CmisExtensionElement> extensions = new ArrayList<CmisExtensionElement>(); List<CmisExtensionElement> extensions = new ArrayList<CmisExtensionElement>();
Set<String> propertyIds = new HashSet<String>(alreadySetProperties); Set<String> propertyIds = new HashSet<String>(alreadySetProperties);
List<CmisExtensionElement> propertyExtensionList = new ArrayList<CmisExtensionElement>(); List<CmisExtensionElement> propertyExtensionList = new ArrayList<CmisExtensionElement>();
Set<String> filterSet = splitFilter(filter); Set<String> filterSet = splitFilter(filter);
Set<QName> aspects = nodeService.getAspects(info.getNodeRef()); Set<QName> aspects = info.getNodeAspects();
for (QName aspect : aspects) for (QName aspect : aspects)
{ {
TypeDefinitionWrapper aspectType = getOpenCMISDictionaryService().findNodeType(aspect); TypeDefinitionWrapper aspectType = getOpenCMISDictionaryService().findNodeType(aspect);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2013 Alfresco Software Limited. * Copyright (C) 2005-2015 Alfresco Software Limited.
* *
* This file is part of Alfresco * This file is part of Alfresco
* *
@@ -25,6 +25,7 @@ import java.util.GregorianCalendar;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.opencmis.dictionary.CMISNodeInfo; import org.alfresco.opencmis.dictionary.CMISNodeInfo;
@@ -36,7 +37,9 @@ import org.alfresco.opencmis.dictionary.RelationshipTypeDefintionWrapper;
import org.alfresco.opencmis.dictionary.TypeDefinitionWrapper; import org.alfresco.opencmis.dictionary.TypeDefinitionWrapper;
import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.version.Version2Model; import org.alfresco.repo.version.Version2Model;
import org.alfresco.repo.version.VersionBaseModel;
import org.alfresco.repo.version.VersionModel; import org.alfresco.repo.version.VersionModel;
import org.alfresco.repo.version.common.VersionUtil;
import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
@@ -82,6 +85,9 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
private Map<String, Serializable> properties; private Map<String, Serializable> properties;
private List<CMISNodeInfo> parents; private List<CMISNodeInfo> parents;
private Map<QName,Serializable> nodeProps; // for nodeRef
private Set<QName> nodeAspects; // for nodeRef
public CMISNodeInfoImpl() public CMISNodeInfoImpl()
{ {
} }
@@ -94,13 +100,20 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
analyseObjectId(); analyseObjectId();
} }
public CMISNodeInfoImpl(CMISConnector connector, NodeRef nodeRef, VersionHistory versionHistory) public CMISNodeInfoImpl(CMISConnector connector, NodeRef nodeRef, QName nodeType, Map<QName,Serializable> nodeProps, VersionHistory versionHistory, boolean checkExists)
{ {
this.connector = connector; this.connector = connector;
this.nodeRef = nodeRef; this.nodeRef = nodeRef;
this.versionHistory = versionHistory; this.versionHistory = versionHistory;
analyseNodeRef(); if (nodeType != null)
{
determineType(nodeType);
}
this.nodeProps = nodeProps;
analyseNodeRef(checkExists);
} }
public CMISNodeInfoImpl(CMISConnector connector, NodeRef nodeRef) public CMISNodeInfoImpl(CMISConnector connector, NodeRef nodeRef)
@@ -108,7 +121,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
this.connector = connector; this.connector = connector;
this.nodeRef = nodeRef; this.nodeRef = nodeRef;
analyseNodeRef(); analyseNodeRef(true);
} }
public CMISNodeInfoImpl(CMISConnector connector, AssociationRef associationRef) public CMISNodeInfoImpl(CMISConnector connector, AssociationRef associationRef)
@@ -134,13 +147,14 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
objectId = connector.constructObjectId(nodeRef, CMISConnector.UNVERSIONED_VERSION_LABEL); objectId = connector.constructObjectId(nodeRef, CMISConnector.UNVERSIONED_VERSION_LABEL);
versionLabel = CMISConnector.UNVERSIONED_VERSION_LABEL; versionLabel = CMISConnector.UNVERSIONED_VERSION_LABEL;
currentObjectId = objectId; currentObjectId = objectId;
hasPWC = connector.getCheckOutCheckInService().isCheckedOut(nodeRef); hasPWC = isNodeCheckedOut();
} }
else else
{ {
versionLabel = (String)getNodeProps().get(ContentModel.PROP_VERSION_LABEL);
Version headVersion = versionHistory.getHeadVersion(); Version headVersion = versionHistory.getHeadVersion();
versionLabel = (String) connector.getNodeService().getProperty(nodeRef, ContentModel.PROP_VERSION_LABEL);
objectId = connector.constructObjectId(headVersion.getVersionedNodeRef(), versionLabel); objectId = connector.constructObjectId(headVersion.getVersionedNodeRef(), versionLabel);
currentObjectId = connector.constructObjectId(headVersion.getVersionedNodeRef(), headVersion.getVersionLabel()); currentObjectId = connector.constructObjectId(headVersion.getVersionedNodeRef(), headVersion.getVersionLabel());
currentNodeId = headVersion.getVersionedNodeRef().toString(); currentNodeId = headVersion.getVersionedNodeRef().toString();
@@ -151,9 +165,9 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
} }
} }
protected void analyseCurrentVersion(NodeRef nodeRef) protected void analyseCurrentVersion()
{ {
if(connector.getVersionService().isVersioned(nodeRef)) if (isNodeVersioned(nodeRef))
{ {
versionLabel = (String) connector.getNodeService().getProperty(nodeRef, ContentModel.PROP_VERSION_LABEL); versionLabel = (String) connector.getNodeService().getProperty(nodeRef, ContentModel.PROP_VERSION_LABEL);
if(versionLabel == null) if(versionLabel == null)
@@ -164,21 +178,21 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
currentObjectId = objectId; currentObjectId = objectId;
currentNodeId = nodeRef.toString(); currentNodeId = nodeRef.toString();
objecVariant = CMISObjectVariant.CURRENT_VERSION; objecVariant = CMISObjectVariant.CURRENT_VERSION;
hasPWC = connector.getCheckOutCheckInService().isCheckedOut(nodeRef); hasPWC = isNodeCheckedOut();
} }
else else
{ {
setUnversioned(nodeRef); setUnversioned();
} }
} }
protected void setUnversioned(NodeRef nodeRef) protected void setUnversioned()
{ {
objecVariant = CMISObjectVariant.CURRENT_VERSION; objecVariant = CMISObjectVariant.CURRENT_VERSION;
objectId = connector.constructObjectId(nodeRef, CMISConnector.UNVERSIONED_VERSION_LABEL); objectId = connector.constructObjectId(nodeRef, CMISConnector.UNVERSIONED_VERSION_LABEL);
versionLabel = CMISConnector.UNVERSIONED_VERSION_LABEL; versionLabel = CMISConnector.UNVERSIONED_VERSION_LABEL;
currentObjectId = objectId; currentObjectId = objectId;
hasPWC = connector.getCheckOutCheckInService().isCheckedOut(nodeRef); hasPWC = isNodeCheckedOut();
} }
protected void analyseObjectId() protected void analyseObjectId()
@@ -252,7 +266,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
} }
// check PWC // check PWC
if (connector.getCheckOutCheckInService().isWorkingCopy(nodeRef)) if (isNodeWorkingCopy())
{ {
NodeRef checkedOut = connector.getCheckOutCheckInService().getCheckedOut(nodeRef); NodeRef checkedOut = connector.getCheckOutCheckInService().getCheckedOut(nodeRef);
if(connector.filter(nodeRef)) if(connector.filter(nodeRef))
@@ -318,7 +332,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
objectId = connector.constructObjectId(objectId, versionLabel); objectId = connector.constructObjectId(objectId, versionLabel);
currentObjectId = objectId; currentObjectId = objectId;
hasPWC = connector.getCheckOutCheckInService().isCheckedOut(nodeRef); hasPWC = isNodeCheckedOut();
} }
else else
{ {
@@ -352,7 +366,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
} }
// check version // check version
if(!connector.getVersionService().isVersioned(nodeRef)) if(! isNodeVersioned(nodeRef))
{ {
// the node isn't versioned // the node isn't versioned
if(connector.filter(nodeRef)) if(connector.filter(nodeRef))
@@ -428,7 +442,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
} }
} }
protected void analyseNodeRef() protected void analyseNodeRef(boolean checkExists)
{ {
objectId = null; objectId = null;
currentNodeId = nodeRef.toString(); currentNodeId = nodeRef.toString();
@@ -437,7 +451,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
hasPWC = false; hasPWC = false;
// check for existence // check for existence
if (!connector.getNodeService().exists(nodeRef)) if (checkExists && (!connector.getNodeService().exists(nodeRef)))
{ {
objecVariant = CMISObjectVariant.NOT_EXISTING; objecVariant = CMISObjectVariant.NOT_EXISTING;
return; return;
@@ -470,7 +484,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
} }
// check PWC // check PWC
if (connector.getCheckOutCheckInService().isWorkingCopy(nodeRef)) if (isNodeWorkingCopy())
{ {
NodeRef checkedOut = connector.getCheckOutCheckInService().getCheckedOut(nodeRef); NodeRef checkedOut = connector.getCheckOutCheckInService().getCheckedOut(nodeRef);
if (checkedOut == null) if (checkedOut == null)
@@ -491,15 +505,44 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
} }
// check version // check version
if(connector.getVersionService().isAVersion(nodeRef)) if (isNodeAVersion(nodeRef))
{ {
analyseVersionNode(); analyseVersionNode();
} }
else else
{ {
analyseCurrentVersion(nodeRef); analyseCurrentVersion();
}
} }
private boolean isNodeWorkingCopy()
{
return getNodeAspects().contains(ContentModel.ASPECT_WORKING_COPY);
}
private boolean isNodeCheckedOut()
{
return getNodeAspects().contains(ContentModel.ASPECT_CHECKED_OUT);
}
private boolean isNodeAVersion(NodeRef nodeRef)
{
if(nodeRef.getStoreRef().getProtocol().equals(VersionBaseModel.STORE_PROTOCOL))
{
NodeRef realNodeRef = VersionUtil.convertNodeRef(nodeRef);
return connector.getVersionService().isAVersion(realNodeRef);
}
return getNodeAspects().contains(Version2Model.ASPECT_VERSION);
}
private boolean isNodeVersioned(NodeRef nodeRef)
{
if(nodeRef.getStoreRef().getProtocol().equals(VersionBaseModel.STORE_PROTOCOL))
{
NodeRef realNodeRef = VersionUtil.convertNodeRef(nodeRef);
return connector.getVersionService().isVersioned(realNodeRef);
}
return getNodeAspects().contains(ContentModel.ASPECT_VERSIONABLE);
} }
protected void analyseAssociationRef() protected void analyseAssociationRef()
@@ -520,7 +563,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
objectId = CMISConnector.ASSOC_ID_PREFIX + associationRef.getId(); objectId = CMISConnector.ASSOC_ID_PREFIX + associationRef.getId();
} }
private void determineType() private void determineType(QName nodeType)
{ {
type = null; type = null;
@@ -531,7 +574,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
if (nodeRef != null) if (nodeRef != null)
{ {
QName typeQName = connector.getNodeService().getType(nodeRef); QName typeQName = (nodeType != null ? nodeType : connector.getNodeService().getType(nodeRef));
type = connector.getOpenCMISDictionaryService().findNodeType(typeQName); type = connector.getOpenCMISDictionaryService().findNodeType(typeQName);
} else if (associationRef != null) } else if (associationRef != null)
{ {
@@ -694,7 +737,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
{ {
if (type == null) if (type == null)
{ {
determineType(); determineType(null);
} }
return type; return type;
@@ -744,7 +787,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
name = associationRef.toString(); name = associationRef.toString();
} else } else
{ {
Object nameObj = connector.getNodeService().getProperty(nodeRef, ContentModel.PROP_NAME); Object nameObj = getNodeProps().get(ContentModel.PROP_NAME);
name = (nameObj instanceof String ? (String) nameObj : ""); name = (nameObj instanceof String ? (String) nameObj : "");
} }
} }
@@ -840,7 +883,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
// MNT-12680 we should return always creation date of original node // MNT-12680 we should return always creation date of original node
if (isDocument() || isFolder()) if (isDocument() || isFolder())
{ {
return connector.getNodeService().getProperty(nodeRef, ContentModel.PROP_CREATED); return getNodeProps().get(ContentModel.PROP_CREATED);
} }
else else
{ {
@@ -854,14 +897,14 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
{ {
if (isCurrentVersion() || isPWC()) if (isCurrentVersion() || isPWC())
{ {
return connector.getNodeService().getProperty(nodeRef, ContentModel.PROP_MODIFIED); return getNodeProps().get(ContentModel.PROP_MODIFIED);
} else } else
{ {
return getVersion().getVersionProperty(ContentModel.PROP_MODIFIED.getLocalName()); return getVersion().getVersionProperty(ContentModel.PROP_MODIFIED.getLocalName());
} }
} else if (isFolder() || isItem()) } else if (isFolder() || isItem())
{ {
return connector.getNodeService().getProperty(nodeRef, ContentModel.PROP_MODIFIED); return getNodeProps().get(ContentModel.PROP_MODIFIED);
} else } else
{ {
return DUMMY_DATE; return DUMMY_DATE;
@@ -1061,4 +1104,22 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
return parents; return parents;
} }
public Map<QName, Serializable> getNodeProps()
{
if ((nodeProps == null) && (nodeRef != null))
{
nodeProps = connector.getNodeService().getProperties(nodeRef);
}
return nodeProps;
}
public Set<QName> getNodeAspects()
{
if ((nodeAspects == null) && (nodeRef != null))
{
nodeAspects = connector.getNodeService().getAspects(nodeRef);
}
return nodeAspects;
}
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2010 Alfresco Software Limited. * Copyright (C) 2005-2015 Alfresco Software Limited.
* *
* This file is part of Alfresco * This file is part of Alfresco
* *
@@ -39,7 +39,7 @@ import org.alfresco.service.namespace.QName;
*/ */
public abstract class AbstractProperty implements CMISPropertyAccessor public abstract class AbstractProperty implements CMISPropertyAccessor
{ {
private static final String CONTENT_PROPERTY = "::content"; public static final String CONTENT_PROPERTY = "::content";
private ServiceRegistry serviceRegistry; private ServiceRegistry serviceRegistry;
protected CMISConnector connector; protected CMISConnector connector;
@@ -146,8 +146,8 @@ public abstract class AbstractProperty implements CMISPropertyAccessor
{ {
ContentData contentData = null; ContentData contentData = null;
Serializable value = getServiceRegistry().getNodeService().getProperty(nodeInfo.getNodeRef(), Serializable value = nodeInfo.getNodeProps().get(ContentModel.PROP_CONTENT);
ContentModel.PROP_CONTENT);
if (value != null) if (value != null)
{ {
contentData = DefaultTypeConverter.INSTANCE.convert(ContentData.class, value); contentData = DefaultTypeConverter.INSTANCE.convert(ContentData.class, value);

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2014 Alfresco Software Limited. * Copyright (C) 2005-2015 Alfresco Software Limited.
* *
* This file is part of Alfresco * This file is part of Alfresco
* *
@@ -50,9 +50,7 @@ public class DescriptionProperty extends AbstractProperty
{ {
if (nodeInfo.getNodeRef() != null) if (nodeInfo.getNodeRef() != null)
{ {
return getServiceRegistry().getNodeService().getProperty( return nodeInfo.getNodeProps().get(ContentModel.PROP_DESCRIPTION);
nodeInfo.getNodeRef(),
ContentModel.PROP_DESCRIPTION);
} }
else if (nodeInfo.getAssociationRef() != null) else if (nodeInfo.getAssociationRef() != null)
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2010 Alfresco Software Limited. * Copyright (C) 2005-2015 Alfresco Software Limited.
* *
* This file is part of Alfresco * This file is part of Alfresco
* *
@@ -22,6 +22,7 @@ import java.io.Serializable;
import java.util.List; import java.util.List;
import org.alfresco.opencmis.CMISConnector; import org.alfresco.opencmis.CMISConnector;
import org.alfresco.opencmis.CMISNodeInfoImpl;
import org.alfresco.opencmis.dictionary.CMISNodeInfo; import org.alfresco.opencmis.dictionary.CMISNodeInfo;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
@@ -61,9 +62,9 @@ public class DirectProperty extends AbstractProperty
if (nodeInfo.getNodeRef() != null) if (nodeInfo.getNodeRef() != null)
{ {
/* MNT-10548 fix */ Serializable result = nodeInfo.getNodeProps().get(alfrescoName);
Serializable result = getServiceRegistry().getNodeService().getProperty(nodeInfo.getNodeRef(), alfrescoName);
/* MNT-10548 fix */
if (result instanceof List) if (result instanceof List)
{ {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")

View File

@@ -1,3 +1,21 @@
/*
* Copyright (C) 2005-2015 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco 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.
*
* Alfresco 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
package org.alfresco.opencmis.mapping; package org.alfresco.opencmis.mapping;
import java.io.Serializable; import java.io.Serializable;
@@ -41,7 +59,7 @@ public class SecondaryTypesProperty extends AbstractProperty
return (Serializable) Collections.emptyList(); return (Serializable) Collections.emptyList();
} }
Set<QName> aspects = connector.getNodeService().getAspects(nodeRef); Set<QName> aspects = nodeInfo.getNodeAspects();
ArrayList<String> results = new ArrayList<String>(aspects.size()); ArrayList<String> results = new ArrayList<String>(aspects.size());
for (QName aspect : aspects) for (QName aspect : aspects)
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2005-2010 Alfresco Software Limited. * Copyright (C) 2005-2015 Alfresco Software Limited.
* *
* This file is part of Alfresco * This file is part of Alfresco
* *
@@ -53,8 +53,7 @@ public class VersionSeriesCheckedOutByProperty extends AbstractProperty
if (nodeInfo.isPWC()) if (nodeInfo.isPWC())
{ {
return getServiceRegistry().getNodeService().getProperty(nodeInfo.getNodeRef(), return nodeInfo.getNodeProps().get(ContentModel.PROP_WORKING_COPY_OWNER);
ContentModel.PROP_WORKING_COPY_OWNER);
} else } else
{ {
return getServiceRegistry().getNodeService().getProperty(nodeInfo.getCurrentNodeNodeRef(), return getServiceRegistry().getNodeService().getProperty(nodeInfo.getCurrentNodeNodeRef(),