diff --git a/config/alfresco/subsystems/Search/common-search-context.xml b/config/alfresco/subsystems/Search/common-search-context.xml
index 133ada6091..9da3680d6c 100644
--- a/config/alfresco/subsystems/Search/common-search-context.xml
+++ b/config/alfresco/subsystems/Search/common-search-context.xml
@@ -116,7 +116,8 @@
-
+
+
diff --git a/config/alfresco/subsystems/Search/noindex/noindex-search-context.xml b/config/alfresco/subsystems/Search/noindex/noindex-search-context.xml
index 364abe33a6..8dae849321 100644
--- a/config/alfresco/subsystems/Search/noindex/noindex-search-context.xml
+++ b/config/alfresco/subsystems/Search/noindex/noindex-search-context.xml
@@ -49,6 +49,12 @@
+
+
+
+
+
+
diff --git a/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java b/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java
index 51d5cfca6a..593d48d616 100644
--- a/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java
+++ b/source/java/org/alfresco/opencmis/AlfrescoCmisServiceImpl.java
@@ -144,8 +144,8 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
private static final QName PARAM_PARENT = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "parent");
private static final QName PARAM_USERNAME = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "username");
- private static final String LUCENE_QUERY_CHECKEDOUT = "+@cm\\:workingCopyOwner:${cm:username}";
- private static final String LUCENE_QUERY_CHECKEDOUT_IN_FOLDER = "+@cm\\:workingCopyOwner:${cm:username} +PARENT:\"${cm:parent}\"";
+ private static final String LUCENE_QUERY_CHECKEDOUT = "+=@cm\\:workingCopyOwner:${cm:username}";
+ private static final String LUCENE_QUERY_CHECKEDOUT_IN_FOLDER = "+=@cm\\:workingCopyOwner:${cm:username} +=PARENT:\"${cm:parent}\"";
private static final String MIN_FILTER = "cmis:name,cmis:baseTypeId,cmis:objectTypeId,"
+ "cmis:createdBy,cmis:creationDate,cmis:lastModifiedBy,cmis:lastModificationDate,"
@@ -811,7 +811,7 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
// prepare query
SearchParameters params = new SearchParameters();
- params.setLanguage(SearchService.LANGUAGE_LUCENE);
+ params.setLanguage(SearchService.LANGUAGE_FTS_ALFRESCO);
QueryParameterDefinition usernameDef = new QueryParameterDefImpl(
PARAM_USERNAME,
connector.getDictionaryService().getDataType(DataTypeDefinition.TEXT),
@@ -1121,65 +1121,55 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
throw new CmisConstraintException("This document type is not versionable!");
}
+ FileInfo fileInfo = connector.getFileFolderService().create(
+ parentInfo.getNodeRef(), name, type.getAlfrescoClass());
+ NodeRef nodeRef = fileInfo.getNodeRef();
+ connector.setProperties(nodeRef, type, properties, new String[] { PropertyIds.NAME, PropertyIds.OBJECT_TYPE_ID });
+ connector.applyPolicies(nodeRef, type, policies);
+ connector.applyACL(nodeRef, type, addAces, removeAces);
+
+ // handle content
+ File tempFile = null;
try
{
- // don't want auto-versioning to create a version
- connector.disableBehaviour(ContentModel.ASPECT_VERSIONABLE);
-
- FileInfo fileInfo = connector.getFileFolderService().create(
- parentInfo.getNodeRef(), name, type.getAlfrescoClass());
- NodeRef nodeRef = fileInfo.getNodeRef();
- connector.setProperties(nodeRef, type, properties, new String[] { PropertyIds.NAME, PropertyIds.OBJECT_TYPE_ID });
- connector.applyPolicies(nodeRef, type, policies);
- connector.applyACL(nodeRef, type, addAces, removeAces);
-
- // handle content
- File tempFile = null;
- try
+ if (contentStream != null)
{
- if (contentStream != null)
- {
- // write content
- String mimeType = parseMimeType(contentStream);
+ // write content
+ String mimeType = parseMimeType(contentStream);
- // copy stream to temp file
- // OpenCMIS does this for us ....
- tempFile = copyToTempFile(contentStream);
- final Charset encoding = (tempFile == null ? null : getEncoding(tempFile, contentStream.getMimeType()));
-
- ContentWriter writer = connector.getFileFolderService().getWriter(nodeRef);
- writer.setMimetype(mimeType);
- writer.setEncoding(encoding.name());
- writer.putContent(tempFile);
- }
+ // copy stream to temp file
+ // OpenCMIS does this for us ....
+ tempFile = copyToTempFile(contentStream);
+ final Charset encoding = (tempFile == null ? null : getEncoding(tempFile, contentStream.getMimeType()));
+
+ ContentWriter writer = connector.getFileFolderService().getWriter(nodeRef);
+ writer.setMimetype(mimeType);
+ writer.setEncoding(encoding.name());
+ writer.putContent(tempFile);
}
- finally
- {
- if(tempFile != null)
- {
- removeTempFile(tempFile);
- }
- }
-
- connector.extractMetadata(nodeRef);
-
- // generate "doclib" thumbnail asynchronously
- connector.createThumbnails(nodeRef, Collections.singleton("doclib"));
-
- connector.applyVersioningState(nodeRef, versioningState);
-
- removeTempFile(tempFile);
-
- String objectId = connector.createObjectId(nodeRef);
-
- connector.getActivityPoster().postFileFolderAdded(nodeRef);
-
- return objectId;
}
finally
{
- connector.enableBehaviour(ContentModel.ASPECT_VERSIONABLE);
+ if(tempFile != null)
+ {
+ removeTempFile(tempFile);
+ }
}
+
+ connector.extractMetadata(nodeRef);
+
+ // generate "doclib" thumbnail asynchronously
+ connector.createThumbnails(nodeRef, Collections.singleton("doclib"));
+
+ connector.applyVersioningState(nodeRef, versioningState);
+
+ removeTempFile(tempFile);
+
+ String objectId = connector.createObjectId(nodeRef);
+
+ connector.getActivityPoster().postFileFolderAdded(nodeRef);
+
+ return objectId;
}
@Override
@@ -1216,9 +1206,6 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
try
{
- // don't want auto-versioning to create a version
- connector.disableBehaviour(ContentModel.ASPECT_VERSIONABLE);
-
FileInfo fileInfo = connector.getFileFolderService().copy(
sourceNodeRef, parentInfo.getNodeRef(), name);
NodeRef nodeRef = fileInfo.getNodeRef();
@@ -1232,23 +1219,14 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
connector.applyVersioningState(nodeRef, versioningState);
-// connector.setAutoVersionable(nodeRef);
-
connector.getActivityPoster().postFileFolderAdded(nodeRef);
-// connector.createVersion(nodeRef, VersionType.MINOR, "Thumbnails");
-// connector.createThumbnails(nodeRef, Collections.singleton("doclib"));
-
return connector.createObjectId(nodeRef);
}
catch (FileNotFoundException e)
{
throw new CmisContentAlreadyExistsException("An object with this name already exists!", e);
}
- finally
- {
- connector.enableBehaviour(ContentModel.ASPECT_VERSIONABLE);
- }
}
@Override
@@ -2002,24 +1980,14 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
throw new CmisConstraintException("Document is not versionable!");
}
- try
- {
- // don't want auto-versioning to create a version
- connector.disableBehaviour(ContentModel.ASPECT_VERSIONABLE);
+ // check out
+ NodeRef pwcNodeRef = connector.getCheckOutCheckInService().checkout(nodeRef);
+ CMISNodeInfo pwcNodeInfo = createNodeInfo(pwcNodeRef);
+ objectId.setValue(pwcNodeInfo.getObjectId());
- // check out
- NodeRef pwcNodeRef = connector.getCheckOutCheckInService().checkout(nodeRef);
- CMISNodeInfo pwcNodeInfo = createNodeInfo(pwcNodeRef);
- objectId.setValue(pwcNodeInfo.getObjectId());
-
- if (contentCopied != null)
- {
- contentCopied.setValue(connector.getFileFolderService().getReader(pwcNodeRef) != null);
- }
- }
- finally
+ if (contentCopied != null)
{
- connector.enableBehaviour(ContentModel.ASPECT_VERSIONABLE);
+ contentCopied.setValue(connector.getFileFolderService().getReader(pwcNodeRef) != null);
}
}
@@ -2029,28 +1997,24 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
checkRepositoryId(repositoryId);
CMISNodeInfo info = getOrCreateNodeInfo(objectId, "Object");
-
+
// only accept a PWC
if (!info.isVariant(CMISObjectVariant.PWC))
{
- throw new CmisVersioningException("Object is not a PWC!");
+ NodeRef nodeRef = info.getNodeRef();
+ NodeRef workingCopyNodeRef = connector.getCheckOutCheckInService().getWorkingCopy(nodeRef);
+ info = getOrCreateNodeInfo(workingCopyNodeRef.getId());
+ if (!info.isVariant(CMISObjectVariant.PWC))
+ {
+ throw new CmisVersioningException("Object is not a PWC!");
+ }
}
// get object
final NodeRef nodeRef = info.getNodeRef();
- try
- {
- // don't want auto-versioning to create a version
- connector.disableBehaviour(ContentModel.ASPECT_VERSIONABLE);
-
- // cancel check out
- connector.getCheckOutCheckInService().cancelCheckout(nodeRef);
- }
- finally
- {
- connector.enableBehaviour(ContentModel.ASPECT_VERSIONABLE);
- }
+ // cancel check out
+ connector.getCheckOutCheckInService().cancelCheckout(nodeRef);
}
@Override
@@ -2077,57 +2041,38 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
final File tempFile = copyToTempFile(contentStream);
final Charset encoding = (tempFile == null ? null : getEncoding(tempFile, contentStream.getMimeType()));
- try
+ // check in
+ // update PWC
+ connector.setProperties(nodeRef, type, properties,
+ new String[] { PropertyIds.OBJECT_TYPE_ID });
+ connector.applyPolicies(nodeRef, type, policies);
+ connector.applyACL(nodeRef, type, addAces, removeAces);
+
+ // handle content
+ if (contentStream != null)
{
- // don't want auto-versioning to create a version
- connector.disableBehaviour(ContentModel.ASPECT_VERSIONABLE);
-
- // check in
- // update PWC
- connector.setProperties(nodeRef, type, properties,
- new String[] { PropertyIds.OBJECT_TYPE_ID });
- connector.applyPolicies(nodeRef, type, policies);
- connector.applyACL(nodeRef, type, addAces, removeAces);
-
- // handle content
- if (contentStream != null)
- {
- // write content
- ContentWriter writer = connector.getFileFolderService().getWriter(nodeRef);
- writer.setMimetype(parseMimeType(contentStream));
- writer.setEncoding(encoding.name());
- writer.putContent(tempFile);
- }
-
- // check aspect
- // if (connector.getNodeService().hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE) == false)
- // {
- // Map props = new HashMap();
- // props.put(ContentModel.PROP_INITIAL_VERSION, false);
- // props.put(ContentModel.PROP_AUTO_VERSION, false);
- // connector.getNodeService().addAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE, props);
- // }
-
- // create version properties
- Map versionProperties = new HashMap(5);
- versionProperties.put(VersionModel.PROP_VERSION_TYPE, major ? VersionType.MAJOR
- : VersionType.MINOR);
- if (checkinComment != null)
- {
- versionProperties.put(VersionModel.PROP_DESCRIPTION, checkinComment);
- }
-
- // check in
- NodeRef newNodeRef = connector.getCheckOutCheckInService().checkin(nodeRef, versionProperties);
-
- connector.getActivityPoster().postFileFolderUpdated(info.isFolder(), newNodeRef);
-
- objectId.setValue(connector.createObjectId(newNodeRef));
+ // write content
+ ContentWriter writer = connector.getFileFolderService().getWriter(nodeRef);
+ writer.setMimetype(parseMimeType(contentStream));
+ writer.setEncoding(encoding.name());
+ writer.putContent(tempFile);
}
- finally
+
+ // create version properties
+ Map versionProperties = new HashMap(5);
+ versionProperties.put(VersionModel.PROP_VERSION_TYPE, major ? VersionType.MAJOR
+ : VersionType.MINOR);
+ if (checkinComment != null)
{
- connector.enableBehaviour(ContentModel.ASPECT_VERSIONABLE);
+ versionProperties.put(VersionModel.PROP_DESCRIPTION, checkinComment);
}
+
+ // check in
+ NodeRef newNodeRef = connector.getCheckOutCheckInService().checkin(nodeRef, versionProperties);
+
+ connector.getActivityPoster().postFileFolderUpdated(info.isFolder(), newNodeRef);
+
+ objectId.setValue(connector.createObjectId(newNodeRef));
removeTempFile(tempFile);
}
@@ -2605,19 +2550,6 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
return info;
}
- protected String getGuid(String nodeId)
- {
- int idx = nodeId.lastIndexOf("/");
- if(idx != -1)
- {
- return nodeId.substring(idx+1);
- }
- else
- {
- return nodeId;
- }
- }
-
/**
* Collects the {@link ObjectInfo} about an object.
*
@@ -2722,7 +2654,7 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
info.setWorkingCopyId(null);
info.setWorkingCopyOriginalId(null);
- info.setVersionSeriesId(getGuid(ni.getCurrentNodeId()));
+ info.setVersionSeriesId(ni.getCurrentNodeId());
if (ni.isPWC())
{
@@ -2736,7 +2668,7 @@ public class AlfrescoCmisServiceImpl extends AbstractCmisService implements Alfr
if (ni.hasPWC())
{
- info.setWorkingCopyId(getGuid(ni.getCurrentNodeId()) + CMISConnector.ID_SEPERATOR
+ info.setWorkingCopyId(ni.getCurrentNodeId() + CMISConnector.ID_SEPERATOR
+ CMISConnector.PWC_VERSION_LABEL);
info.setWorkingCopyOriginalId(ni.getCurrentObjectId());
} else
diff --git a/source/java/org/alfresco/opencmis/CMISConnector.java b/source/java/org/alfresco/opencmis/CMISConnector.java
index fd40d78f7d..0ec53729d4 100644
--- a/source/java/org/alfresco/opencmis/CMISConnector.java
+++ b/source/java/org/alfresco/opencmis/CMISConnector.java
@@ -36,6 +36,7 @@ import java.util.EnumSet;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -93,6 +94,7 @@ import org.alfresco.service.cmr.audit.AuditQueryParameters;
import org.alfresco.service.cmr.audit.AuditService;
import org.alfresco.service.cmr.audit.AuditService.AuditQueryCallback;
import org.alfresco.service.cmr.coci.CheckOutCheckInService;
+import org.alfresco.service.cmr.dictionary.AspectDefinition;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.cmr.dictionary.InvalidAspectException;
@@ -1167,15 +1169,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
}
else
{
- // if input is NodeRef, return NodeRef. If input is guid, return guid.
- if(NodeRef.isNodeRef(incomingNodeId))
- {
- sb.append(incomingNodeId);
- }
- else
- {
- sb.append(getGuid(incomingNodeId));
- }
+ sb.append(incomingNodeId);
}
if(versionLabel != null)
{
@@ -1187,28 +1181,19 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
private void createVersion(NodeRef nodeRef, VersionType versionType, String reason)
{
- // disable auto-versioning behaviour for this
- disableBehaviour(ContentModel.ASPECT_VERSIONABLE);
- try
+ if(versionService.getVersionHistory(nodeRef) == null)
{
- if(versionService.getVersionHistory(nodeRef) == null)
- {
- // no version history. Make sure we have an initial major version 1.0.
- Map versionProperties = new HashMap(2);
- versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MAJOR);
- versionProperties.put(VersionModel.PROP_DESCRIPTION, "Initial version");
- versionService.createVersion(nodeRef, versionProperties);
- }
-
- Map versionProperties = new HashMap(2);
- versionProperties.put(VersionModel.PROP_VERSION_TYPE, versionType);
- versionProperties.put(VersionModel.PROP_DESCRIPTION, reason);
- versionService.createVersion(nodeRef, versionProperties);
- }
- finally
- {
- enableBehaviour(ContentModel.ASPECT_VERSIONABLE);
+ // no version history. Make sure we have an initial major version 1.0.
+ Map versionProperties = new HashMap(2);
+ versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MAJOR);
+ versionProperties.put(VersionModel.PROP_DESCRIPTION, "Initial version");
+ versionService.createVersion(nodeRef, versionProperties);
}
+
+ Map versionProperties = new HashMap(2);
+ versionProperties.put(VersionModel.PROP_VERSION_TYPE, versionType);
+ versionProperties.put(VersionModel.PROP_DESCRIPTION, reason);
+ versionService.createVersion(nodeRef, versionProperties);
}
private boolean isPublicApi()
@@ -1349,18 +1334,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
versionProperties.put(VersionModel.PROP_VERSION_TYPE, VersionType.MAJOR);
versionProperties.put(VersionModel.PROP_DESCRIPTION, "Initial Version");
- try
- {
- // don't want auto-versioning to create a version
- disableBehaviour(ContentModel.ASPECT_VERSIONABLE, nodeRef);
-
- versionService.createVersion(nodeRef, versionProperties);
- getCheckOutCheckInService().checkout(nodeRef);
- }
- finally
- {
- enableBehaviour(ContentModel.ASPECT_VERSIONABLE, nodeRef);
- }
+ getCheckOutCheckInService().checkout(nodeRef);
}
else if ((versioningState == VersioningState.MAJOR) || (versioningState == VersioningState.MINOR))
{
@@ -1378,17 +1352,7 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
versioningState == VersioningState.MAJOR ? VersionType.MAJOR : VersionType.MINOR);
versionProperties.put(VersionModel.PROP_DESCRIPTION, "Initial Version");
- try
- {
- // don't want auto-versioning to create a version
- disableBehaviour(ContentModel.ASPECT_VERSIONABLE, nodeRef);
-
- versionService.createVersion(nodeRef, versionProperties);
- }
- finally
- {
- enableBehaviour(ContentModel.ASPECT_VERSIONABLE, nodeRef);
- }
+ versionService.createVersion(nodeRef, versionProperties);
}
}
@@ -2766,7 +2730,11 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
// set allowable actions
if (includeAllowableActions)
{
- hit.setAllowableActions(getAllowableActions(createNodeInfo(nodeRef)));
+ CMISNodeInfoImpl nodeInfo = createNodeInfo(nodeRef);
+ if(!nodeInfo.getObjectVariant().equals(CMISObjectVariant.NOT_EXISTING))
+ {
+ hit.setAllowableActions(getAllowableActions(nodeInfo));
+ }
}
// set relationships
@@ -2811,33 +2779,74 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
/**
* Sets property values.
*/
+ @SuppressWarnings({ "rawtypes" })
public void setProperties(NodeRef nodeRef, TypeDefinitionWrapper type, Properties properties, String... exclude)
{
if (properties == null)
{
return;
}
-
- // Need to do this first
- Map> propsMap = properties.getProperties();
- PropertyData> secondaryTypes = propsMap.get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS);
- if(secondaryTypes != null && secondaryTypes.getValues().size() > 0)
+
+ Map> incomingPropsMap = properties.getProperties();
+ if (incomingPropsMap == null)
{
- setProperty(nodeRef, type, secondaryTypes);
+ return;
}
- List> props = properties.getPropertyList();
- for (PropertyData> property : props)
+ // extract property data into an easier to use form
+ Map> propsMap = new HashMap>();
+ for (String propertyId : incomingPropsMap.keySet())
{
- String propertyId = property.getId();
- if(propertyId.equals(PropertyIds.SECONDARY_OBJECT_TYPE_IDS))
- {
- // handled above
- continue;
- }
+ PropertyData> property = incomingPropsMap.get(propertyId);
+ PropertyDefinitionWrapper propDef = type.getPropertyById(property.getId());
+ if (propDef == null)
+ {
+ throw new CmisInvalidArgumentException("Property " + property.getId() + " is unknown!");
+ }
+
+ Updatability updatability = propDef.getPropertyDefinition().getUpdatability();
+ if ((updatability == Updatability.READONLY)
+ || (updatability == Updatability.WHENCHECKEDOUT && !checkOutCheckInService.isWorkingCopy(nodeRef)))
+ {
+ throw new CmisInvalidArgumentException("Property " + property.getId() + " is read-only!");
+ }
+ TypeDefinitionWrapper propType = propDef.getOwningType();
+ Serializable value = getValue(property, propDef.getPropertyDefinition().getCardinality() == Cardinality.MULTI);
+ Pair pair = new Pair(propType, value);
+ propsMap.put(propertyId, pair);
+ }
+
+ // Need to do deal with secondary types first
+ Pair pair = propsMap.get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS);
+ Serializable secondaryTypesProperty = (pair != null ? pair.getSecond() : null);
+ if(secondaryTypesProperty != null)
+ {
+ if (!(secondaryTypesProperty instanceof List))
+ {
+ throw new CmisInvalidArgumentException("Secondary types must be a list!");
+ }
+ List secondaryTypes = (List)secondaryTypesProperty;
+ if(secondaryTypes != null && secondaryTypes.size() > 0)
+ {
+ // add/remove secondary types/aspects
+ processSecondaryTypes(nodeRef, secondaryTypes, propsMap);
+ }
+ }
+
+ for (String propertyId : propsMap.keySet())
+ {
+ if(propertyId.equals(PropertyIds.SECONDARY_OBJECT_TYPE_IDS))
+ {
+ // already handled above
+ continue;
+ }
+
+ pair = propsMap.get(propertyId);
+ TypeDefinitionWrapper propType = pair.getFirst();
+ Serializable value = pair.getSecond();
if (Arrays.binarySearch(exclude, propertyId) < 0)
{
- setProperty(nodeRef, type, property);
+ setProperty(nodeRef, propType, propertyId, value);
}
}
@@ -2858,6 +2867,93 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
}
}
+ @SuppressWarnings("rawtypes")
+ private void processSecondaryTypes(NodeRef nodeRef, List secondaryTypes, Map> propsToAdd)
+ {
+ // diff existing aspects and secondaryTypes/aspects list
+ Set existingAspects = nodeService.getAspects(nodeRef);
+ Set secondaryTypeAspects = new HashSet();
+ for(Object o : secondaryTypes)
+ {
+ String secondaryType = (String)o;
+
+ TypeDefinitionWrapper wrapper = cmisDictionaryService.findType(secondaryType);
+ if(wrapper != null)
+ {
+ QName aspectQName = wrapper.getAlfrescoName();
+ secondaryTypeAspects.add(aspectQName);
+ }
+ else
+ {
+ throw new CmisInvalidArgumentException("Invalid secondary type id " + secondaryType);
+ }
+ }
+
+ Set ignore = new HashSet();
+ ignore.add(ContentModel.ASPECT_REFERENCEABLE);
+ ignore.add(ContentModel.ASPECT_LOCALIZED);
+
+ // aspects to add == the list of secondary types - existing aspects - ignored aspects
+ Set toAdd = new HashSet(secondaryTypeAspects);
+ toAdd.removeAll(existingAspects);
+ toAdd.removeAll(ignore);
+
+ // aspects to remove == existing aspects - secondary types
+ Set aspectsToRemove = new HashSet();
+ aspectsToRemove.addAll(existingAspects);
+ aspectsToRemove.removeAll(ignore);
+ Iterator it = aspectsToRemove.iterator();
+ while(it.hasNext())
+ {
+ QName aspectQName = it.next();
+ TypeDefinitionWrapper w = cmisDictionaryService.findNodeType(aspectQName);
+ if(w == null || secondaryTypeAspects.contains(aspectQName))
+ {
+ // the type is not exposed or is in the secondary types to set, so remove it from the to remove set
+ it.remove();
+ }
+ }
+
+ // first, remove aspects
+ for(QName aspectQName : aspectsToRemove)
+ {
+ nodeService.removeAspect(nodeRef, aspectQName);
+ // aspect is being removed so remove all of its properties from the propsToAdd map
+ TypeDefinitionWrapper w = cmisDictionaryService.findNodeType(aspectQName);
+ for(PropertyDefinitionWrapper wr : w.getProperties())
+ {
+ String propertyId = wr.getPropertyId();
+ propsToAdd.remove(propertyId);
+ }
+ }
+
+ // add aspects and properties
+ for(QName aspectQName : toAdd)
+ {
+ nodeService.addAspect(nodeRef, aspectQName, null);
+
+ // get aspect properties
+ AspectDefinition aspectDef = dictionaryService.getAspect(aspectQName);
+ Map aspectPropDefs = aspectDef.getProperties();
+ TypeDefinitionWrapper w = cmisDictionaryService.findNodeType(aspectQName);
+ // for each aspect property...
+ for(QName propQName : aspectPropDefs.keySet())
+ {
+ // find CMIS property id
+ PropertyDefinitionWrapper property = w.getPropertyByQName(propQName);
+ String propertyId = property.getPropertyId();
+ if(!propsToAdd.containsKey(propertyId))
+ {
+ TypeDefinitionWrapper propType = property.getOwningType();
+ // CMIS 1.1 secondary types specification requires that all secondary type properties are set
+ // property not included in propsToAdd, add it with null value
+ Pair pair = new Pair(propType, null);
+ propsToAdd.put(propertyId, pair);
+ }
+ }
+ }
+ }
+
public void addSecondaryTypes(NodeRef nodeRef, List secondaryTypes)
{
if(secondaryTypes != null && secondaryTypes.size() > 0)
@@ -3176,62 +3272,39 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
/**
* Sets a property value.
*/
- @SuppressWarnings("rawtypes")
- public void setProperty(NodeRef nodeRef, TypeDefinitionWrapper type, PropertyData> property)
+ public void setProperty(NodeRef nodeRef, TypeDefinitionWrapper type, String propertyId, Serializable value)
{
- if (property == null)
+ if (propertyId == null)
{
throw new CmisInvalidArgumentException("Cannot process not null property!");
}
- PropertyDefinitionWrapper propDef = type.getPropertyById(property.getId());
+ PropertyDefinitionWrapper propDef = type.getPropertyById(propertyId);
if (propDef == null)
{
- throw new CmisInvalidArgumentException("Property " + property.getId() + " is unknown!");
+ throw new CmisInvalidArgumentException("Property " + propertyId + " is unknown!");
}
Updatability updatability = propDef.getPropertyDefinition().getUpdatability();
if ((updatability == Updatability.READONLY)
|| (updatability == Updatability.WHENCHECKEDOUT && !checkOutCheckInService.isWorkingCopy(nodeRef)))
{
- throw new CmisInvalidArgumentException("Property " + property.getId() + " is read-only!");
+ throw new CmisInvalidArgumentException("Property " + propertyId + " is read-only!");
}
- // get the value
- Serializable value = getValue(property, propDef.getPropertyDefinition().getCardinality() == Cardinality.MULTI);
-
if(propDef.getPropertyId().equals(PropertyIds.SECONDARY_OBJECT_TYPE_IDS))
{
- if (!(value instanceof List))
- {
- throw new CmisInvalidArgumentException("Secondary types must be a list!");
- }
-
- List secondaryTypes = (List)value;
- for(Object o : secondaryTypes)
- {
- String secondaryType = (String)o;
- TypeDefinitionWrapper wrapper = cmisDictionaryService.findType(secondaryType);
- if(wrapper != null)
- {
- nodeService.addAspect(nodeRef, wrapper.getAlfrescoName(), null);
- }
- else
- {
- throw new CmisInvalidArgumentException("Invalid type id " + secondaryType);
- }
- }
+ throw new IllegalArgumentException("Cannot process " + PropertyIds.SECONDARY_OBJECT_TYPE_IDS + " in setProperty");
}
else
{
QName propertyQName = propDef.getPropertyAccessor().getMappedProperty();
if (propertyQName == null)
{
- throw new CmisConstraintException("Unable to set property " + property.getId() + "!");
+ throw new CmisConstraintException("Unable to set property " + propertyId + "!");
}
-
- if (property.getId().equals(PropertyIds.NAME))
+ if (propertyId.equals(PropertyIds.NAME))
{
if (!(value instanceof String))
{
@@ -3259,25 +3332,25 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
}
else
{
- // overflow check
- if(propDef.getPropertyDefinition().getPropertyType() == PropertyType.INTEGER && value instanceof BigInteger)
- {
- org.alfresco.service.cmr.dictionary.PropertyDefinition def = dictionaryService.getProperty(propertyQName);
- QName dataDef = def.getDataType().getName();
- BigInteger bigValue = (BigInteger)value;
-
- if ((bigValue.compareTo(maxInt) > 0 || bigValue.compareTo(minInt) < 0 ) && dataDef.equals(DataTypeDefinition.INT))
- {
- throw new CmisConstraintException("Value is out of range for property " + propertyQName.getLocalName());
- }
-
- if ((bigValue.compareTo(maxLong) > 0 || bigValue.compareTo(minLong) < 0 ) && dataDef.equals(DataTypeDefinition.LONG))
- {
- throw new CmisConstraintException("Value is out of range for property " + propertyQName.getLocalName());
- }
- }
-
- nodeService.setProperty(nodeRef, propertyQName, value);
+ // overflow check
+ if(propDef.getPropertyDefinition().getPropertyType() == PropertyType.INTEGER && value instanceof BigInteger)
+ {
+ org.alfresco.service.cmr.dictionary.PropertyDefinition def = dictionaryService.getProperty(propertyQName);
+ QName dataDef = def.getDataType().getName();
+ BigInteger bigValue = (BigInteger)value;
+
+ if ((bigValue.compareTo(maxInt) > 0 || bigValue.compareTo(minInt) < 0 ) && dataDef.equals(DataTypeDefinition.INT))
+ {
+ throw new CmisConstraintException("Value is out of range for property " + propertyQName.getLocalName());
+ }
+
+ if ((bigValue.compareTo(maxLong) > 0 || bigValue.compareTo(minLong) < 0 ) && dataDef.equals(DataTypeDefinition.LONG))
+ {
+ throw new CmisConstraintException("Value is out of range for property " + propertyQName.getLocalName());
+ }
+ }
+
+ nodeService.setProperty(nodeRef, propertyQName, value);
}
}
}
diff --git a/source/java/org/alfresco/opencmis/CMISNodeInfoImpl.java b/source/java/org/alfresco/opencmis/CMISNodeInfoImpl.java
index 13f3cd370f..5a6231555b 100644
--- a/source/java/org/alfresco/opencmis/CMISNodeInfoImpl.java
+++ b/source/java/org/alfresco/opencmis/CMISNodeInfoImpl.java
@@ -37,7 +37,6 @@ import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.version.Version2Model;
import org.alfresco.repo.version.VersionBaseModel;
import org.alfresco.repo.version.VersionModel;
-import org.alfresco.service.cmr.lock.LockType;
import org.alfresco.service.cmr.repository.AssociationRef;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
@@ -366,7 +365,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
// specific non-head version
String headVersionLabel = (String)connector.getNodeService().getProperty(nodeRef, ContentModel.PROP_VERSION_LABEL);
currentObjectId = connector.constructObjectId(currentNodeId, headVersionLabel);
-
+
if (versionLabel.equals(headVersionLabel))
{
// the version label refers to the current head version
@@ -503,7 +502,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
}
objecVariant = CMISObjectVariant.ASSOC;
- objectId = connector.constructObjectId(associationRef, null);
+ objectId = CMISConnector.ASSOC_ID_PREFIX + associationRef.getId();
}
private void determineType()
@@ -583,7 +582,7 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
public boolean isLatestVersion()
{
- return isPWC() || (isCurrentVersion() && !hasPWC());
+ return isCurrentVersion();
}
public boolean isLatestMajorVersion()
@@ -865,16 +864,16 @@ public class CMISNodeInfoImpl implements CMISNodeInfo
private NodeRef getLatestNonMajorVersionNodeRef()
{
- if (isPWC())
- {
- return nodeRef;
- } else if (hasPWC())
- {
- return connector.getCheckOutCheckInService().getWorkingCopy(getCurrentNodeNodeRef());
- } else
- {
+// if (isPWC())
+// {
+// return nodeRef;
+// } else if (hasPWC())
+// {
+// return connector.getCheckOutCheckInService().getWorkingCopy(getCurrentNodeNodeRef());
+// } else
+// {
return getCurrentNodeNodeRef();
- }
+// }
}
// TODO lock here??
diff --git a/source/java/org/alfresco/opencmis/PathObjectFilter.java b/source/java/org/alfresco/opencmis/PathObjectFilter.java
index c84e85a5d9..594f750736 100644
--- a/source/java/org/alfresco/opencmis/PathObjectFilter.java
+++ b/source/java/org/alfresco/opencmis/PathObjectFilter.java
@@ -2,6 +2,7 @@ package org.alfresco.opencmis;
import java.util.List;
+import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.Path;
@@ -44,9 +45,16 @@ public class PathObjectFilter implements ObjectFilter
@Override
public boolean filter(NodeRef nodeRef)
{
- Path path = nodeService.getPath(nodeRef);
- String s = path.toPrefixString(this.namespaceService);
- return filter(s);
+ try
+ {
+ Path path = nodeService.getPath(nodeRef);
+ String s = path.toPrefixString(this.namespaceService);
+ return filter(s);
+ }
+ catch(AccessDeniedException e)
+ {
+ return true;
+ }
}
public boolean filter(String path)
diff --git a/source/java/org/alfresco/opencmis/PublicApiCallContextHandler.java b/source/java/org/alfresco/opencmis/PublicApiCallContextHandler.java
index 3802b83a3c..fc501554c6 100644
--- a/source/java/org/alfresco/opencmis/PublicApiCallContextHandler.java
+++ b/source/java/org/alfresco/opencmis/PublicApiCallContextHandler.java
@@ -5,11 +5,13 @@ import java.util.Map;
import javax.servlet.http.HttpServletRequest;
-import org.apache.chemistry.opencmis.server.shared.CallContextHandler;
+import org.apache.chemistry.opencmis.server.shared.BasicAuthCallContextHandler;
-public class PublicApiCallContextHandler implements CallContextHandler
+public class PublicApiCallContextHandler extends BasicAuthCallContextHandler
{
- @Override
+ private static final long serialVersionUID = 8877878113507734452L;
+
+ @Override
public Map getCallContextMap(HttpServletRequest request)
{
Map map = new HashMap();
diff --git a/source/java/org/alfresco/opencmis/mapping/AbstractProperty.java b/source/java/org/alfresco/opencmis/mapping/AbstractProperty.java
index d89b305497..fdf22b4d90 100644
--- a/source/java/org/alfresco/opencmis/mapping/AbstractProperty.java
+++ b/source/java/org/alfresco/opencmis/mapping/AbstractProperty.java
@@ -109,7 +109,8 @@ public abstract class AbstractProperty implements CMISPropertyAccessor
{
if (nodeInfo.containsPropertyValue(propertyName))
{
- return nodeInfo.getPropertyValue(propertyName);
+ Serializable value = nodeInfo.getPropertyValue(propertyName);
+ return value;
} else
{
Serializable value = getValueInternal(nodeInfo);
diff --git a/source/java/org/alfresco/opencmis/mapping/VersionSeriesCheckedOutIdProperty.java b/source/java/org/alfresco/opencmis/mapping/VersionSeriesCheckedOutIdProperty.java
index 410976d607..9b115a9006 100644
--- a/source/java/org/alfresco/opencmis/mapping/VersionSeriesCheckedOutIdProperty.java
+++ b/source/java/org/alfresco/opencmis/mapping/VersionSeriesCheckedOutIdProperty.java
@@ -49,6 +49,6 @@ public class VersionSeriesCheckedOutIdProperty extends AbstractProperty
return null;
}
- return getGuid(nodeInfo.getCurrentNodeId()) + CMISConnector.ID_SEPERATOR + CMISConnector.PWC_VERSION_LABEL;
+ return connector.constructObjectId(nodeInfo.getCurrentNodeId(), CMISConnector.PWC_VERSION_LABEL);
}
}
diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java
index d906eb14b2..c9b6cce4a4 100644
--- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java
+++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java
@@ -27,7 +27,6 @@ import java.util.Map;
import java.util.Set;
import org.alfresco.model.ContentModel;
-import org.alfresco.repo.domain.mimetype.MimetypeDAO;
import org.alfresco.repo.domain.node.Node;
import org.alfresco.repo.domain.node.NodeDAO;
import org.alfresco.repo.domain.qname.QNameDAO;
@@ -39,9 +38,10 @@ import org.alfresco.repo.search.impl.querymodel.QueryEngineResults;
import org.alfresco.repo.search.impl.querymodel.QueryModelException;
import org.alfresco.repo.search.impl.querymodel.QueryModelFactory;
import org.alfresco.repo.search.impl.querymodel.QueryOptions;
+import org.alfresco.repo.tenant.TenantService;
import org.alfresco.service.cmr.dictionary.DictionaryService;
-import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
+import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
@@ -67,6 +67,13 @@ public class DBQueryEngine implements QueryEngine
private NodeService nodeService;
+ private TenantService tenantService;
+
+ public void setTenantService(TenantService tenantService)
+ {
+ this.tenantService = tenantService;
+ }
+
public final void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate)
{
this.template = sqlSessionTemplate;
@@ -148,7 +155,12 @@ public class DBQueryEngine implements QueryEngine
key.add("");
Map, ResultSet> answer = new HashMap, ResultSet>();
DBQuery dbQuery = (DBQuery)query;
- dbQuery.setStoreId(nodeDAO.getStore(options.getStores().get(0)).getFirst());
+
+ // MT
+ StoreRef storeRef = options.getStores().get(0);
+ storeRef = storeRef != null ? tenantService.getName(storeRef) : null;
+
+ dbQuery.setStoreId(nodeDAO.getStore(storeRef).getFirst());
Pair sysDeletedType = qnameDAO.getQName(ContentModel.TYPE_DELETED);
if(sysDeletedType == null)
{
diff --git a/source/test-java/org/alfresco/opencmis/CMISTest.java b/source/test-java/org/alfresco/opencmis/CMISTest.java
index a5a28f4e15..8adc03d6e5 100644
--- a/source/test-java/org/alfresco/opencmis/CMISTest.java
+++ b/source/test-java/org/alfresco/opencmis/CMISTest.java
@@ -10,6 +10,7 @@ import java.io.File;
import java.io.Serializable;
import java.math.BigInteger;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashMap;
@@ -34,9 +35,9 @@ import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.rule.Rule;
import org.alfresco.service.cmr.rule.RuleService;
import org.alfresco.service.cmr.rule.RuleType;
+import org.alfresco.service.cmr.version.VersionService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
-import org.alfresco.service.cmr.version.VersionService;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.ApplicationContextHelper;
import org.apache.chemistry.opencmis.commons.PropertyIds;
@@ -88,7 +89,8 @@ public class CMISTest
private VersionService versionService;
private LockService lockService;
- private AlfrescoCmisServiceFactory factory;
+ private AlfrescoCmisServiceFactory factory10;
+ private AlfrescoCmisServiceFactory factory11;
private SimpleCallContext context;
private ActionService actionService;
@@ -122,6 +124,33 @@ public class CMISTest
return serviceFactory.getService(context);
}
}
+
+ /**
+ * Test class to provide the service factory
+ *
+ * @author Derek Hulley
+ * @since 4.0
+ */
+ public static class TestCmisServiceFactory11 extends AbstractServiceFactory
+ {
+ private static AlfrescoCmisServiceFactory serviceFactory = (AlfrescoCmisServiceFactory) ctx.getBean("CMISServiceFactory1.1");
+ @Override
+ public void init(Map parameters)
+ {
+ serviceFactory.init(parameters);
+ }
+
+ @Override
+ public void destroy()
+ {
+ }
+
+ @Override
+ public CmisService getService(CallContext context)
+ {
+ return serviceFactory.getService(context);
+ }
+ }
private static class SimpleCallContext implements CallContext
{
@@ -212,7 +241,7 @@ public class CMISTest
return CmisVersion.CMIS_1_1;
}
}
-
+
@Before
public void before()
{
@@ -224,7 +253,8 @@ public class CMISTest
this.versionService = (VersionService) ctx.getBean("versionService");
this.lockService = (LockService) ctx.getBean("lockService");
this.repositoryHelper = (Repository)ctx.getBean("repositoryHelper");
- this.factory = (AlfrescoCmisServiceFactory)ctx.getBean("CMISServiceFactory");
+ this.factory10 = (AlfrescoCmisServiceFactory)ctx.getBean("CMISServiceFactory");
+ this.factory11 = (AlfrescoCmisServiceFactory)ctx.getBean("CMISServiceFactory1.1");
this.cmisConnector = (CMISConnector) ctx.getBean("CMISConnector");
this.context = new SimpleCallContext("admin", "admin");
}
@@ -307,7 +337,7 @@ public class CMISTest
try
{
- cmisService = factory.getService(context);
+ cmisService = factory10.getService(context);
T ret = callback.execute(cmisService);
return ret;
}
@@ -320,6 +350,25 @@ public class CMISTest
}
}
+ private T withCmisService11(CmisServiceCallback callback)
+ {
+ CmisService cmisService = null;
+
+ try
+ {
+ cmisService = factory11.getService(context);
+ T ret = callback.execute(cmisService);
+ return ret;
+ }
+ finally
+ {
+ if(cmisService != null)
+ {
+ cmisService.close();
+ }
+ }
+ }
+
private static interface CmisServiceCallback
{
T execute(CmisService cmisService);
@@ -524,7 +573,7 @@ public class CMISTest
}
});
- CmisService service = factory.getService(context);
+ CmisService service = factory10.getService(context);
try
{
List repositories = service.getRepositoryInfos(null);
@@ -546,7 +595,7 @@ public class CMISTest
// AtomPub cancel checkout
try
{
- service = factory.getService(context);
+ service = factory10.getService(context);
// check allowable actions
ObjectData originalDoc = service.getObject(repositoryId, objectData.getId(), null, true, IncludeRelationships.NONE, null, false, true, null);
@@ -569,7 +618,7 @@ public class CMISTest
try
{
- service = factory.getService(context);
+ service = factory10.getService(context);
// cancel checkout on pwc
service.deleteObjectOrCancelCheckOut(repositoryId, objectId.getValue(), Boolean.TRUE, null);
@@ -581,7 +630,7 @@ public class CMISTest
try
{
- service = factory.getService(context);
+ service = factory10.getService(context);
// get original document
ObjectData originalDoc = service.getObject(repositoryId, objectData.getId(), null, true, IncludeRelationships.NONE, null, false, true, null);
@@ -599,7 +648,7 @@ public class CMISTest
try
{
- service = factory.getService(context);
+ service = factory10.getService(context);
// delete original document
service.deleteObject(repositoryId, objectData.getId(), true, null);
@@ -665,7 +714,7 @@ public class CMISTest
FileInfo folderEmptyWithRule = createContent(folderNameEmptyRule, null, true);
testFolderMap.put(folderEmptyWithRule, Boolean.TRUE);
- CmisService service = factory.getService(context);
+ CmisService service = factory10.getService(context);
try
{
@@ -751,7 +800,7 @@ public class CMISTest
}
});
- CmisService service = factory.getService(context);
+ CmisService service = factory10.getService(context);
try
{
List repositories = service.getRepositoryInfos(null);
@@ -849,7 +898,7 @@ public class CMISTest
AuthenticationUtil.popAuthentication();
}
- CmisService cmisService = factory.getService(context);
+ CmisService cmisService = factory10.getService(context);
try
{
// get repository id
@@ -901,6 +950,101 @@ public class CMISTest
}
}
+ @SuppressWarnings("rawtypes")
+ @Test
+ public void testSecondaryTypes()
+ {
+ CmisService cmisService = factory11.getService(context);
+ try
+ {
+ // get repository id
+ List repositories = cmisService.getRepositoryInfos(null);
+ assertTrue(repositories.size() > 0);
+ RepositoryInfo repo = repositories.get(0);
+ final String repositoryId = repo.getId();
+ final String aspectName = "P:cm:indexControl";
+
+ System.out.println("START");
+
+ final String objectId = withCmisService11(new CmisServiceCallback()
+ {
+ @Override
+ public String execute(CmisService cmisService)
+ {
+ final PropertiesImpl properties = new PropertiesImpl();
+ String objectTypeId = "cmis:document";
+ properties.addProperty(new PropertyIdImpl(PropertyIds.OBJECT_TYPE_ID, objectTypeId));
+ String fileName = "textFile" + GUID.generate();
+ properties.addProperty(new PropertyStringImpl(PropertyIds.NAME, fileName));
+ final ContentStreamImpl contentStream = new ContentStreamImpl(fileName, MimetypeMap.MIMETYPE_TEXT_PLAIN, "Simple text plain document");
+
+ String objectId = cmisService.create(repositoryId, properties, repositoryHelper.getCompanyHome().getId(), contentStream, VersioningState.MAJOR, null, null);
+ return objectId;
+ }
+ });
+
+ final Holder objectIdHolder = new Holder(objectId);
+
+ withCmisService11(new CmisServiceCallback()
+ {
+ @Override
+ public Void execute(CmisService cmisService)
+ {
+ final PropertiesImpl properties = new PropertiesImpl();
+ properties.addProperty(new PropertyStringImpl(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, Arrays.asList(aspectName)));
+
+ cmisService.updateProperties(repositoryId, objectIdHolder, null, properties, null);
+ return null;
+ }
+ });
+
+ final Properties currentProperties = withCmisService11(new CmisServiceCallback()
+ {
+ @Override
+ public Properties execute(CmisService cmisService)
+ {
+ Properties properties = cmisService.getProperties(repositoryId, objectIdHolder.getValue(), null, null);
+ return properties;
+ }
+ });
+
+ System.out.println("objectId = " + objectIdHolder.getValue());
+ List secondaryTypeIds = currentProperties.getProperties().get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS).getValues();
+ System.out.println("secondaryTypeIds = " + secondaryTypeIds);
+
+ secondaryTypeIds.remove(aspectName);
+ System.out.println("secondaryTypeIds = " + secondaryTypeIds);
+ final PropertiesImpl newProperties = new PropertiesImpl();
+ newProperties.addProperty(new PropertyStringImpl(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, secondaryTypeIds));
+
+ withCmisService11(new CmisServiceCallback()
+ {
+ @Override
+ public Void execute(CmisService cmisService)
+ {
+ cmisService.updateProperties(repositoryId, objectIdHolder, null, newProperties, null);
+ return null;
+ }
+ });
+
+ Properties currentProperties1 = withCmisService11(new CmisServiceCallback()
+ {
+ @Override
+ public Properties execute(CmisService cmisService)
+ {
+ Properties properties = cmisService.getProperties(repositoryId, objectIdHolder.getValue(), null, null);
+ return properties;
+ }
+ });
+ secondaryTypeIds = currentProperties1.getProperties().get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS).getValues();
+ System.out.println("secondaryTypeIds = " + secondaryTypeIds);
+ }
+ finally
+ {
+ cmisService.close();
+ }
+ }
+
/**
* Test for MNT-9089
*/
@@ -910,7 +1054,7 @@ public class CMISTest
AuthenticationUtil.pushAuthentication();
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
- CmisService cmisService = factory.getService(context);
+ CmisService cmisService = factory10.getService(context);
try
{
@@ -1052,7 +1196,7 @@ public class CMISTest
AuthenticationUtil.pushAuthentication();
AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil.getAdminUserName());
- CmisService cmisService = factory.getService(context);
+ CmisService cmisService = factory10.getService(context);
try
{