You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fg...@apache.org on 2010/01/14 15:42:00 UTC
svn commit: r899223 - in /incubator/chemistry/trunk/chemistry:
chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/
chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/
chemistry-tests/src/main/java/org/apache/chemis...
Author: fguillaume
Date: Thu Jan 14 14:41:59 2010
New Revision: 899223
URL: http://svn.apache.org/viewvc?rev=899223&view=rev
Log:
Implement AtomPub client getFolderTree using appropriate link
Modified:
incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java
incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleConnection.java
incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleListPage.java
incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java
Modified: incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java?rev=899223&r1=899222&r2=899223&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-atompub-client/src/main/java/org/apache/chemistry/atompub/client/APPConnection.java Thu Jan 14 14:41:59 2010
@@ -186,36 +186,50 @@
* ----- Navigation Services -----
*/
- /**
- * Accumulates the descendant folders into a list recursively.
- */
- protected void accumulateFolders(ObjectId folder, int depth,
- Inclusion inclusion, List<ObjectEntry> list) {
- List<ObjectEntry> children = getChildren(folder, inclusion, null,
- new Paging(Integer.MAX_VALUE, 0));
- for (ObjectEntry child : children) {
- if (child.getBaseType() != BaseType.FOLDER) {
- continue;
- }
- list.add(child);
- if (depth > 1) {
- accumulateFolders(child, depth - 1, inclusion, list);
- }
- }
- }
+ // TODO check capabilityGetDescendants / capabilityGetFolderTree
+ // and folder fall back on recursion based on getChildren
- // TODO use foldertree feed
public List<ObjectEntry> getFolderTree(ObjectId folder, int depth,
Inclusion inclusion) {
- List<ObjectEntry> list = new ArrayList<ObjectEntry>();
- accumulateFolders(folder, depth, inclusion, list);
- return list;
+ String href = getFolderEntry(folder).getLink(
+ AtomPubCMIS.LINK_FOLDER_TREE, AtomPub.MEDIA_TYPE_ATOM_FEED);
+ if (href == null) {
+ throw new CMISRuntimeException("Missing foldertree link");
+ }
+ Request req = new Request(href);
+ req.setParameter(AtomPubCMIS.PARAM_DEPTH, Integer.toString(depth));
+ if (inclusion != null) {
+ if (inclusion.properties != null) {
+ req.setParameter(AtomPubCMIS.PARAM_FILTER, inclusion.properties);
+ }
+ if (inclusion.renditions != null) {
+ req.setParameter(AtomPubCMIS.PARAM_RENDITION_FILTER,
+ inclusion.renditions);
+ }
+ if (inclusion.relationships != null) {
+ req.setParameter(
+ AtomPubCMIS.PARAM_INCLUDE_RELATIONSHIPS,
+ RelationshipDirection.toInclusion(inclusion.relationships));
+ }
+ req.setParameter(AtomPubCMIS.PARAM_INCLUDE_ALLOWABLE_ACTIONS,
+ Boolean.toString(inclusion.allowableActions));
+ }
+ Response resp = connector.get(req);
+ if (!resp.isOk()) {
+ throw new ContentManagerException(
+ "Remote server returned error code: "
+ + resp.getStatusCode());
+ }
+ return resp.getObjectFeed(new ReadContext(this));
}
public List<ObjectEntry> getDescendants(ObjectId folder, int depth,
String orderBy, Inclusion inclusion) {
String href = getFolderEntry(folder).getLink(AtomPub.LINK_DOWN,
AtomPubCMIS.MEDIA_TYPE_CMIS_TREE);
+ if (href == null) {
+ throw new CMISRuntimeException("Missing down tree link");
+ }
Request req = new Request(href);
req.setParameter(AtomPubCMIS.PARAM_DEPTH, Integer.toString(depth));
if (orderBy != null) {
Modified: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleConnection.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleConnection.java?rev=899223&r1=899222&r2=899223&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleConnection.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleConnection.java Thu Jan 14 14:41:59 2010
@@ -161,19 +161,20 @@
*/
/**
- * Accumulates the descendant folders into a list recursively.
+ * Accumulates descendants into a list recursively.
*/
- protected void accumulateFolders(ObjectId folder, int depth,
- Inclusion inclusion, List<ObjectEntry> list) {
- ListPage<ObjectEntry> children = getChildren(folder, inclusion, null,
+ // TODO optimized paging
+ protected void accumulate(ObjectId folder, int depth, Inclusion inclusion,
+ String orderBy, BaseType baseType, List<ObjectEntry> list) {
+ List<ObjectEntry> children = getChildren(folder, inclusion, orderBy,
null);
for (ObjectEntry child : children) {
- if (child.getBaseType() != BaseType.FOLDER) {
- continue;
+ BaseType childBaseType = child.getBaseType();
+ if (baseType == null || baseType == childBaseType) {
+ list.add(child);
}
- list.add(child);
- if (depth > 1) {
- accumulateFolders(child, depth - 1, inclusion, list);
+ if (childBaseType == BaseType.FOLDER && depth != 1) {
+ accumulate(child, depth - 1, inclusion, orderBy, baseType, list);
}
}
}
@@ -182,40 +183,21 @@
Inclusion inclusion) {
checkFolder(folder);
List<ObjectEntry> list = new ArrayList<ObjectEntry>();
- accumulateFolders(folder, depth, inclusion, list);
+ accumulate(folder, depth, inclusion, null, BaseType.FOLDER, list);
return list;
}
- /**
- * Accumulates the descendants into a list recursively.
- *
- * @param includeRenditions TODO
- */
- protected void accumulateDescendants(ObjectId folder, int depth,
- Inclusion inclusion, String orderBy, List<ObjectEntry> list) {
- // TODO deal with paging properly
- List<ObjectEntry> children = getChildren(folder, inclusion, orderBy,
- null);
- for (ObjectEntry child : children) {
- list.add(child);
- if (depth > 1 && child.getBaseType() == BaseType.FOLDER) {
- accumulateDescendants(child, depth - 1, inclusion, orderBy,
- list);
- }
- }
- }
-
public List<ObjectEntry> getDescendants(ObjectId folder, int depth,
String orderBy, Inclusion inclusion) {
checkFolder(folder);
List<ObjectEntry> list = new ArrayList<ObjectEntry>();
- accumulateDescendants(folder, depth, inclusion, orderBy, list);
+ accumulate(folder, depth, inclusion, orderBy, null, list);
return list;
}
public ListPage<ObjectEntry> getChildren(ObjectId folder,
Inclusion inclusion, String orderBy, Paging paging) {
- // TODO orderBy
+ // TODO orderBy, inclusion
checkFolder(folder);
Set<String> ids = repository.children.get(folder.getId());
List<ObjectEntry> all = new ArrayList<ObjectEntry>(ids.size());
@@ -223,7 +205,7 @@
SimpleData data = repository.datas.get(id);
all.add(new SimpleObjectEntry(data, this));
}
- return getListPage(all, paging);
+ return SimpleListPage.fromPaging(all, paging);
}
protected void checkFolder(ObjectId object) throws ObjectNotFoundException,
@@ -240,41 +222,6 @@
}
- /**
- * Extracts part of a list according to given paging parameters.
- *
- * @param all the complete list
- * @param paging the paging info, which may be {@code null}
- * @return the page
- */
- public static ListPage<ObjectEntry> getListPage(List<ObjectEntry> all,
- Paging paging) {
- int total = all.size();
- int fromIndex = paging == null ? 0 : paging.skipCount;
- if (fromIndex < 0 || fromIndex > total) {
- return SimpleListPage.emptyList();
- }
- int maxItems = paging == null ? -1 : paging.maxItems;
- if (maxItems <= 0) {
- maxItems = total;
- }
- int toIndex = fromIndex + maxItems;
- if (toIndex > total) {
- toIndex = total;
- }
- List<ObjectEntry> slice;
- if (fromIndex == 0 && toIndex == total) {
- slice = all;
- } else {
- slice = all.subList(fromIndex, toIndex);
- }
- SimpleListPage<ObjectEntry> page;
- page = new SimpleListPage<ObjectEntry>(slice);
- page.setHasMoreItems(toIndex < total);
- page.setNumItems(total);
- return page;
- }
-
public ObjectEntry getFolderParent(ObjectId folder, String filter) {
// TODO filter
String folderId = folder.getId();
@@ -776,7 +723,7 @@
all.add(new SimpleObjectEntry(data, this));
}
}
- return getListPage(all, paging);
+ return SimpleListPage.fromPaging(all, paging);
}
protected boolean typeMatches(String tableName, String typeId) {
Modified: incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleListPage.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleListPage.java?rev=899223&r1=899222&r2=899223&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleListPage.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-commons/src/main/java/org/apache/chemistry/impl/simple/SimpleListPage.java Thu Jan 14 14:41:59 2010
@@ -20,9 +20,12 @@
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import java.util.RandomAccess;
import org.apache.chemistry.ListPage;
+import org.apache.chemistry.ObjectEntry;
+import org.apache.chemistry.Paging;
/**
* A simple implementation of {@link ListPage} based on {@link ArrayList}.
@@ -98,6 +101,41 @@
super(collection);
}
+ /**
+ * Extracts part of a list according to given paging parameters.
+ *
+ * @param all the complete list
+ * @param paging the paging info, which may be {@code null}
+ * @return the page
+ */
+ public static ListPage<ObjectEntry> fromPaging(List<ObjectEntry> all,
+ Paging paging) {
+ int total = all.size();
+ int fromIndex = paging == null ? 0 : paging.skipCount;
+ if (fromIndex < 0 || fromIndex > total) {
+ return emptyList();
+ }
+ int maxItems = paging == null ? -1 : paging.maxItems;
+ if (maxItems <= 0) {
+ maxItems = total;
+ }
+ int toIndex = fromIndex + maxItems;
+ if (toIndex > total) {
+ toIndex = total;
+ }
+ List<ObjectEntry> slice;
+ if (fromIndex == 0 && toIndex == total) {
+ slice = all;
+ } else {
+ slice = all.subList(fromIndex, toIndex);
+ }
+ SimpleListPage<ObjectEntry> page = new SimpleListPage<ObjectEntry>(
+ slice);
+ page.setHasMoreItems(toIndex < total);
+ page.setNumItems(total);
+ return page;
+ }
+
public boolean getHasMoreItems() {
return hasMoreItems;
}
Modified: incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java?rev=899223&r1=899222&r2=899223&view=diff
==============================================================================
--- incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java (original)
+++ incubator/chemistry/trunk/chemistry/chemistry-tests/src/main/java/org/apache/chemistry/test/BasicTestCase.java Thu Jan 14 14:41:59 2010
@@ -374,6 +374,34 @@
}
}
+
+ public void testTrees() throws Exception {
+ List<ObjectEntry> list;
+
+ Folder root = conn.getRootFolder();
+ list = spi.getDescendants(root, -1, null, null);
+ assertEquals(6, list.size());
+ list = spi.getDescendants(root, 1, null, null);
+ assertEquals(1, list.size());
+ list = spi.getDescendants(root, 2, null, null);
+ assertEquals(3, list.size());
+ list = spi.getDescendants(root, 3, null, null);
+ assertEquals(6, list.size());
+ list = spi.getDescendants(root, 4, null, null);
+ assertEquals(6, list.size());
+
+ ObjectEntry fold1 = spi.getObjectByPath("/folder 1", null);
+ list = spi.getDescendants(fold1, -1, null, null);
+ assertEquals(5, list.size());
+ list = spi.getDescendants(fold1, 1, null, null);
+ assertEquals(2, list.size());
+ list = spi.getDescendants(fold1, 2, null, null);
+ assertEquals(5, list.size());
+ list = spi.getDescendants(fold1, 3, null, null);
+ assertEquals(5, list.size());
+ }
+
+
public void testGetFolderParent() {
Folder root = conn.getRootFolder();
assertNull(spi.getFolderParent(root, null));