REPO-2926: CMIS update now ignores aspects in the sys namespace

Includes tests
This commit is contained in:
Matt Ward
2017-09-21 17:18:11 +01:00
parent bb53033ce5
commit a321e1a812
2 changed files with 104 additions and 80 deletions

View File

@@ -238,6 +238,8 @@ import org.springframework.context.event.ApplicationContextEvent;
import org.springframework.extensions.surf.util.AbstractLifecycleBean; import org.springframework.extensions.surf.util.AbstractLifecycleBean;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import static java.util.Collections.singletonList;
/** /**
* Bridge connecting Alfresco and OpenCMIS. * Bridge connecting Alfresco and OpenCMIS.
* <p/> * <p/>
@@ -3183,28 +3185,34 @@ public class CMISConnector implements ApplicationContextAware, ApplicationListen
} }
} }
Set<QName> ignore = new HashSet<QName>(); Set<QName> aspectsToIgnore = new HashSet<>();
ignore.add(ContentModel.ASPECT_REFERENCEABLE); aspectsToIgnore.add(ContentModel.ASPECT_REFERENCEABLE);
ignore.add(ContentModel.ASPECT_LOCALIZED); aspectsToIgnore.add(ContentModel.ASPECT_LOCALIZED);
ignore.add(ContentModel.ASPECT_WORKING_COPY); aspectsToIgnore.add(ContentModel.ASPECT_WORKING_COPY);
Set<String> namespacesToIgnore = new HashSet<>(singletonList(NamespaceService.SYSTEM_MODEL_1_0_URI));
// aspects to add == the list of secondary types - existing aspects - ignored aspects // aspects to add == the list of secondary types - existing aspects - ignored aspects
Set<QName> toAdd = new HashSet<QName>(secondaryTypeAspects); Set<QName> toAdd = new HashSet<QName>(secondaryTypeAspects);
toAdd.removeAll(existingAspects); toAdd.removeAll(existingAspects);
toAdd.removeAll(ignore); toAdd.removeAll(aspectsToIgnore);
toAdd.removeIf(a -> namespacesToIgnore.contains(a.getNamespaceURI()));
// aspects to remove == existing aspects - secondary types // aspects to remove == existing aspects - secondary types
Set<QName> aspectsToRemove = new HashSet<QName>(); Set<QName> aspectsToRemove = new HashSet<QName>();
aspectsToRemove.addAll(existingAspects); aspectsToRemove.addAll(existingAspects);
aspectsToRemove.removeAll(ignore); aspectsToRemove.removeAll(aspectsToIgnore);
Iterator<QName> it = aspectsToRemove.iterator(); Iterator<QName> it = aspectsToRemove.iterator();
while(it.hasNext()) while(it.hasNext())
{ {
QName aspectQName = it.next(); QName aspectQName = it.next();
TypeDefinitionWrapper w = getOpenCMISDictionaryService().findNodeType(aspectQName); TypeDefinitionWrapper w = getOpenCMISDictionaryService().findNodeType(aspectQName);
if(w == null || secondaryTypeAspects.contains(aspectQName)) if(w == null || secondaryTypeAspects.contains(aspectQName) || namespacesToIgnore.contains(aspectQName.getNamespaceURI()))
{ {
// the type is not exposed or is in the secondary types to set, so remove it from the to remove set // the type is not exposed,
// or is in the secondary types to set,
// or is in the set of namespaces to ignore,
// so remove it from the "to remove" set
it.remove(); it.remove();
} }
} }

View File

@@ -1754,13 +1754,25 @@ public class CMISTest
} }
}, CmisVersion.CMIS_1_1); }, CmisVersion.CMIS_1_1);
List secondaryTypeIds = currentProperties.getProperties().get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS).getValues(); List<String> secondaryTypeIds = (List<String>) currentProperties.getProperties().get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS).getValues();
assertTrue(secondaryTypeIds.contains(aspectName)); assertTrue(secondaryTypeIds.contains(aspectName));
// We don't actually want to add these! (REPO-2926)
final Set<String> sysAspectsToAdd = new HashSet<>(Arrays.asList(
"P:sys:undeletable",
"P:sys:hidden"));
// Pre-condition of further test is that these aspects are not present
assertEquals(0, secondaryTypeIds.stream().filter(sysAspectsToAdd::contains).count());
// We also want to check that existing sys aspects aren't accidentally removed
assertTrue(secondaryTypeIds.contains("P:sys:localized"));
// Check we can remove an aspect - through its absence
secondaryTypeIds.remove(aspectName); secondaryTypeIds.remove(aspectName);
// Check that attempts to update/add sys:* aspects are ignored
secondaryTypeIds.addAll(sysAspectsToAdd);
final PropertiesImpl newProperties = new PropertiesImpl(); final PropertiesImpl newProperties = new PropertiesImpl();
newProperties.addProperty(new PropertyStringImpl(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, secondaryTypeIds)); newProperties.addProperty(new PropertyStringImpl(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, secondaryTypeIds));
final String updatedName = "My_new_name_"+UUID.randomUUID().toString(); final String updatedName = "My_new_name_"+UUID.randomUUID().toString();
newProperties.replaceProperty(new PropertyStringImpl(PropertyIds.NAME, updatedName)); newProperties.replaceProperty(new PropertyStringImpl(PropertyIds.NAME, updatedName));
@@ -1787,10 +1799,14 @@ public class CMISTest
return properties; return properties;
} }
}, CmisVersion.CMIS_1_1); }, CmisVersion.CMIS_1_1);
secondaryTypeIds = currentProperties1.getProperties().get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS).getValues(); secondaryTypeIds = (List<String>) currentProperties1.getProperties().get(PropertyIds.SECONDARY_OBJECT_TYPE_IDS).getValues();
assertFalse(secondaryTypeIds.contains(aspectName)); assertFalse(secondaryTypeIds.contains(aspectName));
assertEquals(updatedName, currentProperties1.getProperties().get(PropertyIds.NAME).getFirstValue()); assertEquals(updatedName, currentProperties1.getProperties().get(PropertyIds.NAME).getFirstValue());
// sys aspects must not be added through CMIS (REPO-2926)
assertEquals(0, secondaryTypeIds.stream().filter(sysAspectsToAdd::contains).count());
// Check pre-existing sys aspects aren't accidentally removed
assertTrue(secondaryTypeIds.contains("P:sys:localized"));
} }
/** /**