You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2010/03/02 15:44:36 UTC

svn commit: r918057 - in /incubator/chemistry/trunk/opencmis/opencmis-client: opencmis-client-api/src/main/java/org/apache/opencmis/client/api/ opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ opencmis-client-impl/src/main/j...

Author: fmui
Date: Tue Mar  2 14:44:35 2010
New Revision: 918057

URL: http://svn.apache.org/viewvc?rev=918057&view=rev
Log:
improved PagingList
implemented getChildren

Modified:
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/Folder.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ObjectFactory.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/AbstractPersistentCmisObject.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentFolderImpl.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentSessionImpl.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/SessionUtil.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/util/AbstractPagingList.java
    incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/util/PagingListTest.java

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/Folder.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/Folder.java?rev=918057&r1=918056&r2=918057&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/Folder.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/Folder.java Tue Mar  2 14:44:35 2010
@@ -62,7 +62,7 @@
 
   List<Container<FileableCmisObject>> getDescendants(int depth);
 
-  PagingList<CmisObject> getChildren(String orderby, int itemsPerPage);
+  PagingList<CmisObject> getChildren(String orderBy, int itemsPerPage);
 
   Folder getFolderParent();
 

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ObjectFactory.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ObjectFactory.java?rev=918057&r1=918056&r2=918057&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ObjectFactory.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-api/src/main/java/org/apache/opencmis/client/api/repository/ObjectFactory.java Tue Mar  2 14:44:35 2010
@@ -25,6 +25,7 @@
 import org.apache.opencmis.client.api.Ace;
 import org.apache.opencmis.client.api.Acl;
 import org.apache.opencmis.client.api.AllowableActions;
+import org.apache.opencmis.client.api.CmisObject;
 import org.apache.opencmis.client.api.ContentStream;
 import org.apache.opencmis.client.api.Document;
 import org.apache.opencmis.client.api.Folder;
@@ -32,6 +33,7 @@
 import org.apache.opencmis.client.api.Property;
 import org.apache.opencmis.client.api.Relationship;
 import org.apache.opencmis.commons.enums.VersioningState;
+import org.apache.opencmis.commons.provider.ObjectData;
 
 /**
  * A factory to create CMIS objects.
@@ -40,38 +42,37 @@
  */
 public interface ObjectFactory {
 
-	// object factory
+  // object factory
 
   AllowableActions createAllowableAction(Map<String, Boolean> actions);
-  
-	Ace createAce(String principal, List<String> permissions, boolean isDirect);
 
-	Acl createAcl(List<Ace> aces, Boolean isExact);
+  Ace createAce(String principal, List<String> permissions, boolean isDirect);
 
-	ContentStream createContentStream(int length, String mimetype,
-			String filename, InputStream stream);
+  Acl createAcl(List<Ace> aces, Boolean isExact);
 
-	// object service
+  ContentStream createContentStream(int length, String mimetype, String filename, InputStream stream);
 
-	// shortcut
-	Document createDocument(Folder parentfolder, String name);
+  // object service
 
-	Document createDocument(List<Property<?>> properties, Folder parentfolder,
-			ContentStream contentstream, VersioningState versioningState,
-			List<Policy> policies, List<Ace> addACEs, List<Ace> removeACEs);
+  // shortcut
+  Document createDocument(Folder parentfolder, String name);
 
-	Document createDocumentFromSource(Document source,
-			List<Property<?>> properties, Folder parentfolder,
-			VersioningState versioningState, List<Policy> policies,
-			List<Ace> addACEs, List<Ace> removeACEs);
+  Document createDocument(List<Property<?>> properties, Folder parentfolder,
+      ContentStream contentstream, VersioningState versioningState, List<Policy> policies,
+      List<Ace> addACEs, List<Ace> removeACEs);
 
-	Relationship createRelationship(List<Property<?>> properties,
-			List<Policy> policies, List<Ace> addACEs, List<Ace> removeACEs);
+  Document createDocumentFromSource(Document source, List<Property<?>> properties,
+      Folder parentfolder, VersioningState versioningState, List<Policy> policies,
+      List<Ace> addACEs, List<Ace> removeACEs);
 
-	Policy createPolicy(List<Property<?>> properties, Folder parentfolder,
-			List<Policy> policies, List<Ace> addACEs, List<Ace> removeACEs);
+  Relationship createRelationship(List<Property<?>> properties, List<Policy> policies,
+      List<Ace> addACEs, List<Ace> removeACEs);
 
-	Folder createFolder(Folder parent, List<Property<?>> properties,
-			List<Policy> policies, List<Ace> addACEs, List<Ace> removeACEs);
+  Policy createPolicy(List<Property<?>> properties, Folder parentfolder, List<Policy> policies,
+      List<Ace> addACEs, List<Ace> removeACEs);
 
+  Folder createFolder(Folder parent, List<Property<?>> properties, List<Policy> policies,
+      List<Ace> addACEs, List<Ace> removeACEs);
+
+  CmisObject convertObject(ObjectData objectData);
 }

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/AbstractPersistentCmisObject.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/AbstractPersistentCmisObject.java?rev=918057&r1=918056&r2=918057&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/AbstractPersistentCmisObject.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/AbstractPersistentCmisObject.java Tue Mar  2 14:44:35 2010
@@ -47,8 +47,6 @@
 import org.apache.opencmis.commons.provider.Holder;
 import org.apache.opencmis.commons.provider.ObjectData;
 import org.apache.opencmis.commons.provider.ObjectList;
