Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentFolderImpl.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentFolderImpl.java?rev=937209&r1=937208&r2=937209&view=diff ============================================================================== --- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentFolderImpl.java (original) +++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-impl/src/main/java/org/apache/chemistry/opencmis/client/runtime/PersistentFolderImpl.java Fri Apr 23 09:28:57 2010 @@ -49,6 +49,7 @@ import org.apache.chemistry.opencmis.com import org.apache.chemistry.opencmis.commons.api.ObjectInFolderContainer; import org.apache.chemistry.opencmis.commons.api.ObjectInFolderData; import org.apache.chemistry.opencmis.commons.api.ObjectInFolderList; +import org.apache.chemistry.opencmis.commons.api.ObjectList; import org.apache.chemistry.opencmis.commons.api.PropertyData; import org.apache.chemistry.opencmis.commons.api.PropertyString; import org.apache.chemistry.opencmis.commons.enums.BaseTypeId; @@ -60,504 +61,494 @@ import org.apache.chemistry.opencmis.com public class PersistentFolderImpl extends AbstractPersistentFilableCmisObject implements Folder { - private static final Set<Updatability> CREATE_UPDATABILITY = new HashSet<Updatability>(); - static { - CREATE_UPDATABILITY.add(Updatability.ONCREATE); - CREATE_UPDATABILITY.add(Updatability.READWRITE); - } - - /** - * Constructor. - */ - public PersistentFolderImpl(PersistentSessionImpl session, ObjectType objectType, ObjectData objectData, - OperationContext context) { - initialize(session, objectType, objectData, context); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#createDocument(java.util.Map, - * org.apache.opencmis.client.api.ContentStream, - * org.apache.opencmis.commons.enums.VersioningState, java.util.List, - * java.util.List, java.util.List, - * org.apache.opencmis.client.api.OperationContext) - */ - public Document createDocument(Map<String, ?> properties, ContentStream contentStream, - VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces, - OperationContext context) { - String objectId = getObjectId(); - - ObjectFactory of = getObjectFactory(); - - String newId = getBinding().getObjectService().createDocument(getRepositoryId(), - of.convertProperties(properties, null, CREATE_UPDATABILITY), objectId, - of.convertContentStream(contentStream), versioningState, of.convertPolicies(policies), - of.convertAces(addAces), of.convertAces(removeAces), null); - - // if no context is provided the object will not be fetched - if ((context == null) || (newId == null)) { - return null; - } - - // get the new object - CmisObject object = getSession().getObject(getSession().createObjectId(newId), context); - if (!(object instanceof Document)) { - throw new CmisRuntimeException("Newly created object is not a document! New id: " + newId); - } - - return (Document) object; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.api.Folder#createDocumentFromSource(org.apache - * .opencmis.client.api .ObjectId, java.util.Map, - * org.apache.opencmis.commons.enums.VersioningState, java.util.List, - * java.util.List, java.util.List, - * org.apache.opencmis.client.api.OperationContext) - */ - public Document createDocumentFromSource(ObjectId source, Map<String, ?> properties, - VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces, - OperationContext context) { - if ((source == null) || (source.getId() == null)) { - throw new IllegalArgumentException("Source must be set!"); - } - - String objectId = getObjectId(); - - // get the type of the source document - ObjectType type = null; - if (source instanceof CmisObject) { - type = ((CmisObject) source).getBaseType(); - } else { - CmisObject sourceObj = getSession().getObject(source); - type = sourceObj.getType(); - } - - if (type.getBaseTypeId() != BaseTypeId.CMIS_DOCUMENT) { - throw new IllegalArgumentException("Source object must be a document!"); - } - - ObjectFactory of = getObjectFactory(); - - Set<Updatability> updatebility = new HashSet<Updatability>(); - updatebility.add(Updatability.READWRITE); - - String newId = getBinding().getObjectService().createDocumentFromSource(getRepositoryId(), source.getId(), - of.convertProperties(properties, type, updatebility), objectId, versioningState, - of.convertPolicies(policies), of.convertAces(addAces), of.convertAces(removeAces), null); - - // if no context is provided the object will not be fetched - if ((context == null) || (newId == null)) { - return null; - } - - // get the new object - CmisObject object = getSession().getObject(getSession().createObjectId(newId), context); - if (!(object instanceof Document)) { - throw new CmisRuntimeException("Newly created object is not a document! New id: " + newId); - } - - return (Document) object; - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#createFolder(java.util.Map, - * java.util.List, java.util.List, java.util.List, - * org.apache.opencmis.client.api.OperationContext) - */ - public Folder createFolder(Map<String, ?> properties, List<Policy> policies, List<Ace> addAces, - List<Ace> removeAces, OperationContext context) { - String objectId = getObjectId(); - - ObjectFactory of = getObjectFactory(); - - String newId = getBinding().getObjectService().createFolder(getRepositoryId(), - of.convertProperties(properties, null, CREATE_UPDATABILITY), objectId, of.convertPolicies(policies), - of.convertAces(addAces), of.convertAces(removeAces), null); - - // if no context is provided the object will not be fetched - if ((context == null) || (newId == null)) { - return null; - } - - // get the new object - CmisObject object = getSession().getObject(getSession().createObjectId(newId), context); - if (!(object instanceof Folder)) { - throw new CmisRuntimeException("Newly created object is not a folder! New id: " + newId); - } - - return (Folder) object; - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#createPolicy(java.util.Map, - * java.util.List, java.util.List, java.util.List, - * org.apache.opencmis.client.api.OperationContext) - */ - public Policy createPolicy(Map<String, ?> properties, List<Policy> policies, List<Ace> addAces, - List<Ace> removeAces, OperationContext context) { - String objectId = getObjectId(); - - ObjectFactory of = getObjectFactory(); - - String newId = getBinding().getObjectService().createPolicy(getRepositoryId(), - of.convertProperties(properties, null, CREATE_UPDATABILITY), objectId, of.convertPolicies(policies), - of.convertAces(addAces), of.convertAces(removeAces), null); - - // if no context is provided the object will not be fetched - if ((context == null) || (newId == null)) { - return null; - } - - // get the new object - CmisObject object = getSession().getObject(getSession().createObjectId(newId), context); - if (!(object instanceof Policy)) { - throw new CmisRuntimeException("Newly created object is not a policy! New id: " + newId); - } - - return (Policy) object; - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#deleteTree(boolean, - * org.apache.opencmis.commons.enums.UnfileObjects, boolean) - */ - public List<String> deleteTree(boolean allVersions, UnfileObject unfile, boolean continueOnFailure) { - String repositoryId = getRepositoryId(); - String objectId = getObjectId(); - - FailedToDeleteData failed = getBinding().getObjectService().deleteTree(repositoryId, objectId, allVersions, - unfile, continueOnFailure, null); - - return failed.getIds(); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#getAllowedChildObjectTypes() - */ - public List<ObjectType> getAllowedChildObjectTypes() { - List<ObjectType> result = new ArrayList<ObjectType>(); - - readLock(); - try { - List<String> otids = getPropertyMultivalue(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS); - if (otids == null) { - return result; - } - - for (String otid : otids) { - result.add(getSession().getTypeDefinition(otid)); - } - } finally { - readUnlock(); - } - - return result; - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#getCheckedOutDocs(int) - */ - public PagingIterable<Document> getCheckedOutDocs(int itemsPerPage) { - return getCheckedOutDocs(getSession().getDefaultContext(), itemsPerPage); - } - - /* - * (non-Javadoc) - * - * @seeorg.apache.opencmis.client.api.Folder#getCheckedOutDocs(org.apache. - * opencmis.client.api. OperationContext, int) - */ - public PagingIterable<Document> getCheckedOutDocs(OperationContext context, final int itemsPerPage) { - // if (itemsPerPage < 1) { - // throw new IllegalArgumentException("itemsPerPage must be > 0!"); - // } - // - // final String objectId = getObjectId(); - // final NavigationService nagivationService = - // getBinding().getNavigationService(); - // final ObjectFactory objectFactory = getSession().getObjectFactory(); - // final OperationContext ctxt = new OperationContextImpl(context); - // - // return new AbstractPagingList<Document>() { - // - // @Override - // protected FetchResult fetchPage(int pageNumber) { - // int skipCount = pageNumber * getMaxItemsPerPage(); - // - // // get checked out documents for this folder - // ObjectList checkedOutDocs = - // nagivationService.getCheckedOutDocs(getRepositoryId(), objectId, ctxt - // .getFilterString(), ctxt.getOrderBy(), - // ctxt.isIncludeAllowableActions(), ctxt - // .getIncludeRelationships(), ctxt.getRenditionFilterString(), - // BigInteger - // .valueOf(getMaxItemsPerPage()), BigInteger.valueOf(skipCount), null); - // - // // convert objects - // List<Document> page = new ArrayList<Document>(); - // if (checkedOutDocs.getObjects() != null) { - // for (ObjectData objectData : checkedOutDocs.getObjects()) { - // CmisObject doc = objectFactory.convertObject(objectData, ctxt); - // if (!(doc instanceof Document)) { - // // should not happen... - // continue; - // } - // - // page.add((Document) doc); - // } - // } - // - // return new FetchResult(page, checkedOutDocs.getNumItems(), - // checkedOutDocs.hasMoreItems()); - // } - // - // @Override - // public int getMaxItemsPerPage() { - // return itemsPerPage; - // } - // }; - return null; - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#getChildren(int) - */ - public PagingIterable<CmisObject> getChildren(int itemsPerPage) { - return getChildren(getSession().getDefaultContext(), itemsPerPage); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.api.Folder#getChildren(org.apache.opencmis - * .client.api.OperationContext , int) - */ - public PagingIterable<CmisObject> getChildren(OperationContext context, final int itemsPerPage) { - - if (itemsPerPage < 1) { - throw new IllegalArgumentException("itemsPerPage must be > 0!"); - } - - final String objectId = getObjectId(); - final NavigationService navigationService = getBinding().getNavigationService(); - final ObjectFactory objectFactory = getSession().getObjectFactory(); - final OperationContext ctxt = new OperationContextImpl(context); - - return new DefaultPagingIterable<CmisObject>(new AbstractPageFetch<CmisObject>() { - - @Override - protected AbstractPageFetch.PageFetchResult<CmisObject> fetchPage(long skipCount) { - - // get the children - ObjectInFolderList children = navigationService.getChildren(getRepositoryId(), objectId, ctxt - .getFilterString(), ctxt.getOrderBy(), ctxt.isIncludeAllowableActions(), ctxt - .getIncludeRelationships(), ctxt.getRenditionFilterString(), ctxt.isIncludePathSegments(), - BigInteger.valueOf(itemsPerPage), BigInteger.valueOf(skipCount), null); - - // convert objects - List<CmisObject> page = new ArrayList<CmisObject>(); - List<ObjectInFolderData> childObjects = children.getObjects(); - if (childObjects != null) { - for (ObjectInFolderData objectData : childObjects) { - if (objectData.getObject() != null) { - page.add(objectFactory.convertObject(objectData.getObject(), ctxt)); - } - } - } - - return new AbstractPageFetch.PageFetchResult<CmisObject>(page, children.getNumItems(), children - .hasMoreItems()) { - }; - } - }); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#getDescendants(int) - */ - public List<Tree<FileableCmisObject>> getDescendants(int depth) { - return getDescendants(depth, getSession().getDefaultContext()); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#getDescendants(int, - * org.apache.opencmis.client.api.OperationContext) - */ - public List<Tree<FileableCmisObject>> getDescendants(int depth, OperationContext context) { - String objectId = getObjectId(); - - // get the descendants - List<ObjectInFolderContainer> providerContainerList = getBinding().getNavigationService().getDescendants( - getRepositoryId(), objectId, BigInteger.valueOf(depth), context.getFilterString(), - context.isIncludeAllowableActions(), context.getIncludeRelationships(), - context.getRenditionFilterString(), context.isIncludePathSegments(), null); - - return convertProviderContainer(providerContainerList, context); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#getFolderTree(int) - */ - public List<Tree<FileableCmisObject>> getFolderTree(int depth) { - return getFolderTree(depth, getSession().getDefaultContext()); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#getFolderTree(int, - * org.apache.opencmis.client.api.OperationContext) - */ - public List<Tree<FileableCmisObject>> getFolderTree(int depth, OperationContext context) { - String objectId = getObjectId(); - - // get the folder tree - List<ObjectInFolderContainer> providerContainerList = getBinding().getNavigationService().getFolderTree( - getRepositoryId(), objectId, BigInteger.valueOf(depth), context.getFilterString(), - context.isIncludeAllowableActions(), context.getIncludeRelationships(), - context.getRenditionFilterString(), context.isIncludePathSegments(), null); - - return convertProviderContainer(providerContainerList, context); - } - - /** - * Converts a provider container into an API container. - */ - private List<Tree<FileableCmisObject>> convertProviderContainer( - List<ObjectInFolderContainer> providerContainerList, OperationContext context) { - if (providerContainerList == null) { - return null; - } - - ObjectFactory of = getSession().getObjectFactory(); - - List<Tree<FileableCmisObject>> result = new ArrayList<Tree<FileableCmisObject>>(); - for (ObjectInFolderContainer oifc : providerContainerList) { - if ((oifc.getObject() == null) || (oifc.getObject().getObject() == null)) { - // shouldn't happen ... - continue; - } - - // convert the object - CmisObject object = of.convertObject(oifc.getObject().getObject(), context); - if (!(object instanceof FileableCmisObject)) { - // the repository must not return objects that are not fileable, - // but you never know... - continue; - } - - // convert the children - List<Tree<FileableCmisObject>> children = convertProviderContainer(oifc.getChildren(), context); - - // add both to current container - result.add(new ContainerImpl<FileableCmisObject>((FileableCmisObject) object, children)); - } - - return result; - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#isRootFolder() - */ - public boolean isRootFolder() { - String objectId = getObjectId(); - String rootFolderId = getSession().getRepositoryInfo().getRootFolderId(); - - return objectId.equals(rootFolderId); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#getFolderParent() - */ - public Folder getFolderParent() { - if (isRootFolder()) { - return null; - } - - List<Folder> parents = super.getParents(); - if ((parents == null) || (parents.isEmpty())) { - return null; - } - - return parents.get(0); - } - - /* - * (non-Javadoc) - * - * @see org.apache.opencmis.client.api.Folder#getPath() - */ - public String getPath() { - String path; - - readLock(); - try { - // get the path property - path = getPropertyValue(PropertyIds.PATH); - - // if the path property isn't set, get it - if (path == null) { - String objectId = getObjectId(); - ObjectData objectData = getBinding().getObjectService().getObject(getRepositoryId(), objectId, - PropertyIds.PATH, false, IncludeRelationships.NONE, "cmis:none", false, false, null); - - if ((objectData.getProperties() != null) && (objectData.getProperties().getProperties() != null)) { - PropertyData<?> pathProperty = objectData.getProperties().getProperties().get(PropertyIds.PATH); - - if (pathProperty instanceof PropertyString) { - path = ((PropertyString) pathProperty).getFirstValue(); - } - } - } - } finally { - readUnlock(); - } - - // we still don't know the path ... it's not a CMIS compliant repository - if (path == null) { - throw new CmisRuntimeException("Repository didn't return " + PropertyIds.PATH + "!"); - } - - return path; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.runtime.AbstractPersistentFilableCmisObject - * #getPaths() - */ - @Override - public List<String> getPaths() { - return Collections.singletonList(getPath()); - } + private static final Set<Updatability> CREATE_UPDATABILITY = new HashSet<Updatability>(); + static { + CREATE_UPDATABILITY.add(Updatability.ONCREATE); + CREATE_UPDATABILITY.add(Updatability.READWRITE); + } + + /** + * Constructor. + */ + public PersistentFolderImpl(PersistentSessionImpl session, ObjectType objectType, ObjectData objectData, + OperationContext context) { + initialize(session, objectType, objectData, context); + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#createDocument(java.util.Map, + * org.apache.opencmis.client.api.ContentStream, + * org.apache.opencmis.commons.enums.VersioningState, java.util.List, + * java.util.List, java.util.List, + * org.apache.opencmis.client.api.OperationContext) + */ + public Document createDocument(Map<String, ?> properties, ContentStream contentStream, + VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces, + OperationContext context) { + String objectId = getObjectId(); + + ObjectFactory of = getObjectFactory(); + + String newId = getBinding().getObjectService().createDocument(getRepositoryId(), + of.convertProperties(properties, null, CREATE_UPDATABILITY), objectId, + of.convertContentStream(contentStream), versioningState, of.convertPolicies(policies), + of.convertAces(addAces), of.convertAces(removeAces), null); + + // if no context is provided the object will not be fetched + if ((context == null) || (newId == null)) { + return null; + } + + // get the new object + CmisObject object = getSession().getObject(getSession().createObjectId(newId), context); + if (!(object instanceof Document)) { + throw new CmisRuntimeException("Newly created object is not a document! New id: " + newId); + } + + return (Document) object; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.api.Folder#createDocumentFromSource(org.apache + * .opencmis.client.api .ObjectId, java.util.Map, + * org.apache.opencmis.commons.enums.VersioningState, java.util.List, + * java.util.List, java.util.List, + * org.apache.opencmis.client.api.OperationContext) + */ + public Document createDocumentFromSource(ObjectId source, Map<String, ?> properties, + VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces, + OperationContext context) { + if ((source == null) || (source.getId() == null)) { + throw new IllegalArgumentException("Source must be set!"); + } + + String objectId = getObjectId(); + + // get the type of the source document + ObjectType type = null; + if (source instanceof CmisObject) { + type = ((CmisObject) source).getBaseType(); + } else { + CmisObject sourceObj = getSession().getObject(source); + type = sourceObj.getType(); + } + + if (type.getBaseTypeId() != BaseTypeId.CMIS_DOCUMENT) { + throw new IllegalArgumentException("Source object must be a document!"); + } + + ObjectFactory of = getObjectFactory(); + + Set<Updatability> updatebility = new HashSet<Updatability>(); + updatebility.add(Updatability.READWRITE); + + String newId = getBinding().getObjectService().createDocumentFromSource(getRepositoryId(), source.getId(), + of.convertProperties(properties, type, updatebility), objectId, versioningState, + of.convertPolicies(policies), of.convertAces(addAces), of.convertAces(removeAces), null); + + // if no context is provided the object will not be fetched + if ((context == null) || (newId == null)) { + return null; + } + + // get the new object + CmisObject object = getSession().getObject(getSession().createObjectId(newId), context); + if (!(object instanceof Document)) { + throw new CmisRuntimeException("Newly created object is not a document! New id: " + newId); + } + + return (Document) object; + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#createFolder(java.util.Map, + * java.util.List, java.util.List, java.util.List, + * org.apache.opencmis.client.api.OperationContext) + */ + public Folder createFolder(Map<String, ?> properties, List<Policy> policies, List<Ace> addAces, + List<Ace> removeAces, OperationContext context) { + String objectId = getObjectId(); + + ObjectFactory of = getObjectFactory(); + + String newId = getBinding().getObjectService().createFolder(getRepositoryId(), + of.convertProperties(properties, null, CREATE_UPDATABILITY), objectId, of.convertPolicies(policies), + of.convertAces(addAces), of.convertAces(removeAces), null); + + // if no context is provided the object will not be fetched + if ((context == null) || (newId == null)) { + return null; + } + + // get the new object + CmisObject object = getSession().getObject(getSession().createObjectId(newId), context); + if (!(object instanceof Folder)) { + throw new CmisRuntimeException("Newly created object is not a folder! New id: " + newId); + } + + return (Folder) object; + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#createPolicy(java.util.Map, + * java.util.List, java.util.List, java.util.List, + * org.apache.opencmis.client.api.OperationContext) + */ + public Policy createPolicy(Map<String, ?> properties, List<Policy> policies, List<Ace> addAces, + List<Ace> removeAces, OperationContext context) { + String objectId = getObjectId(); + + ObjectFactory of = getObjectFactory(); + + String newId = getBinding().getObjectService().createPolicy(getRepositoryId(), + of.convertProperties(properties, null, CREATE_UPDATABILITY), objectId, of.convertPolicies(policies), + of.convertAces(addAces), of.convertAces(removeAces), null); + + // if no context is provided the object will not be fetched + if ((context == null) || (newId == null)) { + return null; + } + + // get the new object + CmisObject object = getSession().getObject(getSession().createObjectId(newId), context); + if (!(object instanceof Policy)) { + throw new CmisRuntimeException("Newly created object is not a policy! New id: " + newId); + } + + return (Policy) object; + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#deleteTree(boolean, + * org.apache.opencmis.commons.enums.UnfileObjects, boolean) + */ + public List<String> deleteTree(boolean allVersions, UnfileObject unfile, boolean continueOnFailure) { + String repositoryId = getRepositoryId(); + String objectId = getObjectId(); + + FailedToDeleteData failed = getBinding().getObjectService().deleteTree(repositoryId, objectId, allVersions, + unfile, continueOnFailure, null); + + return failed.getIds(); + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#getAllowedChildObjectTypes() + */ + public List<ObjectType> getAllowedChildObjectTypes() { + List<ObjectType> result = new ArrayList<ObjectType>(); + + readLock(); + try { + List<String> otids = getPropertyMultivalue(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS); + if (otids == null) { + return result; + } + + for (String otid : otids) { + result.add(getSession().getTypeDefinition(otid)); + } + } finally { + readUnlock(); + } + + return result; + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#getCheckedOutDocs(int) + */ + public PagingIterable<Document> getCheckedOutDocs(int itemsPerPage) { + return getCheckedOutDocs(getSession().getDefaultContext(), itemsPerPage); + } + + /* + * (non-Javadoc) + * + * @seeorg.apache.opencmis.client.api.Folder#getCheckedOutDocs(org.apache. + * opencmis.client.api. OperationContext, int) + */ + public PagingIterable<Document> getCheckedOutDocs(OperationContext context, final int itemsPerPage) { + if (itemsPerPage < 1) { + throw new IllegalArgumentException("itemsPerPage must be > 0!"); + } + + final String objectId = getObjectId(); + final NavigationService navigationService = getBinding().getNavigationService(); + final ObjectFactory objectFactory = getSession().getObjectFactory(); + final OperationContext ctxt = new OperationContextImpl(context); + + return new DefaultPagingIterable<Document>(new AbstractPageFetch<Document>() { + + @Override + protected AbstractPageFetch.PageFetchResult<Document> fetchPage(long skipCount) { + + // get checked out documents for this folder + ObjectList checkedOutDocs = navigationService.getCheckedOutDocs(getRepositoryId(), objectId, ctxt + .getFilterString(), ctxt.getOrderBy(), ctxt.isIncludeAllowableActions(), ctxt + .getIncludeRelationships(), ctxt.getRenditionFilterString(), BigInteger.valueOf(itemsPerPage), + BigInteger.valueOf(skipCount), null); + + // convert objects + List<Document> page = new ArrayList<Document>(); + if (checkedOutDocs.getObjects() != null) { + for (ObjectData objectData : checkedOutDocs.getObjects()) { + CmisObject doc = objectFactory.convertObject(objectData, ctxt); + if (!(doc instanceof Document)) { + // should not happen... + continue; + } + + page.add((Document) doc); + } + } + + return new AbstractPageFetch.PageFetchResult<Document>(page, checkedOutDocs.getNumItems(), + checkedOutDocs.hasMoreItems()) { + }; + } + }); + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#getChildren(int) + */ + public PagingIterable<CmisObject> getChildren(int itemsPerPage) { + return getChildren(getSession().getDefaultContext(), itemsPerPage); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.api.Folder#getChildren(org.apache.opencmis + * .client.api.OperationContext , int) + */ + public PagingIterable<CmisObject> getChildren(OperationContext context, final int itemsPerPage) { + + if (itemsPerPage < 1) { + throw new IllegalArgumentException("itemsPerPage must be > 0!"); + } + + final String objectId = getObjectId(); + final NavigationService navigationService = getBinding().getNavigationService(); + final ObjectFactory objectFactory = getSession().getObjectFactory(); + final OperationContext ctxt = new OperationContextImpl(context); + + return new DefaultPagingIterable<CmisObject>(new AbstractPageFetch<CmisObject>() { + + @Override + protected AbstractPageFetch.PageFetchResult<CmisObject> fetchPage(long skipCount) { + + // get the children + ObjectInFolderList children = navigationService.getChildren(getRepositoryId(), objectId, ctxt + .getFilterString(), ctxt.getOrderBy(), ctxt.isIncludeAllowableActions(), ctxt + .getIncludeRelationships(), ctxt.getRenditionFilterString(), ctxt.isIncludePathSegments(), + BigInteger.valueOf(itemsPerPage), BigInteger.valueOf(skipCount), null); + + // convert objects + List<CmisObject> page = new ArrayList<CmisObject>(); + List<ObjectInFolderData> childObjects = children.getObjects(); + if (childObjects != null) { + for (ObjectInFolderData objectData : childObjects) { + if (objectData.getObject() != null) { + page.add(objectFactory.convertObject(objectData.getObject(), ctxt)); + } + } + } + + return new AbstractPageFetch.PageFetchResult<CmisObject>(page, children.getNumItems(), children + .hasMoreItems()) { + }; + } + }); + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#getDescendants(int) + */ + public List<Tree<FileableCmisObject>> getDescendants(int depth) { + return getDescendants(depth, getSession().getDefaultContext()); + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#getDescendants(int, + * org.apache.opencmis.client.api.OperationContext) + */ + public List<Tree<FileableCmisObject>> getDescendants(int depth, OperationContext context) { + String objectId = getObjectId(); + + // get the descendants + List<ObjectInFolderContainer> providerContainerList = getBinding().getNavigationService().getDescendants( + getRepositoryId(), objectId, BigInteger.valueOf(depth), context.getFilterString(), + context.isIncludeAllowableActions(), context.getIncludeRelationships(), + context.getRenditionFilterString(), context.isIncludePathSegments(), null); + + return convertProviderContainer(providerContainerList, context); + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#getFolderTree(int) + */ + public List<Tree<FileableCmisObject>> getFolderTree(int depth) { + return getFolderTree(depth, getSession().getDefaultContext()); + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#getFolderTree(int, + * org.apache.opencmis.client.api.OperationContext) + */ + public List<Tree<FileableCmisObject>> getFolderTree(int depth, OperationContext context) { + String objectId = getObjectId(); + + // get the folder tree + List<ObjectInFolderContainer> providerContainerList = getBinding().getNavigationService().getFolderTree( + getRepositoryId(), objectId, BigInteger.valueOf(depth), context.getFilterString(), + context.isIncludeAllowableActions(), context.getIncludeRelationships(), + context.getRenditionFilterString(), context.isIncludePathSegments(), null); + + return convertProviderContainer(providerContainerList, context); + } + + /** + * Converts a provider container into an API container. + */ + private List<Tree<FileableCmisObject>> convertProviderContainer( + List<ObjectInFolderContainer> providerContainerList, OperationContext context) { + if (providerContainerList == null) { + return null; + } + + ObjectFactory of = getSession().getObjectFactory(); + + List<Tree<FileableCmisObject>> result = new ArrayList<Tree<FileableCmisObject>>(); + for (ObjectInFolderContainer oifc : providerContainerList) { + if ((oifc.getObject() == null) || (oifc.getObject().getObject() == null)) { + // shouldn't happen ... + continue; + } + + // convert the object + CmisObject object = of.convertObject(oifc.getObject().getObject(), context); + if (!(object instanceof FileableCmisObject)) { + // the repository must not return objects that are not fileable, + // but you never know... + continue; + } + + // convert the children + List<Tree<FileableCmisObject>> children = convertProviderContainer(oifc.getChildren(), context); + + // add both to current container + result.add(new ContainerImpl<FileableCmisObject>((FileableCmisObject) object, children)); + } + + return result; + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#isRootFolder() + */ + public boolean isRootFolder() { + String objectId = getObjectId(); + String rootFolderId = getSession().getRepositoryInfo().getRootFolderId(); + + return objectId.equals(rootFolderId); + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#getFolderParent() + */ + public Folder getFolderParent() { + if (isRootFolder()) { + return null; + } + + List<Folder> parents = super.getParents(); + if ((parents == null) || (parents.isEmpty())) { + return null; + } + + return parents.get(0); + } + + /* + * (non-Javadoc) + * + * @see org.apache.opencmis.client.api.Folder#getPath() + */ + public String getPath() { + String path; + + readLock(); + try { + // get the path property + path = getPropertyValue(PropertyIds.PATH); + + // if the path property isn't set, get it + if (path == null) { + String objectId = getObjectId(); + ObjectData objectData = getBinding().getObjectService().getObject(getRepositoryId(), objectId, + PropertyIds.PATH, false, IncludeRelationships.NONE, "cmis:none", false, false, null); + + if ((objectData.getProperties() != null) && (objectData.getProperties().getProperties() != null)) { + PropertyData<?> pathProperty = objectData.getProperties().getProperties().get(PropertyIds.PATH); + + if (pathProperty instanceof PropertyString) { + path = ((PropertyString) pathProperty).getFirstValue(); + } + } + } + } finally { + readUnlock(); + } + + // we still don't know the path ... it's not a CMIS compliant repository + if (path == null) { + throw new CmisRuntimeException("Repository didn't return " + PropertyIds.PATH + "!"); + } + + return path; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.runtime.AbstractPersistentFilableCmisObject + * #getPaths() + */ + @Override + public List<String> getPaths() { + return Collections.singletonList(getPath()); + } }
