You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2010/03/03 09:11:02 UTC
svn commit: r918361 - in
/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src:
main/java/org/apache/opencmis/inmemory/
main/java/org/apache/opencmis/inmemory/server/
test/java/org/apache/opencmis/inmemory/
Author: jens
Date: Wed Mar 3 08:11:02 2010
New Revision: 918361
URL: http://svn.apache.org/viewvc?rev=918361&view=rev
Log:
InMemoryProvider: Fix an issue with the hierarchy structure in getTypesDescendants
Modified:
incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/TypeManager.java
incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java
incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/RepositoryServiceTest.java
Modified: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/TypeManager.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/TypeManager.java?rev=918361&r1=918360&r2=918361&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/TypeManager.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/TypeManager.java Wed Mar 3 08:11:02 2010
@@ -69,7 +69,15 @@
* @return
*/
public synchronized Collection<TypeDefinitionContainer> getTypeDefinitionList() {
- return fTypesMap.values();
+
+ List<TypeDefinitionContainer> typeRoots = new ArrayList<TypeDefinitionContainer>();
+ // iterate types map and return a list collecting the root types:
+ for (TypeDefinitionContainer typeDef : fTypesMap.values()) {
+ if (typeDef.getTypeDefinition().getParentId()==null)
+ typeRoots.add(typeDef);
+ }
+
+ return typeRoots;
}
/**
Modified: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java?rev=918361&r1=918360&r2=918361&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/main/java/org/apache/opencmis/inmemory/server/InMemoryRepositoryServiceImpl.java Wed Mar 3 08:11:02 2010
@@ -134,55 +134,61 @@
// spec says that depth must be ignored in this case
Collection<TypeDefinitionContainer> typeColl = fStoreManager.getTypeDefinitionList(repositoryId);
result = new ArrayList<TypeDefinitionContainer>(typeColl);
+ if (!includePropertyDefinitions) {
+ // copy list and omit properties
+ for (TypeDefinitionContainer c : result) {
+ AbstractTypeDefinition td = ((AbstractTypeDefinition)c.getTypeDefinition()).clone();
+ TypeDefinitionContainerImpl tdc = new TypeDefinitionContainerImpl(td);
+ tdc.setChildren(c.getChildren());
+ td.setPropertyDefinitions(null);
+ }
+ }
}
else {
TypeDefinitionContainer tc = fStoreManager.getTypeById(repositoryId, typeId);
if (tc != null) {
- if (null==depth || depth.intValue() == -1)
+ if (null==depth || depth.intValue() == -1) {
result = tc.getChildren();
+ if (!includePropertyDefinitions)
+ cloneTypeList(depth.intValue()-1, false, result);
+ } else if (depth.intValue() == 0 || depth.intValue() < -1)
+ throw new CmisInvalidArgumentException("illegal depth value: " + depth.intValue());
else {
- result = getLimitedChildrenTypeList(depth.intValue(), tc.getChildren());
+ result = tc.getChildren();
+ cloneTypeList(depth.intValue()-1, includePropertyDefinitions, result);
}
}
else
throw new CmisInvalidArgumentException("unknown type id: " + typeId);
}
- if (!includePropertyDefinitions) {
- // copy list and omit properties
- List<TypeDefinitionContainer> newResult = new ArrayList<TypeDefinitionContainer>(result.size());
- for (TypeDefinitionContainer c : result) {
- AbstractTypeDefinition td = ((AbstractTypeDefinition)c.getTypeDefinition()).clone();
- TypeDefinitionContainerImpl tdc = new TypeDefinitionContainerImpl(td);
- tdc.setChildren(c.getChildren());
- td.setPropertyDefinitions(null);
- newResult.add(tdc);
- }
- result = newResult;
- }
return result;
}
- private List<TypeDefinitionContainer> getLimitedChildrenTypeList(int depth,
+ /**
+ * traverse tree and replace each need node with a clone. remove properties on
+ * clone if requested, cut children of clone if depth is exceeded.
+ * @param depth
+ * @param types
+ */
+ private void cloneTypeList(int depth, boolean includePropertyDefinitions,
List<TypeDefinitionContainer> types) {
- List<TypeDefinitionContainer> result = new ArrayList<TypeDefinitionContainer>();
-
- for (TypeDefinitionContainer type : types) {
- result.addAll(getLimitedChildrenTypeList(depth, type));
- }
- return result;
- }
-
- private List<TypeDefinitionContainer> getLimitedChildrenTypeList(int depth,
- TypeDefinitionContainer root) {
- List<TypeDefinitionContainer> typeDescs = new ArrayList<TypeDefinitionContainer>();
- if (depth > 0 && root != null) {
- typeDescs.add(root);
- for (TypeDefinitionContainer c : root.getChildren()) {
- typeDescs.addAll(getLimitedChildrenTypeList(depth - 1, c));
+
+ ListIterator<TypeDefinitionContainer> it = types.listIterator();
+ while (it.hasNext()) {
+ TypeDefinitionContainer tdc = it.next();
+ AbstractTypeDefinition td = ((AbstractTypeDefinition)tdc.getTypeDefinition()).clone();
+ if (!includePropertyDefinitions)
+ td.setPropertyDefinitions(null);
+ TypeDefinitionContainerImpl tdcClone = new TypeDefinitionContainerImpl(td);
+ if (depth > 0) {
+ ArrayList<TypeDefinitionContainer> children = new ArrayList<TypeDefinitionContainer>(tdc.getChildren().size());
+ children.addAll(tdc.getChildren());
+ tdcClone.setChildren(children);
+ cloneTypeList(depth-1, includePropertyDefinitions, children);
}
+ it.set(tdcClone);
}
- return typeDescs;
}
private RepositoryInfoData getRepositoryInfoFromStoreManager(String repositoryId ) {
Modified: incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/RepositoryServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/RepositoryServiceTest.java?rev=918361&r1=918360&r2=918361&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/RepositoryServiceTest.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-server/opencmis-server-inmemory/src/test/java/org/apache/opencmis/inmemory/RepositoryServiceTest.java Wed Mar 3 08:11:02 2010
@@ -174,10 +174,15 @@
repositoryId, null/* all types */, BigInteger.valueOf(-1), Boolean.TRUE, null);
assertNotNull(types);
log.info("Repository " + repositoryId + " contains " + types.size() + " type(s).");
+
+
// check that we got all types
int expectedSize = RepositoryTestTypeSystemCreator.getTypesList().size()
+ DocumentTypeCreationHelper.getDefaultTypes().size();
- assertEquals(expectedSize, types.size());
+ int totalSize = getRecursiveSize(types);
+
+ assertEquals(expectedSize, totalSize);
+ assertEquals(2, types.size());
for (TypeDefinitionContainer type : types) {
assertNotNull(type);
@@ -203,9 +208,9 @@
String repositoryId = getRepositoryId();
// get types
- int depth = 2;
+ int depth = 1;
List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(
- repositoryId, null/* all types */, BigInteger.valueOf(depth), Boolean.TRUE, null);
+ repositoryId, BaseObjectTypeIds.CMIS_DOCUMENT.value(), BigInteger.valueOf(depth), Boolean.TRUE, null);
assertNotNull(types);
log.info("Found in repository " + repositoryId + " " + types.size() + " type(s) with depth "
+ depth + ".");
@@ -218,15 +223,15 @@
containsAllBasePropertyDefinitions(typeDef);
}
- assertEquals(21, types.size()); // Note that spec says that has to be ignored if type is null.
- assertTrue(containsTypeById(BaseObjectTypeIds.CMIS_DOCUMENT.value(), types));
- assertTrue(containsTypeById(BaseObjectTypeIds.CMIS_FOLDER.value(), types));
- // Commented out, because spec requires not to deliver these types if policies and relations
- // are not supported
-// assertTrue(containsTypeById(BaseObjectTypeIds.CMIS_RELATIONSHIP.value(), types));
-// assertTrue(containsTypeById(BaseObjectTypeIds.CMIS_POLICY.value(), types));
- assertTrue(containsTypeById("MyDocType1", types));
- assertTrue(containsTypeById("MyDocType2", types));
+ int totalSize = getRecursiveSize(types);
+ assertEquals(4, totalSize); // all RepositoryTestTypeSystemCreator types minus one in level two plus cmis.docment
+ assertFalse(containsTypeByIdRecursive(BaseObjectTypeIds.CMIS_DOCUMENT.value(), types));
+ assertFalse(containsTypeByIdRecursive(BaseObjectTypeIds.CMIS_FOLDER.value(), types));
+
+ assertTrue(containsTypeByIdRecursive("MyDocType1", types));
+ assertTrue(containsTypeByIdRecursive("MyDocType2", types));
+
+ assertFalse(containsTypeByIdRecursive(RepositoryTestTypeSystemCreator.LEVEL2_TYPE, types));
for (TypeDefinitionContainer type : types) {
assertNotNull(type);
@@ -254,12 +259,11 @@
log.info("Found in repository " + repositoryId + " for type " + typeId + ", " + types.size()
+ " type(s) with depth " + depth + ".");
- assertEquals(4, types.size());
- assertTrue(containsTypeById("MyDocType1.1", types));
- assertTrue(containsTypeById("MyDocType1.1.1", types));
- assertTrue(containsTypeById("MyDocType1.1.2", types));
- assertTrue(containsTypeById("MyDocType1.2", types));
-
+ assertEquals(4, getRecursiveSize(types));
+ assertTrue(containsTypeByIdRecursive("MyDocType1.1", types));
+ assertTrue(containsTypeByIdRecursive("MyDocType1.2", types));
+ assertTrue(containsTypeByIdRecursive("MyDocType1.1.1", types));
+ assertTrue(containsTypeByIdRecursive("MyDocType1.1.2", types));
for (TypeDefinitionContainer type : types) {
assertNotNull(type);
TypeDefinition typeDef = type.getTypeDefinition();
@@ -493,6 +497,25 @@
return false;
}
+ private boolean containsTypeByIdRecursive(String typeId, List<TypeDefinitionContainer> types) {
+ for (TypeDefinitionContainer type : types) {
+ if (containsTypeByIdRecursive(typeId, type))
+ return true;
+ }
+ return false;
+ }
+
+ private boolean containsTypeByIdRecursive(String typeId, TypeDefinitionContainer typeContainer) {
+ if (typeId.equals(typeContainer.getTypeDefinition().getId()))
+ return true;
+
+ for (TypeDefinitionContainer type : typeContainer.getChildren()) {
+ if (containsTypeByIdRecursive(typeId, type))
+ return true;
+ }
+ return false;
+ }
+
private void containsAllBasePropertyDefinitions(TypeDefinition typeDef) {
Map<String, PropertyDefinition<?>> propDefs = typeDef.getPropertyDefinitions();
String baseTypeId = typeDef.getBaseId().value();
@@ -536,6 +559,17 @@
fail("Unknown base type id in type definition");
}
+ private int getRecursiveSize(List<TypeDefinitionContainer> types) {
+ if (null == types)
+ return 0;
+
+ int size = types.size();
+ for (TypeDefinitionContainer type: types)
+ size += getRecursiveSize(type.getChildren());
+
+ return size;
+ }
+
public static class RepositoryTestTypeSystemCreator implements TypeCreator {
public static final String COMPLEX_TYPE = "ComplexType";