-import org.apache.opencmis.commons.provider.PropertyData;
-import org.apache.opencmis.commons.provider.PropertyIdData;
 import org.apache.opencmis.commons.provider.RelationshipService;
 
 /**
@@ -119,8 +117,8 @@
       if (objectData.getRelationships() != null) {
         relationships = new ArrayList<Relationship>();
         for (ObjectData rod : objectData.getRelationships()) {
-          relationships.add(new PersistentRelationshipImpl(getSession(),
-              getTypeFromObjectData(rod), rod));
+          relationships.add(new PersistentRelationshipImpl(getSession(), SessionUtil
+              .getTypeFromObjectData(getSession(), rod), rod));
         }
       }
     }
@@ -166,25 +164,6 @@
     return objectId;
   }
 
-  /**
-   * Extracts the type information from the given object data and returns the object type or
-   * <code>null</code> if there is no type information.
-   */
-  private ObjectType getTypeFromObjectData(ObjectData objectData) {
-    if ((objectData == null) || (objectData.getProperties() == null)
-        || (objectData.getProperties().getProperties() == null)) {
-      return null;
-    }
-
-    PropertyData<?> typeProperty = objectData.getProperties().getProperties().get(
-        PropertyIds.CMIS_OBJECT_TYPE_ID);
-    if (!(typeProperty instanceof PropertyIdData)) {
-      return null;
-    }
-
-    return getSession().getTypeDefinition((String) typeProperty.getFirstValue());
-  }
-
   // --- operations ---
 
   /*
@@ -633,7 +612,7 @@
     return new AbstractPagingList<Relationship>() {
 
       @Override
-      protected List<Relationship> fetchPage(int pageNumber) {
+      protected FetchResult fetchPage(int pageNumber) {
         int skipCount = pageNumber * getMaxItemsPerPage();
 
         // fetch the relationships
@@ -642,24 +621,16 @@
             includeAllowableActions, BigInteger.valueOf(getMaxItemsPerPage()), BigInteger
                 .valueOf(skipCount), null);
 
-        // set num items
-        if (relList.getNumItems() != null) {
-          setNumItems(relList.getNumItems().intValue());
-        }
-        else {
-          setNumItems(-1);
-        }
-
         // convert relationship objects
-        List<Relationship> result = new ArrayList<Relationship>();
+        List<Relationship> page = new ArrayList<Relationship>();
         if (relList.getObjects() != null) {
           for (ObjectData rod : relList.getObjects()) {
-            result
-                .add(new PersistentRelationshipImpl(getSession(), getTypeFromObjectData(rod), rod));
+            page.add(new PersistentRelationshipImpl(getSession(), SessionUtil
+                .getTypeFromObjectData(getSession(), rod), rod));
           }
         }
 
-        return result;
+        return new FetchResult(page, relList.getNumItems(), relList.hasMoreItems());
       }
 
       @Override

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentFolderImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentFolderImpl.java?rev=918057&r1=918056&r2=918057&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentFolderImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentFolderImpl.java Tue Mar  2 14:44:35 2010
@@ -32,9 +32,12 @@
 import org.apache.opencmis.client.api.Folder;
 import org.apache.opencmis.client.api.Policy;
 import org.apache.opencmis.client.api.Property;
+import org.apache.opencmis.client.api.SessionContext;
 import org.apache.opencmis.client.api.objecttype.ObjectType;
+import org.apache.opencmis.client.api.repository.ObjectFactory;
 import org.apache.opencmis.client.api.util.Container;
 import org.apache.opencmis.client.api.util.PagingList;
+import org.apache.opencmis.client.runtime.util.AbstractPagingList;
 import org.apache.opencmis.commons.PropertyIds;
 import org.apache.opencmis.commons.enums.IncludeRelationships;
 import org.apache.opencmis.commons.enums.UnfileObjects;
@@ -42,7 +45,10 @@
 import org.apache.opencmis.commons.exceptions.CmisRuntimeException;
 import org.apache.opencmis.commons.provider.AccessControlList;
 import org.apache.opencmis.commons.provider.FailedToDeleteData;
+import org.apache.opencmis.commons.provider.NavigationService;
 import org.apache.opencmis.commons.provider.ObjectData;
+import org.apache.opencmis.commons.provider.ObjectInFolderData;
+import org.apache.opencmis.commons.provider.ObjectInFolderList;
 import org.apache.opencmis.commons.provider.PropertiesData;
 import org.apache.opencmis.commons.provider.PropertyData;
 import org.apache.opencmis.commons.provider.ProviderObjectFactory;
@@ -113,8 +119,50 @@
     throw new CmisRuntimeException("not implemented");
   }
 
-  public PagingList<CmisObject> getChildren(String orderby, int itemsPerPage) {
-    throw new CmisRuntimeException("not implemented");
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.apache.opencmis.client.api.Folder#getChildren(java.lang.String, int)
+   */
+  public PagingList<CmisObject> getChildren(final String orderBy, final int itemsPerPage) {
+    if (itemsPerPage < 1) {
+      throw new IllegalArgumentException("itemsPerPage must be > 0!");
+    }
+
+    final String objectId = getObjectId();
+    final SessionContext context = getSession().getContext();
+    final NavigationService navigationService = getProvider().getNavigationService();
+    final ObjectFactory objectFactory = getSession().getObjectFactory();
+
+    return new AbstractPagingList<CmisObject>() {
+
+      @Override
+      protected FetchResult fetchPage(int pageNumber) {
+        int skipCount = pageNumber * getMaxItemsPerPage();
+
+        // get the children
+        ObjectInFolderList children = navigationService.getChildren(getRepositoryId(), objectId,
+            context.getIncludeProperties(), orderBy, context.getIncludeAllowableActions(), context
+                .getIncludeRelationships(), context.getIncludeRenditions(), context
+                .getIncludePathSegments(), BigInteger.valueOf(getMaxItemsPerPage()), BigInteger
+                .valueOf(skipCount), null);
+
+        // convert objects
+        List<CmisObject> page = new ArrayList<CmisObject>();
+        for (ObjectInFolderData objectData : children.getObjects()) {
+          if (objectData.getObject() != null) {
+            page.add(objectFactory.convertObject(objectData.getObject()));
+          }
+        }
+
+        return new FetchResult(page, children.getNumItems(), children.hasMoreItems());
+      }
+
+      @Override
+      public int getMaxItemsPerPage() {
+        return itemsPerPage;
+      }
+    };
   }
 
   public List<Container<FileableCmisObject>> getFolderTree(int depth) {
@@ -126,7 +174,13 @@
   }
 
   public Folder getFolderParent() {
-    throw new CmisRuntimeException("not implemented");
+    List<Folder> parents = getParents();
+
+    if ((parents == null) || (parents.isEmpty())) {
+      return null;
+    }
+
+    return parents.get(0);
   }
 
   public String getPath() {

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentSessionImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentSessionImpl.java?rev=918057&r1=918056&r2=918057&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentSessionImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/PersistentSessionImpl.java Tue Mar  2 14:44:35 2010
@@ -67,8 +67,6 @@
 import org.apache.opencmis.commons.impl.dataobjects.PropertyStringDefinitionImpl;
 import org.apache.opencmis.commons.provider.CmisProvider;
 import org.apache.opencmis.commons.provider.ObjectData;
-import org.apache.opencmis.commons.provider.PropertyData;
-import org.apache.opencmis.commons.provider.PropertyIdData;
 import org.apache.opencmis.commons.provider.RepositoryService;
 import org.apache.opencmis.util.repository.ObjectGenerator;
 
@@ -259,21 +257,7 @@
           includeAllowableActions, includeRelationships, renditionFilter, includePolicyIds,
           includeAcl, extension);
 
