blob: 50ef04c536396ae8d26f16503422adb0ffcf3fbf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.chemistry.opencmis.client.api;
import java.io.OutputStream;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.Acl;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
/**
* This interface provides asynchronous CMIS operations.
*/
public interface AsyncSession {
/**
* Returns the session object.
*
* @return the session object, not {@code null}
*/
Session getSession();
// --- types ---
/**
* Gets the definition of a type.
*
* @param typeId
* the ID of the type
*
* @return the type definition
*
* @throws CmisObjectNotFoundException
* if a type with the given type ID doesn't exist
*
* @cmis 1.0
*/
Future<ObjectType> getTypeDefinition(String typeId);
/**
* Creates a new type.
*
* @param type
* the type definition
*
* @return the new type definition
*
* @cmis 1.1
*/
Future<ObjectType> createType(TypeDefinition type);
/**
* Updates an existing type.
*
* @param type
* the type definition updates
*
* @return the updated type definition
*
* @cmis 1.1
*/
Future<ObjectType> updateType(TypeDefinition type);
/**
* Deletes a type.
*
* @param typeId
* the ID of the type to delete
*
* @cmis 1.1
*/
Future<?> deleteType(String typeId);
// --- objects ---
/**
* Returns a CMIS object from the session cache. If the object is not in the
* cache or the cache is turned off per default {@link OperationContext}, it
* will load the object from the repository and puts it into the cache.
* <p>
* This method might return a stale object if the object has been found in
* the cache and has been changed in or removed from the repository. Use
* {@link CmisObject#refresh()} and {@link CmisObject#refreshIfOld(long)} to
* update the object if necessary.
*
* @param objectId
* the object ID
*
* @return the requested object
*
* @cmis 1.0
*/
Future<CmisObject> getObject(ObjectId objectId);
/**
* Returns a CMIS object from the session cache. If the object is not in the
* cache or the given {@link OperationContext} has caching turned off, it
* will load the object from the repository and puts it into the cache.
* <p>
* This method might return a stale object if the object has been found in
* the cache and has been changed in or removed from the repository. Use
* {@link CmisObject#refresh()} and {@link CmisObject#refreshIfOld(long)} to
* update the object if necessary.
*
* @param objectId
* the object ID
* @param context
* the {@link OperationContext} to use
*
* @return the requested object
*
* @cmis 1.0
*/
Future<CmisObject> getObject(ObjectId objectId, OperationContext context);
/**
* Returns a CMIS object from the session cache. If the object is not in the
* cache or the cache is turned off per default {@link OperationContext}, it
* will load the object from the repository and puts it into the cache.
* <p>
* This method might return a stale object if the object has been found in
* the cache and has been changed in or removed from the repository. Use
* {@link CmisObject#refresh()} and {@link CmisObject#refreshIfOld(long)} to
* update the object if necessary.
*
* @param objectId
* the object ID
*
* @return the requested object
*
* @cmis 1.0
*/
Future<CmisObject> getObject(String objectId);
/**
* Returns a CMIS object from the session cache. If the object is not in the
* cache or the given {@link OperationContext} has caching turned off, it
* will load the object from the repository and puts it into the cache.
* <p>
* This method might return a stale object if the object has been found in
* the cache and has been changed in or removed from the repository. Use
* {@link CmisObject#refresh()} and {@link CmisObject#refreshIfOld(long)} to
* update the object if necessary.
*
* @param objectId
* the object ID
* @param context
* the {@link OperationContext} to use
*
* @return the requested object
*
* @cmis 1.0
*/
Future<CmisObject> getObject(String objectId, OperationContext context);
/**
* Returns a CMIS object from the session cache. If the object is not in the
* cache or the cache is turned off per default {@link OperationContext}, it
* will load the object from the repository and puts it into the cache.
* <p>
* This method might return a stale object if the object has been found in
* the cache and has been changed in or removed from the repository. Use
* {@link CmisObject#refresh()} and {@link CmisObject#refreshIfOld(long)} to
* update the object if necessary.
*
* @param path
* the object path
*
* @cmis 1.0
*/
Future<CmisObject> getObjectByPath(String path);
/**
* Returns a CMIS object from the session cache. If the object is not in the
* cache or the given {@link OperationContext} has caching turned off, it
* will load the object from the repository and puts it into the cache.
* <p>
* This method might return a stale object if the object has been found in
* the cache and has been changed in or removed from the repository. Use
* {@link CmisObject#refresh()} and {@link CmisObject#refreshIfOld(long)} to
* update the object if necessary.
*
* @param path
* the object path
* @param context
* the {@link OperationContext} to use
*
* @return the requested object
*
* @cmis 1.0
*/
Future<CmisObject> getObjectByPath(String path, OperationContext context);
/**
* Returns a CMIS object from the session cache. If the object is not in the
* cache or the cache is turned off per default {@link OperationContext}, it
* will load the object from the repository and puts it into the cache.
* <p>
* This method might return a stale object if the object has been found in
* the cache and has been changed in or removed from the repository. Use
* {@link CmisObject#refresh()} and {@link CmisObject#refreshIfOld(long)} to
* update the object if necessary.
*
* @param parentPath
* the path of the parent folder
* @param name
* the (path segment) name of the object in the folder
*
* @return the requested object
*
* @cmis 1.0
*/
Future<CmisObject> getObjectByPath(String parentPath, String name);
/**
* Returns a CMIS object from the session cache. If the object is not in the
* cache or the given {@link OperationContext} has caching turned off, it
* will load the object from the repository and puts it into the cache.
* <p>
* This method might return a stale object if the object has been found in
* the cache and has been changed in or removed from the repository. Use
* {@link CmisObject#refresh()} and {@link CmisObject#refreshIfOld(long)} to
* update the object if necessary.
*
* @param parentPath
* the path of the parent folder
* @param name
* the (path segment) name of the object in the folder
* @param context
* the {@link OperationContext} to use
*
* @return the requested object
*
* @cmis 1.0
*/
Future<CmisObject> getObjectByPath(String parentPath, String name, OperationContext context);
/**
* Returns the latest version in a version series.
*
* @param objectId
* the document ID of an arbitrary version in the version series
*
* @return the latest document version
*
* @cmis 1.0
*/
Future<Document> getLatestDocumentVersion(ObjectId objectId);
/**
* Returns the latest version in a version series.
*
* @param objectId
* the document ID of an arbitrary version in the version series
* @param context
* the {@link OperationContext} to use
*
* @return the latest document version
*
* @cmis 1.0
*/
Future<Document> getLatestDocumentVersion(ObjectId objectId, OperationContext context);
/**
* Returns the latest version in a version series.
*
* @param objectId
* the document ID of an arbitrary version in the version series
* @param major
* if {@code true} the latest major version will be returned,
* otherwise the very last version will be returned
* @param context
* the {@link OperationContext} to use
*
* @return the latest document version
*
* @cmis 1.0
*/
Future<Document> getLatestDocumentVersion(ObjectId objectId, boolean major, OperationContext context);
/**
* /** Returns the latest version in a version series.
*
* @param objectId
* the document ID of an arbitrary version in the version series
*
* @return the latest document version
*
* @cmis 1.0
*/
Future<Document> getLatestDocumentVersion(String objectId);
/**
* Returns the latest version in a version series.
*
* @param objectId
* the document ID of an arbitrary version in the version series
* @param context
* the {@link OperationContext} to use
*
* @return the latest document version
*
* @cmis 1.0
*/
Future<Document> getLatestDocumentVersion(String objectId, OperationContext context);
/**
* Returns the latest version in a version series.
*
* @param objectId
* the document ID of an arbitrary version in the version series
* @param major
* if {@code true} the latest major version will be returned,
* otherwise the very last version will be returned
* @param context
* the {@link OperationContext} to use
*
* @return the latest document version
*
* @cmis 1.0
*/
Future<Document> getLatestDocumentVersion(String objectId, boolean major, OperationContext context);
// --- create ---
/**
* Creates a new document.
*
* The stream in {@code contentStream} is consumed but not closed by this
* method.
*
* @return the object ID of the new document
*
* @cmis 1.0
*/
Future<ObjectId> createDocument(Map<String, ?> properties, ObjectId folderId, ContentStream contentStream,
VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces);
/**
* Creates a new document.
*
* The stream in {@code contentStream} is consumed but not closed by this
* method.
*
* @return the object ID of the new document
*
* @cmis 1.0
*/
Future<ObjectId> createDocument(Map<String, ?> properties, ObjectId folderId, ContentStream contentStream,
VersioningState versioningState);
/**
* Creates a new document from a source document.
*
* @return the object ID of the new document
*
* @cmis 1.0
*/
Future<ObjectId> createDocumentFromSource(ObjectId source, Map<String, ?> properties, ObjectId folderId,
VersioningState versioningState, List<Policy> policies, List<Ace> addAces, List<Ace> removeAces);
/**
* Creates a new document from a source document.
*
* @return the object ID of the new document
*
* @cmis 1.0
*/
Future<ObjectId> createDocumentFromSource(ObjectId source, Map<String, ?> properties, ObjectId folderId,
VersioningState versioningState);
/**
* Creates a new folder.
*
* @return the object ID of the new folder
*
* @cmis 1.0
*/
Future<ObjectId> createFolder(Map<String, ?> properties, ObjectId folderId, List<Policy> policies,
List<Ace> addAces, List<Ace> removeAces);
/**
* Creates a new folder.
*
* @return the object ID of the new folder
*
* @cmis 1.0
*/
Future<ObjectId> createFolder(Map<String, ?> properties, ObjectId folderId);
/**
* Creates a new policy.
*
* @return the object ID of the new policy
*
* @cmis 1.0
*/
Future<ObjectId> createPolicy(Map<String, ?> properties, ObjectId folderId, List<Policy> policies,
List<Ace> addAces, List<Ace> removeAces);
/**
* Creates a new policy.
*
* @return the object ID of the new policy
*
* @cmis 1.0
*/
Future<ObjectId> createPolicy(Map<String, ?> properties, ObjectId folderId);
/**
* Creates a new item.
*
* @return the object ID of the new policy
*
* @cmis 1.1
*/
Future<ObjectId> createItem(Map<String, ?> properties, ObjectId folderId, List<Policy> policies, List<Ace> addAces,
List<Ace> removeAces);
/**
* Creates a new item.
*
* @return the object ID of the new item
*
* @cmis 1.1
*/
Future<ObjectId> createItem(Map<String, ?> properties, ObjectId folderId);
/**
* Creates a new relationship.
*
* @return the object ID of the new relationship
*
* @cmis 1.0
*/
Future<ObjectId> createRelationship(Map<String, ?> properties, List<Policy> policies, List<Ace> addAces,
List<Ace> removeAces);
/**
* Creates a new relationship.
*
* @return the object ID of the new relationship
*
* @cmis 1.0
*/
Future<ObjectId> createRelationship(Map<String, ?> properties);
// --- content ---
/**
* Retrieves the content stream of a document.
*
* @param docId
* the ID of the document
* @param streamId
* the stream ID
* @param offset
* the offset of the stream or {@code null} to read the stream
* from the beginning
* @param length
* the maximum length of the stream or {@code null} to read to
* the end of the stream
*
* @return the content stream or {@code null} if the document has no content
* stream
*
* @cmis 1.0
*/
Future<ContentStream> getContentStream(ObjectId docId, String streamId, BigInteger offset, BigInteger length);
/**
* Retrieves the main content stream of a document.
*
* @param docId
* the ID of the document
*
* @return the content stream or {@code null} if the document has no content
* stream
*
* @cmis 1.0
*/
Future<ContentStream> getContentStream(ObjectId docId);
/**
* Reads the document content and writes it to an output stream.
*
* The output stream is not closed.
*
* @param docId
* the ID of the document
* @param streamId
* the stream ID
* @param offset
* the offset of the stream or {@code null} to read the stream
* from the beginning
* @param length
* the maximum length of the stream or {@code null} to read to
* the end of the stream
*
* @return the content stream object (the input stream is closed) or
* {@code null} if the document has no content stream
*
* @cmis 1.0
*/
Future<ContentStream> storeContentStream(ObjectId docId, String streamId, BigInteger offset, BigInteger length,
OutputStream target);
/**
* Reads the document content and writes it to an output stream.
*
* The output stream is not closed.
*
* @param docId
* the ID of the document
*
* @return the content stream object (the input stream is closed) or
* {@code null} if the document has no content stream
*
* @cmis 1.0
*/
Future<ContentStream> storeContentStream(ObjectId docId, OutputStream target);
// --- delete ---
/**
* Deletes an object.
*
* @param objectId
* the ID of the object
* @param allVersions
* if this object is a document this parameter defines if only
* this version or all versions should be deleted
*
* @cmis 1.0
*/
Future<?> delete(ObjectId objectId, boolean allVersions);
/**
* Deletes an object and, if it is a document, all versions in the version
* series.
*
* @param objectId
* the ID of the object
*
* @cmis 1.0
*/
Future<?> delete(ObjectId objectId);
/**
* Deletes a folder and all subfolders.
*
* @param folderId
* the ID of the folder
* @param allVersions
* if this object is a document this parameter defines if only
* this version or all versions should be deleted
* @param unfile
* defines how objects should be unfiled
* @param continueOnFailure
* if {@code true} the repository tries to delete as many objects
* as possible; if {@code false} the repository stops at the
* first object that could not be deleted
*
* @return a list of object IDs which failed to be deleted
*
* @cmis 1.0
*/
Future<List<String>> deleteTree(ObjectId folderId, boolean allVersions, UnfileObject unfile,
boolean continueOnFailure);
// --- ACL ---
/**
* Applies ACL changes to an object and dependent objects.
*
* Only direct ACEs can be added and removed.
*
* @param objectId
* the ID the object
* @param addAces
* list of ACEs to be added or {@code null} if no ACEs should be
* added
* @param removeAces
* list of ACEs to be removed or {@code null} if no ACEs should
* be removed
* @param aclPropagation
* value that defines the propagation of the ACE changes;
* {@code null} is equal to
* {@link AclPropagation#REPOSITORYDETERMINED}
*
* @return the new ACL of the object
*
* @cmis 1.0
*/
Future<Acl> applyAcl(ObjectId objectId, List<Ace> addAces, List<Ace> removeAces, AclPropagation aclPropagation);
/**
* Removes the direct ACEs of an object and sets the provided ACEs.
*
* The changes are local to the given object and are not propagated to
* dependent objects.
*
* @param objectId
* the ID the object
* @param aces
* list of ACEs to be set
*
* @return the new ACL of the object
*
* @cmis 1.0
*/
Future<Acl> setAcl(ObjectId objectId, List<Ace> aces);
// --- policy ---
/**
* Applies a set of policies to an object.
*
* This operation is not atomic. If it fails some policies might already be
* applied.
*
* @param objectId
* the ID the object
* @param policyIds
* the IDs of the policies to be applied
*
* @cmis 1.0
*/
Future<?> applyPolicy(ObjectId objectId, ObjectId... policyIds);
/**
* Removes a set of policies from an object.
*
* This operation is not atomic. If it fails some policies might already be
* removed.
*
* @param objectId
* the ID the object
* @param policyIds
* the IDs of the policies to be removed
*
* @cmis 1.0
*/
Future<?> removePolicy(ObjectId objectId, ObjectId... policyIds);
}