/* * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Florent Guillaume */ package org.eclipse.ecr.opencmis.impl.client; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.chemistry.opencmis.client.api.CmisObject; import org.apache.chemistry.opencmis.client.api.Document; import org.apache.chemistry.opencmis.client.api.FileableCmisObject; import org.apache.chemistry.opencmis.client.api.Folder; import org.apache.chemistry.opencmis.client.api.ItemIterable; import org.apache.chemistry.opencmis.client.api.ObjectFactory; import org.apache.chemistry.opencmis.client.api.ObjectId; import org.apache.chemistry.opencmis.client.api.ObjectType; import org.apache.chemistry.opencmis.client.api.OperationContext; import org.apache.chemistry.opencmis.client.api.Policy; import org.apache.chemistry.opencmis.client.api.TransientFolder; import org.apache.chemistry.opencmis.client.api.Tree; import org.apache.chemistry.opencmis.client.runtime.ObjectIdImpl; import org.apache.chemistry.opencmis.client.runtime.OperationContextImpl; import org.apache.chemistry.opencmis.client.runtime.util.AbstractPageFetcher; import org.apache.chemistry.opencmis.client.runtime.util.CollectionIterable; import org.apache.chemistry.opencmis.commons.data.Ace; import org.apache.chemistry.opencmis.commons.data.ContentStream; import org.apache.chemistry.opencmis.commons.data.FailedToDeleteData; import org.apache.chemistry.opencmis.commons.enums.UnfileObject; import org.apache.chemistry.opencmis.commons.enums.VersioningState; import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException; import org.apache.chemistry.opencmis.commons.exceptions.CmisNotSupportedException; import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException; import org.eclipse.ecr.core.api.ClientException; import org.eclipse.ecr.core.api.DocumentModel; import org.eclipse.ecr.core.api.DocumentModelList; import org.eclipse.ecr.opencmis.impl.server.NuxeoObjectData; /** * Live local CMIS Folder, which is backed by a Nuxeo folderish document. */ public class NuxeoFolder extends NuxeoFileableObject implements Folder { public NuxeoFolder(NuxeoSession session, NuxeoObjectData data, ObjectType type) { super(session, data, type); } @Override public TransientFolder getTransientFolder() { return (TransientFolder) getAdapter(TransientFolder.class); } @Override public Document createDocument(Map<String, ?> properties, ContentStream contentStream, VersioningState versioningState) { return createDocument(properties, contentStream, versioningState, null, null, null, session.getDefaultContext()); } @Override public Document createDocument(Map<String, ?> properties, ContentStream contentStream, VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces, OperationContext context) { String id = service.createDocument(getRepositoryId(), session.convertProperties(properties), getId(), contentStream, versioningState, session.objectFactory.convertPolicies(policies), session.objectFactory.convertAces(addAces), session.objectFactory.convertAces(removeAces), null); // must now refetch doc return (Document) session.getObject(new ObjectIdImpl(id), context); } @Override public NuxeoDocument createDocumentFromSource(ObjectId source, Map<String, ?> properties, VersioningState versioningState) { return createDocumentFromSource(source, properties, versioningState, null, null, null, session.getDefaultContext()); } @Override public NuxeoDocument 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 CmisInvalidArgumentException("Invalid source: " + source); } if (context == null) { context = session.getDefaultContext(); } NuxeoObjectData newData = service.copy(source.getId(), getId(), properties, type, versioningState, policies, addACEs, removeACEs, context); return (NuxeoDocument) session.getObjectFactory().convertObject( newData, context); } @Override public Folder createFolder(Map<String, ?> properties) { return createFolder(properties, null, null, null, session.getDefaultContext()); } @Override public Folder createFolder(Map<String, ?> properties, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces, OperationContext context) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public Policy createPolicy(Map<String, ?> properties) { return createPolicy(properties, null, null, null, session.getDefaultContext()); } @Override public Policy createPolicy(Map<String, ?> properties, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces, OperationContext context) { throw new CmisNotSupportedException(); } @Override public List<String> deleteTree(boolean allVersions, UnfileObject unfile, boolean continueOnFailure) { FailedToDeleteData failed = service.deleteTree(getRepositoryId(), getId(), Boolean.valueOf(allVersions), unfile, Boolean.valueOf(continueOnFailure), null); if (failed == null || failed.getIds() == null || failed.getIds().isEmpty()) { return null; } return failed.getIds(); } @Override public List<ObjectType> getAllowedChildObjectTypes() { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public ItemIterable<Document> getCheckedOutDocs() { return getCheckedOutDocs(session.getDefaultContext()); } @Override public ItemIterable<Document> getCheckedOutDocs(OperationContext context) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public ItemIterable<CmisObject> getChildren() { return getChildren(session.getDefaultContext()); } @Override public ItemIterable<CmisObject> getChildren(OperationContext context) { final ObjectFactory objectFactory = session.getObjectFactory(); final OperationContext ctx = new OperationContextImpl(context); AbstractPageFetcher<CmisObject> pageFetcher = new AbstractPageFetcher<CmisObject>( ctx.getMaxItemsPerPage()) { @Override protected Page<CmisObject> fetchPage(long skipCount) { List<CmisObject> items = new ArrayList<CmisObject>(); DocumentModelList children; try { children = service.getCoreSession().getChildren( data.doc.getRef()); } catch (ClientException e) { throw new CmisRuntimeException(e.toString(), e); } long totalItems = 0; long skip = skipCount; // TODO orderBy for (DocumentModel child : children) { if (service.isFilteredOut(child)) { continue; } totalItems++; if (skip > 0) { skip--; continue; } if (items.size() > maxNumItems) { continue; } NuxeoObjectData data = new NuxeoObjectData(service, child, ctx); CmisObject ob = objectFactory.convertObject(data, ctx); items.add(ob); } return new Page<CmisObject>(items, totalItems, totalItems > skipCount + items.size()); } }; return new CollectionIterable<CmisObject>(pageFetcher); } @Override public List<Tree<FileableCmisObject>> getDescendants(int depth) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public List<Tree<FileableCmisObject>> getDescendants(int depth, OperationContext context) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public Folder getFolderParent() { if (isRootFolder()) { return null; } List<Folder> parents = getParents(); if (parents == null || parents.isEmpty()) { return null; } return parents.get(0); } @Override public List<Tree<FileableCmisObject>> getFolderTree(int depth) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public List<Tree<FileableCmisObject>> getFolderTree(int depth, OperationContext context) { // TODO Auto-generated method stub throw new UnsupportedOperationException(); } @Override public String getPath() { return data.doc.getPathAsString(); } @Override public boolean isRootFolder() { return data.doc.getPath().isRoot(); } }