-      /* determine type */
-      switch (od.getBaseTypeId()) {
-      case CMIS_DOCUMENT:
-        obj = new PersistentDocumentImpl(this, getType(od), od);
-        break;
-      case CMIS_FOLDER:
-        obj = new PersistentFolderImpl(this, getType(od), od);
-        break;
-      case CMIS_POLICY:
-        obj = new PersistentPolicyImpl(this, getType(od), od);
-      case CMIS_RELATIONSHIP:
-        obj = new PersistentRelationshipImpl(this, getType(od), od);
-      default:
-        throw new CmisRuntimeException("unsupported type: " + od.getBaseTypeId());
-      }
+      obj = getObjectFactory().convertObject(od);
 
       this.cache.put(obj);
     }
@@ -314,7 +298,8 @@
       ObjectData od = this.provider.getObjectService().getObject(repositoryId, rootFolderId, null,
           false, IncludeRelationships.NONE, null, false, false, null);
 
-      rootFolder = new PersistentFolderImpl(this, getType(od), od);
+      ObjectType type = SessionUtil.getTypeFromObjectData(this, od);
+      rootFolder = new PersistentFolderImpl(this, type, od);
       this.cache.put(rootFolder);
     }
 
@@ -339,7 +324,7 @@
     return new AbstractPagingList<ObjectType>() {
 
       @Override
-      protected List<ObjectType> fetchPage(int pageNumber) {
+      protected FetchResult fetchPage(int pageNumber) {
         int skipCount = pageNumber * getMaxItemsPerPage();
 
         // fetch the data
@@ -347,21 +332,13 @@
             includePropertyDefinitions, BigInteger.valueOf(getMaxItemsPerPage()), BigInteger
                 .valueOf(skipCount), null);
 
-        // set num items
-        if (tdl.getNumItems() != null) {
-          setNumItems(tdl.getNumItems().intValue());
-        }
-        else {
-          setNumItems(-1);
-        }
-
         // convert type definitions
-        List<ObjectType> result = new ArrayList<ObjectType>(tdl.getList().size());
+        List<ObjectType> page = new ArrayList<ObjectType>(tdl.getList().size());
         for (TypeDefinition typeDefinition : tdl.getList()) {
-          result.add(SessionUtil.convertTypeDefinition(thisSession, typeDefinition));
+          page.add(SessionUtil.convertTypeDefinition(thisSession, typeDefinition));
         }
 
-        return result;
+        return new FetchResult(page, tdl.getNumItems(), tdl.hasMoreItems());
       }
 
       @Override
@@ -561,21 +538,4 @@
   public String getRepositoryId() {
     return this.getRepositoryInfo().getId();
   }
-
-  // --- internal ---
-
-  private ObjectType getType(ObjectData objectData) {
-    if ((objectData == null) || (objectData.getProperties() == null)
-        || (objectData.getProperties().getProperties() == null)) {
-      return null;
-    }
-
-    PropertyData<?> typeProperty = objectData.getProperties().getProperties().get(
-        PropertyIds.CMIS_OBJECT_TYPE_ID);
-    if (!(typeProperty instanceof PropertyIdData)) {
-      return null;
-    }
-
-    return getTypeDefinition((String) typeProperty.getFirstValue());
-  }
 }

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/SessionUtil.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/SessionUtil.java?rev=918057&r1=918056&r2=918057&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/SessionUtil.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/SessionUtil.java Tue Mar  2 14:44:35 2010
@@ -38,6 +38,7 @@
 import org.apache.opencmis.client.runtime.objecttype.FolderTypeImpl;
 import org.apache.opencmis.client.runtime.objecttype.PolicyTypeImpl;
 import org.apache.opencmis.client.runtime.objecttype.RelationshipTypeImpl;
