Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/MultiFilingServiceImpl.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/MultiFilingServiceImpl.java?rev=936922&r1=936921&r2=936922&view=diff ============================================================================== --- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/MultiFilingServiceImpl.java (original) +++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/MultiFilingServiceImpl.java Thu Apr 22 16:04:19 2010 @@ -36,79 +36,79 @@ import org.apache.chemistry.opencmis.com */ public class MultiFilingServiceImpl extends AbstractAtomPubService implements MultiFilingService { - /** - * Constructor. - */ - public MultiFilingServiceImpl(Session session) { - setSession(session); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.provider.MultiFilingService#addObjectToFolder - * (java.lang.String, java.lang.String, java.lang.String, java.lang.Boolean, - * org.apache.opencmis.client.provider.ExtensionsData) - */ - public void addObjectToFolder(String repositoryId, String objectId, String folderId, Boolean allVersions, - ExtensionsData extension) { - if (objectId == null) { - throw new CmisInvalidArgumentException("Object id must be set!"); - } - - // find the link - String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN); - - if (link == null) { - throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN); - } - - UrlBuilder url = new UrlBuilder(link); - url.addParameter(Constants.PARAM_ALL_VERSIONS, allVersions); - - // set up object and writer - final AtomEntryWriter entryWriter = new AtomEntryWriter(createIdObject(objectId)); - - // post addObjectToFolder request - post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() { - public void write(OutputStream out) throws Exception { - entryWriter.write(out); - } - }); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.provider.MultiFilingService#removeObjectFromFolder - * (java.lang.String, java.lang.String, java.lang.String, - * org.apache.opencmis.client.provider.ExtensionsData) - */ - public void removeObjectFromFolder(String repositoryId, String objectId, String folderId, ExtensionsData extension) { - if (objectId == null) { - throw new CmisInvalidArgumentException("Object id must be set!"); - } - - // find the link - String link = loadCollection(repositoryId, Constants.COLLECTION_UNFILED); - - if (link == null) { - throw new CmisObjectNotFoundException("Unknown repository or unfiling not supported!"); - } - - UrlBuilder url = new UrlBuilder(link); - url.addParameter(Constants.PARAM_REMOVE_FROM, folderId); - - // set up object and writer - final AtomEntryWriter entryWriter = new AtomEntryWriter(createIdObject(objectId)); - - // post removeObjectFromFolder request - post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() { - public void write(OutputStream out) throws Exception { - entryWriter.write(out); - } - }); - } + /** + * Constructor. + */ + public MultiFilingServiceImpl(Session session) { + setSession(session); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.MultiFilingService#addObjectToFolder + * (java.lang.String, java.lang.String, java.lang.String, java.lang.Boolean, + * org.apache.opencmis.client.provider.ExtensionsData) + */ + public void addObjectToFolder(String repositoryId, String objectId, String folderId, Boolean allVersions, + ExtensionsData extension) { + if (objectId == null) { + throw new CmisInvalidArgumentException("Object id must be set!"); + } + + // find the link + String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN); + + if (link == null) { + throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN); + } + + UrlBuilder url = new UrlBuilder(link); + url.addParameter(Constants.PARAM_ALL_VERSIONS, allVersions); + + // set up object and writer + final AtomEntryWriter entryWriter = new AtomEntryWriter(createIdObject(objectId)); + + // post addObjectToFolder request + post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() { + public void write(OutputStream out) throws Exception { + entryWriter.write(out); + } + }); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.MultiFilingService#removeObjectFromFolder + * (java.lang.String, java.lang.String, java.lang.String, + * org.apache.opencmis.client.provider.ExtensionsData) + */ + public void removeObjectFromFolder(String repositoryId, String objectId, String folderId, ExtensionsData extension) { + if (objectId == null) { + throw new CmisInvalidArgumentException("Object id must be set!"); + } + + // find the link + String link = loadCollection(repositoryId, Constants.COLLECTION_UNFILED); + + if (link == null) { + throw new CmisObjectNotFoundException("Unknown repository or unfiling not supported!"); + } + + UrlBuilder url = new UrlBuilder(link); + url.addParameter(Constants.PARAM_REMOVE_FROM, folderId); + + // set up object and writer + final AtomEntryWriter entryWriter = new AtomEntryWriter(createIdObject(objectId)); + + // post removeObjectFromFolder request + post(url, Constants.MEDIATYPE_ENTRY, new HttpUtils.Output() { + public void write(OutputStream out) throws Exception { + entryWriter.write(out); + } + }); + } }
Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/NavigationServiceImpl.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/NavigationServiceImpl.java?rev=936922&r1=936921&r2=936922&view=diff ============================================================================== --- incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/NavigationServiceImpl.java (original) +++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-client/chemistry-opencmis-client-bindings/src/main/java/org/apache/chemistry/opencmis/client/bindings/spi/atompub/NavigationServiceImpl.java Thu Apr 22 16:04:19 2010 @@ -58,452 +58,452 @@ import org.apache.chemistry.opencmis.com */ public class NavigationServiceImpl extends AbstractAtomPubService implements NavigationService { - /** - * Constructor. - */ - public NavigationServiceImpl(Session session) { - setSession(session); - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.provider.NavigationService#getChildren(java - * .lang.String, java.lang.String, java.lang.String, java.lang.String, - * java.lang.Boolean, - * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String, - * java.lang.Boolean, java.math.BigInteger, java.math.BigInteger, - * org.apache.opencmis.client.provider.ExtensionsData) - */ - public ObjectInFolderList getChildren(String repositoryId, String folderId, String filter, String orderBy, - Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, - Boolean includePathSegment, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) { - ObjectInFolderListImpl result = new ObjectInFolderListImpl(); - - // find the link - String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN); - - if (link == null) { - throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN); - } - - UrlBuilder url = new UrlBuilder(link); - url.addParameter(Constants.PARAM_FILTER, filter); - url.addParameter(Constants.PARAM_ORDER_BY, orderBy); - url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions); - url.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships); - url.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter); - url.addParameter(Constants.PARAM_PATH_SEGMENT, includePathSegment); - url.addParameter(Constants.PARAM_MAX_ITEMS, maxItems); - url.addParameter(Constants.PARAM_SKIP_COUNT, skipCount); - - // read and parse - HttpUtils.Response resp = read(url); - AtomFeed feed = parse(resp.getStream(), AtomFeed.class); - - // handle top level - for (AtomElement element : feed.getElements()) { - if (element.getObject() instanceof AtomLink) { - if (isNextLink(element)) { - result.setHasMoreItems(Boolean.TRUE); - } - } else if (isInt(NAME_NUM_ITEMS, element)) { - result.setNumItems((BigInteger) element.getObject()); - } - } - - // get the children - if (!feed.getEntries().isEmpty()) { - result.setObjects(new ArrayList<ObjectInFolderData>(feed.getEntries().size())); - - for (AtomEntry entry : feed.getEntries()) { - ObjectInFolderDataImpl child = null; - String pathSegment = null; - - lockLinks(); - try { - // clean up cache - removeLinks(repositoryId, entry.getId()); - - // walk through the entry - for (AtomElement element : entry.getElements()) { - if (element.getObject() instanceof AtomLink) { - addLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); - } else if (isStr(NAME_PATH_SEGMENT, element)) { - pathSegment = (String) element.getObject(); - } else if (element.getObject() instanceof CmisObjectType) { - child = new ObjectInFolderDataImpl(); - child.setObject(convert((CmisObjectType) element.getObject())); - } - } - } finally { - unlockLinks(); - } - - if (child != null) { - child.setPathSegment(pathSegment); - result.getObjects().add(child); - } - } - } - - return result; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.provider.NavigationService#getDescendants( - * java.lang.String, java.lang.String, java.math.BigInteger, - * java.lang.String, java.lang.Boolean, - * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String, - * java.lang.Boolean, org.apache.opencmis.client.provider.ExtensionsData) - */ - public List<ObjectInFolderContainer> getDescendants(String repositoryId, String folderId, BigInteger depth, - String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships, - String renditionFilter, Boolean includePathSegment, ExtensionsData extension) { - List<ObjectInFolderContainer> result = new ArrayList<ObjectInFolderContainer>(); - - // find the link - String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_DESCENDANTS); - - if (link == null) { - throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_DESCENDANTS); - } - - UrlBuilder url = new UrlBuilder(link); - url.addParameter(Constants.PARAM_DEPTH, depth); - url.addParameter(Constants.PARAM_FILTER, filter); - url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions); - url.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships); - url.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter); - url.addParameter(Constants.PARAM_PATH_SEGMENT, includePathSegment); - - // read and parse - HttpUtils.Response resp = read(url); - AtomFeed feed = parse(resp.getStream(), AtomFeed.class); - - // process tree - addDescendantsLevel(repositoryId, feed, result); - - return result; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.provider.NavigationService#getFolderParent - * (java.lang.String, java.lang.String, java.lang.String, - * org.apache.opencmis.client.provider.ExtensionsData) - */ - public ObjectData getFolderParent(String repositoryId, String folderId, String filter, ExtensionsData extension) { - ObjectData result = null; - - // find the link - String link = loadLink(repositoryId, folderId, Constants.REL_UP, Constants.MEDIATYPE_ENTRY); - - if (link == null) { - throwLinkException(repositoryId, folderId, Constants.REL_UP, Constants.MEDIATYPE_ENTRY); - } - - UrlBuilder url = new UrlBuilder(link); - url.addParameter(Constants.PARAM_FILTER, filter); - - // read - HttpUtils.Response resp = read(url); - - AtomBase base = parse(resp.getStream(), AtomBase.class); - - // get the entry - AtomEntry entry = null; - if (base instanceof AtomFeed) { - AtomFeed feed = (AtomFeed) base; - if (feed.getEntries().isEmpty()) { - throw new CmisRuntimeException("Parent feed is empty!"); - } - entry = feed.getEntries().get(0); - } else if (base instanceof AtomEntry) { - entry = (AtomEntry) base; - } else { - throw new CmisRuntimeException("Unexpected document!"); - } - - lockLinks(); - try { - // clean up cache - removeLinks(repositoryId, entry.getId()); - - // walk through the entry - for (AtomElement element : entry.getElements()) { - if (element.getObject() instanceof AtomLink) { - addLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); - } else if (element.getObject() instanceof CmisObjectType) { - result = convert((CmisObjectType) element.getObject()); - } - } - } finally { - unlockLinks(); - } - - return result; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.provider.NavigationService#getFolderTree(java - * .lang.String, java.lang.String, java.math.BigInteger, java.lang.String, - * java.lang.Boolean, - * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String, - * java.lang.Boolean, org.apache.opencmis.client.provider.ExtensionsData) - */ - public List<ObjectInFolderContainer> getFolderTree(String repositoryId, String folderId, BigInteger depth, - String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships, - String renditionFilter, Boolean includePathSegment, ExtensionsData extension) { - List<ObjectInFolderContainer> result = new ArrayList<ObjectInFolderContainer>(); - - // find the link - String link = loadLink(repositoryId, folderId, Constants.REL_FOLDERTREE, Constants.MEDIATYPE_DESCENDANTS); - - if (link == null) { - throwLinkException(repositoryId, folderId, Constants.REL_FOLDERTREE, Constants.MEDIATYPE_DESCENDANTS); - } - - UrlBuilder url = new UrlBuilder(link); - url.addParameter(Constants.PARAM_DEPTH, depth); - url.addParameter(Constants.PARAM_FILTER, filter); - url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions); - url.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships); - url.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter); - url.addParameter(Constants.PARAM_PATH_SEGMENT, includePathSegment); - - // read and parse - HttpUtils.Response resp = read(url); - AtomFeed feed = parse(resp.getStream(), AtomFeed.class); - - // process tree - addDescendantsLevel(repositoryId, feed, result); - - return result; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.provider.NavigationService#getObjectParents - * (java.lang.String, java.lang.String, java.lang.String, java.lang.Boolean, - * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String, - * java.lang.Boolean, org.apache.opencmis.client.provider.ExtensionsData) - */ - public List<ObjectParentData> getObjectParents(String repositoryId, String objectId, String filter, - Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, - Boolean includeRelativePathSegment, ExtensionsData extension) { - List<ObjectParentData> result = new ArrayList<ObjectParentData>(); - - // find the link - String link = loadLink(repositoryId, objectId, Constants.REL_UP, Constants.MEDIATYPE_FEED); - - if (link == null) { - throwLinkException(repositoryId, objectId, Constants.REL_UP, Constants.MEDIATYPE_FEED); - } - - UrlBuilder url = new UrlBuilder(link); - url.addParameter(Constants.PARAM_FILTER, filter); - url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions); - url.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships); - url.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter); - url.addParameter(Constants.PARAM_RELATIVE_PATH_SEGMENT, includeRelativePathSegment); - - // read and parse - HttpUtils.Response resp = read(url); - - AtomBase base = parse(resp.getStream(), AtomBase.class); - - if (base instanceof AtomFeed) { - // it's a feed - AtomFeed feed = (AtomFeed) base; - - // walk through the feed - for (AtomEntry entry : feed.getEntries()) { - ObjectParentDataImpl objectParent = processParentEntry(entry, repositoryId); - - if (objectParent != null) { - result.add(objectParent); - } - } - } else if (base instanceof AtomEntry) { - // it's an entry - AtomEntry entry = (AtomEntry) base; - - ObjectParentDataImpl objectParent = processParentEntry(entry, repositoryId); - - if (objectParent != null) { - result.add(objectParent); - } - } - - return result; - } - - private ObjectParentDataImpl processParentEntry(AtomEntry entry, String repositoryId) { - ObjectParentDataImpl result = null; - String relativePathSegment = null; - - lockLinks(); - try { - // clean up cache - removeLinks(repositoryId, entry.getId()); - - // walk through the entry - for (AtomElement element : entry.getElements()) { - if (element.getObject() instanceof AtomLink) { - addLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); - } else if (element.getObject() instanceof CmisObjectType) { - result = new ObjectParentDataImpl(convert((CmisObjectType) element.getObject())); - } else if (is(NAME_RELATIVE_PATH_SEGMENT, element)) { - relativePathSegment = (String) element.getObject(); - } - } - } finally { - unlockLinks(); - } - - if (result != null) { - result.setRelativePathSegment(relativePathSegment); - } - - return result; - } - - /* - * (non-Javadoc) - * - * @see - * org.apache.opencmis.client.provider.NavigationService#getCheckedOutDocs - * (java.lang.String, java.lang.String, java.lang.String, java.lang.String, - * java.lang.Boolean, - * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String, - * java.math.BigInteger, java.math.BigInteger, - * org.apache.opencmis.client.provider.ExtensionsData) - */ - public ObjectList getCheckedOutDocs(String repositoryId, String folderId, String filter, String orderBy, - Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, - BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) { - ObjectListImpl result = new ObjectListImpl(); - - // find the link - String link = loadCollection(repositoryId, Constants.COLLECTION_CHECKEDOUT); - - if (link == null) { - throw new CmisObjectNotFoundException("Unknown repository or checkedout collection not supported!"); - } - - UrlBuilder url = new UrlBuilder(link); - url.addParameter(Constants.PARAM_FOLDER_ID, folderId); - url.addParameter(Constants.PARAM_FILTER, filter); - url.addParameter(Constants.PARAM_ORDER_BY, orderBy); - url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions); - url.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships); - url.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter); - url.addParameter(Constants.PARAM_MAX_ITEMS, maxItems); - url.addParameter(Constants.PARAM_SKIP_COUNT, skipCount); - - // read and parse - HttpUtils.Response resp = read(url); - AtomFeed feed = parse(resp.getStream(), AtomFeed.class); - - // handle top level - for (AtomElement element : feed.getElements()) { - if (element.getObject() instanceof AtomLink) { - if (isNextLink(element)) { - result.setHasMoreItems(Boolean.TRUE); - } - } else if (isInt(NAME_NUM_ITEMS, element)) { - result.setNumItems((BigInteger) element.getObject()); - } - } - - // get the documents - if (!feed.getEntries().isEmpty()) { - result.setObjects(new ArrayList<ObjectData>(feed.getEntries().size())); - - for (AtomEntry entry : feed.getEntries()) { - ObjectData child = null; - - lockLinks(); - try { - // clean up cache - removeLinks(repositoryId, entry.getId()); - - // walk through the entry - for (AtomElement element : entry.getElements()) { - if (element.getObject() instanceof AtomLink) { - addLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); - } else if (element.getObject() instanceof CmisObjectType) { - child = convert((CmisObjectType) element.getObject()); - } - } - } finally { - unlockLinks(); - } - - if (child != null) { - result.getObjects().add(child); - } - } - } - - return result; - } - - // ---- internal ---- - - /** - * Adds descendants level recursively. - */ - private void addDescendantsLevel(String repositoryId, AtomFeed feed, List<ObjectInFolderContainer> containerList) { - if ((feed == null) || (feed.getEntries().isEmpty())) { - return; - } - - // walk through the feed - for (AtomEntry entry : feed.getEntries()) { - ObjectInFolderDataImpl objectInFolder = null; - String pathSegment = null; - List<ObjectInFolderContainer> childContainerList = new ArrayList<ObjectInFolderContainer>(); - - lockLinks(); - try { - // clean up cache - removeLinks(repositoryId, entry.getId()); - - // walk through the entry - for (AtomElement element : entry.getElements()) { - if (element.getObject() instanceof AtomLink) { - addLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); - } else if (element.getObject() instanceof CmisObjectType) { - objectInFolder = new ObjectInFolderDataImpl(convert((CmisObjectType) element.getObject())); - } else if (is(NAME_PATH_SEGMENT, element)) { - pathSegment = (String) element.getObject(); - } else if (element.getObject() instanceof AtomFeed) { - addDescendantsLevel(repositoryId, (AtomFeed) element.getObject(), childContainerList); - } - } - } finally { - unlockLinks(); - } - - if (objectInFolder != null) { - objectInFolder.setPathSegment(pathSegment); - ObjectInFolderContainerImpl childContainer = new ObjectInFolderContainerImpl(objectInFolder); - childContainer.setChildren(childContainerList); - containerList.add(childContainer); - } - } - } + /** + * Constructor. + */ + public NavigationServiceImpl(Session session) { + setSession(session); + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.NavigationService#getChildren(java + * .lang.String, java.lang.String, java.lang.String, java.lang.String, + * java.lang.Boolean, + * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String, + * java.lang.Boolean, java.math.BigInteger, java.math.BigInteger, + * org.apache.opencmis.client.provider.ExtensionsData) + */ + public ObjectInFolderList getChildren(String repositoryId, String folderId, String filter, String orderBy, + Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, + Boolean includePathSegment, BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) { + ObjectInFolderListImpl result = new ObjectInFolderListImpl(); + + // find the link + String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN); + + if (link == null) { + throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_CHILDREN); + } + + UrlBuilder url = new UrlBuilder(link); + url.addParameter(Constants.PARAM_FILTER, filter); + url.addParameter(Constants.PARAM_ORDER_BY, orderBy); + url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions); + url.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships); + url.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter); + url.addParameter(Constants.PARAM_PATH_SEGMENT, includePathSegment); + url.addParameter(Constants.PARAM_MAX_ITEMS, maxItems); + url.addParameter(Constants.PARAM_SKIP_COUNT, skipCount); + + // read and parse + HttpUtils.Response resp = read(url); + AtomFeed feed = parse(resp.getStream(), AtomFeed.class); + + // handle top level + for (AtomElement element : feed.getElements()) { + if (element.getObject() instanceof AtomLink) { + if (isNextLink(element)) { + result.setHasMoreItems(Boolean.TRUE); + } + } else if (isInt(NAME_NUM_ITEMS, element)) { + result.setNumItems((BigInteger) element.getObject()); + } + } + + // get the children + if (!feed.getEntries().isEmpty()) { + result.setObjects(new ArrayList<ObjectInFolderData>(feed.getEntries().size())); + + for (AtomEntry entry : feed.getEntries()) { + ObjectInFolderDataImpl child = null; + String pathSegment = null; + + lockLinks(); + try { + // clean up cache + removeLinks(repositoryId, entry.getId()); + + // walk through the entry + for (AtomElement element : entry.getElements()) { + if (element.getObject() instanceof AtomLink) { + addLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); + } else if (isStr(NAME_PATH_SEGMENT, element)) { + pathSegment = (String) element.getObject(); + } else if (element.getObject() instanceof CmisObjectType) { + child = new ObjectInFolderDataImpl(); + child.setObject(convert((CmisObjectType) element.getObject())); + } + } + } finally { + unlockLinks(); + } + + if (child != null) { + child.setPathSegment(pathSegment); + result.getObjects().add(child); + } + } + } + + return result; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.NavigationService#getDescendants( + * java.lang.String, java.lang.String, java.math.BigInteger, + * java.lang.String, java.lang.Boolean, + * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String, + * java.lang.Boolean, org.apache.opencmis.client.provider.ExtensionsData) + */ + public List<ObjectInFolderContainer> getDescendants(String repositoryId, String folderId, BigInteger depth, + String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships, + String renditionFilter, Boolean includePathSegment, ExtensionsData extension) { + List<ObjectInFolderContainer> result = new ArrayList<ObjectInFolderContainer>(); + + // find the link + String link = loadLink(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_DESCENDANTS); + + if (link == null) { + throwLinkException(repositoryId, folderId, Constants.REL_DOWN, Constants.MEDIATYPE_DESCENDANTS); + } + + UrlBuilder url = new UrlBuilder(link); + url.addParameter(Constants.PARAM_DEPTH, depth); + url.addParameter(Constants.PARAM_FILTER, filter); + url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions); + url.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships); + url.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter); + url.addParameter(Constants.PARAM_PATH_SEGMENT, includePathSegment); + + // read and parse + HttpUtils.Response resp = read(url); + AtomFeed feed = parse(resp.getStream(), AtomFeed.class); + + // process tree + addDescendantsLevel(repositoryId, feed, result); + + return result; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.NavigationService#getFolderParent + * (java.lang.String, java.lang.String, java.lang.String, + * org.apache.opencmis.client.provider.ExtensionsData) + */ + public ObjectData getFolderParent(String repositoryId, String folderId, String filter, ExtensionsData extension) { + ObjectData result = null; + + // find the link + String link = loadLink(repositoryId, folderId, Constants.REL_UP, Constants.MEDIATYPE_ENTRY); + + if (link == null) { + throwLinkException(repositoryId, folderId, Constants.REL_UP, Constants.MEDIATYPE_ENTRY); + } + + UrlBuilder url = new UrlBuilder(link); + url.addParameter(Constants.PARAM_FILTER, filter); + + // read + HttpUtils.Response resp = read(url); + + AtomBase base = parse(resp.getStream(), AtomBase.class); + + // get the entry + AtomEntry entry = null; + if (base instanceof AtomFeed) { + AtomFeed feed = (AtomFeed) base; + if (feed.getEntries().isEmpty()) { + throw new CmisRuntimeException("Parent feed is empty!"); + } + entry = feed.getEntries().get(0); + } else if (base instanceof AtomEntry) { + entry = (AtomEntry) base; + } else { + throw new CmisRuntimeException("Unexpected document!"); + } + + lockLinks(); + try { + // clean up cache + removeLinks(repositoryId, entry.getId()); + + // walk through the entry + for (AtomElement element : entry.getElements()) { + if (element.getObject() instanceof AtomLink) { + addLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); + } else if (element.getObject() instanceof CmisObjectType) { + result = convert((CmisObjectType) element.getObject()); + } + } + } finally { + unlockLinks(); + } + + return result; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.NavigationService#getFolderTree(java + * .lang.String, java.lang.String, java.math.BigInteger, java.lang.String, + * java.lang.Boolean, + * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String, + * java.lang.Boolean, org.apache.opencmis.client.provider.ExtensionsData) + */ + public List<ObjectInFolderContainer> getFolderTree(String repositoryId, String folderId, BigInteger depth, + String filter, Boolean includeAllowableActions, IncludeRelationships includeRelationships, + String renditionFilter, Boolean includePathSegment, ExtensionsData extension) { + List<ObjectInFolderContainer> result = new ArrayList<ObjectInFolderContainer>(); + + // find the link + String link = loadLink(repositoryId, folderId, Constants.REL_FOLDERTREE, Constants.MEDIATYPE_DESCENDANTS); + + if (link == null) { + throwLinkException(repositoryId, folderId, Constants.REL_FOLDERTREE, Constants.MEDIATYPE_DESCENDANTS); + } + + UrlBuilder url = new UrlBuilder(link); + url.addParameter(Constants.PARAM_DEPTH, depth); + url.addParameter(Constants.PARAM_FILTER, filter); + url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions); + url.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships); + url.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter); + url.addParameter(Constants.PARAM_PATH_SEGMENT, includePathSegment); + + // read and parse + HttpUtils.Response resp = read(url); + AtomFeed feed = parse(resp.getStream(), AtomFeed.class); + + // process tree + addDescendantsLevel(repositoryId, feed, result); + + return result; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.NavigationService#getObjectParents + * (java.lang.String, java.lang.String, java.lang.String, java.lang.Boolean, + * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String, + * java.lang.Boolean, org.apache.opencmis.client.provider.ExtensionsData) + */ + public List<ObjectParentData> getObjectParents(String repositoryId, String objectId, String filter, + Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, + Boolean includeRelativePathSegment, ExtensionsData extension) { + List<ObjectParentData> result = new ArrayList<ObjectParentData>(); + + // find the link + String link = loadLink(repositoryId, objectId, Constants.REL_UP, Constants.MEDIATYPE_FEED); + + if (link == null) { + throwLinkException(repositoryId, objectId, Constants.REL_UP, Constants.MEDIATYPE_FEED); + } + + UrlBuilder url = new UrlBuilder(link); + url.addParameter(Constants.PARAM_FILTER, filter); + url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions); + url.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships); + url.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter); + url.addParameter(Constants.PARAM_RELATIVE_PATH_SEGMENT, includeRelativePathSegment); + + // read and parse + HttpUtils.Response resp = read(url); + + AtomBase base = parse(resp.getStream(), AtomBase.class); + + if (base instanceof AtomFeed) { + // it's a feed + AtomFeed feed = (AtomFeed) base; + + // walk through the feed + for (AtomEntry entry : feed.getEntries()) { + ObjectParentDataImpl objectParent = processParentEntry(entry, repositoryId); + + if (objectParent != null) { + result.add(objectParent); + } + } + } else if (base instanceof AtomEntry) { + // it's an entry + AtomEntry entry = (AtomEntry) base; + + ObjectParentDataImpl objectParent = processParentEntry(entry, repositoryId); + + if (objectParent != null) { + result.add(objectParent); + } + } + + return result; + } + + private ObjectParentDataImpl processParentEntry(AtomEntry entry, String repositoryId) { + ObjectParentDataImpl result = null; + String relativePathSegment = null; + + lockLinks(); + try { + // clean up cache + removeLinks(repositoryId, entry.getId()); + + // walk through the entry + for (AtomElement element : entry.getElements()) { + if (element.getObject() instanceof AtomLink) { + addLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); + } else if (element.getObject() instanceof CmisObjectType) { + result = new ObjectParentDataImpl(convert((CmisObjectType) element.getObject())); + } else if (is(NAME_RELATIVE_PATH_SEGMENT, element)) { + relativePathSegment = (String) element.getObject(); + } + } + } finally { + unlockLinks(); + } + + if (result != null) { + result.setRelativePathSegment(relativePathSegment); + } + + return result; + } + + /* + * (non-Javadoc) + * + * @see + * org.apache.opencmis.client.provider.NavigationService#getCheckedOutDocs + * (java.lang.String, java.lang.String, java.lang.String, java.lang.String, + * java.lang.Boolean, + * org.apache.opencmis.commons.enums.IncludeRelationships, java.lang.String, + * java.math.BigInteger, java.math.BigInteger, + * org.apache.opencmis.client.provider.ExtensionsData) + */ + public ObjectList getCheckedOutDocs(String repositoryId, String folderId, String filter, String orderBy, + Boolean includeAllowableActions, IncludeRelationships includeRelationships, String renditionFilter, + BigInteger maxItems, BigInteger skipCount, ExtensionsData extension) { + ObjectListImpl result = new ObjectListImpl(); + + // find the link + String link = loadCollection(repositoryId, Constants.COLLECTION_CHECKEDOUT); + + if (link == null) { + throw new CmisObjectNotFoundException("Unknown repository or checkedout collection not supported!"); + } + + UrlBuilder url = new UrlBuilder(link); + url.addParameter(Constants.PARAM_FOLDER_ID, folderId); + url.addParameter(Constants.PARAM_FILTER, filter); + url.addParameter(Constants.PARAM_ORDER_BY, orderBy); + url.addParameter(Constants.PARAM_ALLOWABLE_ACTIONS, includeAllowableActions); + url.addParameter(Constants.PARAM_RELATIONSHIPS, includeRelationships); + url.addParameter(Constants.PARAM_RENDITION_FILTER, renditionFilter); + url.addParameter(Constants.PARAM_MAX_ITEMS, maxItems); + url.addParameter(Constants.PARAM_SKIP_COUNT, skipCount); + + // read and parse + HttpUtils.Response resp = read(url); + AtomFeed feed = parse(resp.getStream(), AtomFeed.class); + + // handle top level + for (AtomElement element : feed.getElements()) { + if (element.getObject() instanceof AtomLink) { + if (isNextLink(element)) { + result.setHasMoreItems(Boolean.TRUE); + } + } else if (isInt(NAME_NUM_ITEMS, element)) { + result.setNumItems((BigInteger) element.getObject()); + } + } + + // get the documents + if (!feed.getEntries().isEmpty()) { + result.setObjects(new ArrayList<ObjectData>(feed.getEntries().size())); + + for (AtomEntry entry : feed.getEntries()) { + ObjectData child = null; + + lockLinks(); + try { + // clean up cache + removeLinks(repositoryId, entry.getId()); + + // walk through the entry + for (AtomElement element : entry.getElements()) { + if (element.getObject() instanceof AtomLink) { + addLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); + } else if (element.getObject() instanceof CmisObjectType) { + child = convert((CmisObjectType) element.getObject()); + } + } + } finally { + unlockLinks(); + } + + if (child != null) { + result.getObjects().add(child); + } + } + } + + return result; + } + + // ---- internal ---- + + /** + * Adds descendants level recursively. + */ + private void addDescendantsLevel(String repositoryId, AtomFeed feed, List<ObjectInFolderContainer> containerList) { + if ((feed == null) || (feed.getEntries().isEmpty())) { + return; + } + + // walk through the feed + for (AtomEntry entry : feed.getEntries()) { + ObjectInFolderDataImpl objectInFolder = null; + String pathSegment = null; + List<ObjectInFolderContainer> childContainerList = new ArrayList<ObjectInFolderContainer>(); + + lockLinks(); + try { + // clean up cache + removeLinks(repositoryId, entry.getId()); + + // walk through the entry + for (AtomElement element : entry.getElements()) { + if (element.getObject() instanceof AtomLink) { + addLink(repositoryId, entry.getId(), (AtomLink) element.getObject()); + } else if (element.getObject() instanceof CmisObjectType) { + objectInFolder = new ObjectInFolderDataImpl(convert((CmisObjectType) element.getObject())); + } else if (is(NAME_PATH_SEGMENT, element)) { + pathSegment = (String) element.getObject(); + } else if (element.getObject() instanceof AtomFeed) { + addDescendantsLevel(repositoryId, (AtomFeed) element.getObject(), childContainerList); + } + } + } finally { + unlockLinks(); + } + + if (objectInFolder != null) { + objectInFolder.setPathSegment(pathSegment); + ObjectInFolderContainerImpl childContainer = new ObjectInFolderContainerImpl(objectInFolder); + childContainer.setChildren(childContainerList); + containerList.add(childContainer); + } + } + } }