+import org.apache.opencmis.commons.PropertyIds;
 import org.apache.opencmis.commons.api.DocumentTypeDefinition;
 import org.apache.opencmis.commons.api.FolderTypeDefinition;
 import org.apache.opencmis.commons.api.PolicyTypeDefinition;
@@ -56,8 +57,10 @@
 import org.apache.opencmis.commons.provider.AccessControlEntry;
 import org.apache.opencmis.commons.provider.AccessControlList;
 import org.apache.opencmis.commons.provider.AllowableActionsData;
+import org.apache.opencmis.commons.provider.ObjectData;
 import org.apache.opencmis.commons.provider.PropertiesData;
 import org.apache.opencmis.commons.provider.PropertyData;
+import org.apache.opencmis.commons.provider.PropertyIdData;
 import org.apache.opencmis.commons.provider.ProviderObjectFactory;
 
 /**
@@ -269,4 +272,23 @@
 
     return of.createAcl(aces, acl.isExact());
   }
+
+  /**
+   * Extracts the type information from the given object data and returns the object type or
+   * <code>null</code> if there is no type information.
+   */
+  public static ObjectType getTypeFromObjectData(Session session, ObjectData objectData) {
+    if ((objectData == null) || (objectData.getProperties() == null)
+        || (objectData.getProperties().getProperties() == null)) {
+      return null;
+    }
+
+    PropertyData<?> typeProperty = objectData.getProperties().getProperties().get(
+        PropertyIds.CMIS_OBJECT_TYPE_ID);
+    if (!(typeProperty instanceof PropertyIdData)) {
+      return null;
+    }
+
+    return session.getTypeDefinition((String) typeProperty.getFirstValue());
+  }
 }

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java?rev=918057&r1=918056&r2=918057&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/repository/PersistentObjectFactoryImpl.java Tue Mar  2 14:44:35 2010
@@ -25,20 +25,27 @@
 import org.apache.opencmis.client.api.Ace;
 import org.apache.opencmis.client.api.Acl;
 import org.apache.opencmis.client.api.AllowableActions;
+import org.apache.opencmis.client.api.CmisObject;
 import org.apache.opencmis.client.api.ContentStream;
 import org.apache.opencmis.client.api.Document;
 import org.apache.opencmis.client.api.Folder;
 import org.apache.opencmis.client.api.Policy;
 import org.apache.opencmis.client.api.Property;
 import org.apache.opencmis.client.api.Relationship;
+import org.apache.opencmis.client.api.objecttype.ObjectType;
 import org.apache.opencmis.client.api.repository.ObjectFactory;
 import org.apache.opencmis.client.runtime.AceImpl;
 import org.apache.opencmis.client.runtime.AclImpl;
 import org.apache.opencmis.client.runtime.AllowableActionsImpl;
+import org.apache.opencmis.client.runtime.PersistentDocumentImpl;
 import org.apache.opencmis.client.runtime.PersistentFolderImpl;
+import org.apache.opencmis.client.runtime.PersistentPolicyImpl;
+import org.apache.opencmis.client.runtime.PersistentRelationshipImpl;
 import org.apache.opencmis.client.runtime.PersistentSessionImpl;
+import org.apache.opencmis.client.runtime.SessionUtil;
 import org.apache.opencmis.commons.enums.VersioningState;
 import org.apache.opencmis.commons.exceptions.CmisRuntimeException;
+import org.apache.opencmis.commons.provider.ObjectData;
 
 public class PersistentObjectFactoryImpl implements ObjectFactory {
 
@@ -106,4 +113,29 @@
       List<Ace> addACEs, List<Ace> removeACEs) {
     throw new CmisRuntimeException("not implemented");
   }
+
+  /**
+   * Converts object data into an API object.
+   */
+  public CmisObject convertObject(ObjectData objectData) {
+    if (objectData == null) {
+      throw new IllegalArgumentException("Object data is null!");
+    }
+
+    ObjectType type = SessionUtil.getTypeFromObjectData(this.session, objectData);
+
+    /* determine type */
+    switch (objectData.getBaseTypeId()) {
+    case CMIS_DOCUMENT:
+      return new PersistentDocumentImpl(this.session, type, objectData);
+    case CMIS_FOLDER:
+      return new PersistentFolderImpl(this.session, type, objectData);
+    case CMIS_POLICY:
+      return new PersistentPolicyImpl(this.session, type, objectData);
+    case CMIS_RELATIONSHIP:
+      return new PersistentRelationshipImpl(this.session, type, objectData);
+    default:
+      throw new CmisRuntimeException("unsupported type: " + objectData.getBaseTypeId());
+    }
+  }
 }

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/util/AbstractPagingList.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/util/AbstractPagingList.java?rev=918057&r1=918056&r2=918057&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/util/AbstractPagingList.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/main/java/org/apache/opencmis/client/runtime/util/AbstractPagingList.java Tue Mar  2 14:44:35 2010
@@ -18,6 +18,7 @@
  */
 package org.apache.opencmis.client.runtime.util;
 
+import java.math.BigInteger;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -30,12 +31,12 @@
  */
 public abstract class AbstractPagingList<T> implements PagingList<T> {
 
-  // number of item is unknown before the fist fetch
+  // number of item is unknown before the first fetch
   private int numItems = -1;
 
   // cache is disabled by default
   private int cacheSize = 0;
-  private LinkedHashMap<Integer, List<T>> cache = null;
+  private LinkedHashMap<Integer, FetchResult> cache = null;
 
   /**
    * Initializes the cache.
@@ -47,11 +48,11 @@
     this.cacheSize = cacheSize;
 
     if (cacheSize > 0) {
-      cache = new LinkedHashMap<Integer, List<T>>(cacheSize + 1, 0.70f, true) {
+      cache = new LinkedHashMap<Integer, FetchResult>(cacheSize + 1, 0.70f, true) {
         private static final long serialVersionUID = 1L;
 
         @Override
-        public boolean removeEldestEntry(Map.Entry<Integer, List<T>> eldest) {
+        public boolean removeEldestEntry(Map.Entry<Integer, FetchResult> eldest) {
           return size() > cacheSize;
         }
       };
@@ -64,11 +65,19 @@
    * @see org.apache.opencmis.client.api.util.PagingList#get(int)
    */
   public List<T> get(int pageNumber) {
+    FetchResult fr = getInternal(pageNumber);
+    return (fr == null ? null : fr.getPage());
+  }
+
+  /**
+   * Retrieves a page or gets it from cache.
+   */
+  protected FetchResult getInternal(int pageNumber) {
     if (pageNumber < 0) {
       throw new IllegalArgumentException("pageNumber must be >= 0!");
     }
 
-    List<T> result = null;
+    FetchResult result = null;
 
     if (cacheSize > 0) {
       result = cache.get(pageNumber);
@@ -79,6 +88,16 @@
     }
     else {
       result = fetchPage(pageNumber);
+
+      // set number of items
+      if (result != null) {
+        if (result.getNumItems() != null) {
+          setNumItems(result.getNumItems().intValue());
+        }
+        else {
+          setNumItems(-1);
+        }
+      }
     }
 
     return result;
@@ -94,7 +113,7 @@
   }
 
   /**
-   * Sets the number of items. Should be updated by {@link #fetchPage(int)}.
+   * Sets the number of items.
    */
   protected void setNumItems(int numItems) {
     this.numItems = numItems;
@@ -139,7 +158,36 @@
    * @param pageNumber
    *          number of the page (>= 0).
    */
-  protected abstract List<T> fetchPage(int pageNumber);
+  protected abstract FetchResult fetchPage(int pageNumber);
+
+  // --- fetch result class ---
+
+  /**
+   * Fetch result.
+   */
+  protected class FetchResult {
+    private List<T> page;
+    private BigInteger numItems;
+    private Boolean hasMoreItems;
+
+    public FetchResult(List<T> page, BigInteger numItems, Boolean hasMoreItems) {
+      this.page = page;
+      this.numItems = numItems;
+      this.hasMoreItems = hasMoreItems;
+    }
+
+    public List<T> getPage() {
+      return page;
+    }
+
+    public BigInteger getNumItems() {
+      return numItems;
+    }
+
+    public Boolean getHasMoreItems() {
+      return hasMoreItems;
+    }
+  }
 
   // --- iterator class ---
 
@@ -149,11 +197,10 @@
   class PageIterator implements Iterator<List<T>> {
 
     private int currentPage = -1;
-    private boolean lastPageEmpty = false;
+    private boolean hasMoreItems = true;
 
     public boolean hasNext() {
-      if (lastPageEmpty) {
-        // the last page was empty, so we don't expect the next page will have items
+      if (!hasMoreItems) {
         return false;
       }
 
@@ -168,13 +215,22 @@
 
     public List<T> next() {
       currentPage++;
-      List<T> next = get(currentPage);
+      FetchResult next = getInternal(currentPage);
+
+      if (next == null) {
+        hasMoreItems = false;
+        return null;
+      }
+
+      if ((next.getPage() == null) || (next.getPage().isEmpty())) {
+        hasMoreItems = false;
+      }
 
-      if ((next == null) || (next.isEmpty())) {
-        lastPageEmpty = true;
+      if (next.getHasMoreItems() != null) {
+        hasMoreItems = next.getHasMoreItems().booleanValue();
       }
 
-      return next;
+      return (next == null ? null : next.getPage());
     }
 
     public void remove() {

Modified: incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/util/PagingListTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/util/PagingListTest.java?rev=918057&r1=918056&r2=918057&view=diff
==============================================================================
--- incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/util/PagingListTest.java (original)
+++ incubator/chemistry/trunk/opencmis/opencmis-client/opencmis-client-impl/src/test/java/org/apache/opencmis/client/runtime/util/PagingListTest.java Tue Mar  2 14:44:35 2010
@@ -23,6 +23,7 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.NoSuchElementException;
@@ -179,25 +180,24 @@
     }
 
     @Override
-    protected List<String> fetchPage(int pageNumber) {
+    protected FetchResult fetchPage(int pageNumber) {
       int skipCount = pageNumber * getMaxItemsPerPage();
       int lastIndex = skipCount + getMaxItemsPerPage() - 1;
       if (lastIndex >= sourceData.length) {
         lastIndex = sourceData.length - 1;
       }
 
-      setNumItems(sourceData.length);
-
       if (skipCount >= sourceData.length) {
         throw new NoSuchElementException();
       }
 
-      List<String> result = new ArrayList<String>();
+      List<String> page = new ArrayList<String>();
       for (int i = skipCount; i <= lastIndex; i++) {
-        result.add(sourceData[i]);
+        page.add(sourceData[i]);
       }
 
-      return result;
+      return new FetchResult(page, BigInteger.valueOf(sourceData.length), skipCount
+          + getMaxItemsPerPage() < sourceData.length);
     }
 
     @Override