/* * 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. */ using PortCMIS.Binding; using PortCMIS.Data; using PortCMIS.Data.Extensions; using PortCMIS.Enums; using System; using System.Collections.Generic; using System.IO; using System.Numerics; namespace PortCMIS.Client { /// /// Session factory interface. /// public interface ISessionFactory { /// /// Creates a new session with the given parameters and connects to the repository. /// /// the session parameters /// the newly created session /// /// Connect to an Browser CMIS endpoint: /// /// Dictionary<string, string> parameters = new Dictionary<string, string>(); /// /// parameters[SessionParameter.BindingType] = BindingType.Browser; /// parameters[SessionParameter.BrowserUrl] = "http://localhost/cmis/browser"; /// parameters[SessionParameter.Password] = "admin"; /// parameters[SessionParameter.User] = "admin"; /// parameters[SessionParameter.RepositoryId] = "1234-abcd-5678"; /// /// SessionFactory factory = SessionFactory.NewInstance(); /// ISession session = factory.CreateSession(parameters); /// /// Connect to an AtomPub CMIS endpoint: /// /// Dictionary<string, string> parameters = new Dictionary<string, string>(); /// /// parameters[SessionParameter.BindingType] = BindingType.AtomPub; /// parameters[SessionParameter.AtomPubUrl] = "http://localhost/cmis/atom"; /// parameters[SessionParameter.Password] = "admin"; /// parameters[SessionParameter.User] = "admin"; /// parameters[SessionParameter.RepositoryId] = "1234-abcd-5678"; /// /// SessionFactory factory = SessionFactory.NewInstance(); /// ISession session = factory.CreateSession(parameters); /// /// /// ISession CreateSession(IDictionary parameters); /// /// Creates the session. /// /// The session. /// Parameters. /// Object factory. /// Authentication provider. /// Client object cache. /// ISession CreateSession(IDictionary parameters, IObjectFactory objectFactory, IAuthenticationProvider authenticationProvider, ICache cache); /// /// Gets all repository available at the specified endpoint. /// /// the session parameters /// a list of all available repositories /// IList GetRepositories(IDictionary parameters); } /// /// Repository interface. /// public interface IRepository : IRepositoryInfo { /// /// Creates a session for this repository. /// ISession CreateSession(); } /// /// A session is a connection to a CMIS repository with a specific user. /// /// /// /// CMIS itself is stateless. PortCMIS uses the concept of a session to cache /// data across calls and to deal with user authentication. The session object is /// also used as entry point to all CMIS operations and objects. Because a /// session is only a client side concept, the session object needs not to be /// closed or released when it's not needed anymore. /// /// /// Not all operations provided by this API might be supported by the connected /// repository. Either PortCMIS or the repository will throw an exception if an /// unsupported operation is called. The capabilities of the repository can be /// discovered by evaluating the repository info /// (see ). /// /// /// Almost all methods might throw exceptions derived from . /// See the CMIS specification for a list of all operations and their exceptions. Note that /// some incompliant repositories might throw other exception than you expect. /// /// /// (Please refer to the CMIS 1.0 specification /// or the CMIS 1.1 specification /// for details about the domain model, terms, concepts, base types, properties, IDs and query names, /// query language, etc.) /// /// public interface ISession { /// /// Clears all caches. /// void Clear(); /// /// Gets the CMIS binding object. /// ICmisBinding Binding { get; } /// /// Gets and sets the default operation context. /// IOperationContext DefaultContext { get; set; } /// /// Creates a new operation context object. /// IOperationContext CreateOperationContext(); /// /// Creates a new operation context object with the given parameters. /// IOperationContext CreateOperationContext(HashSet filter, bool includeAcls, bool includeAllowableActions, bool includePolicies, IncludeRelationships includeRelationships, HashSet renditionFilter, bool includePathSegments, string orderBy, bool cacheEnabled, int maxItemsPerPage); /// /// Creates a new with the given ID. /// IObjectId CreateObjectId(string id); /// /// Gets the CMIS repository info. /// /// 1.0 IRepositoryInfo RepositoryInfo { get; } /// /// Gets the internal object factory. /// IObjectFactory ObjectFactory { get; } // types /// /// Gets the definition of a type. /// /// the ID of the type /// the type definition /// 1.0 IObjectType GetTypeDefinition(string typeId); /// /// Gets the type children of a type. /// /// the type ID or null to request the base types /// indicates whether the property definitions should be included or not /// the type iterator, not null /// 1.0 IItemEnumerable GetTypeChildren(string typeId, bool includePropertyDefinitions); /// /// Gets the type descendants of a type. /// /// the type ID or null to request the base types /// the tree depth, must be greater than 0 or -1 for infinite depth /// indicates whether the property definitions should be included or not /// the tree of types IList> GetTypeDescendants(string typeId, int depth, bool includePropertyDefinitions); /// /// Creates a new object type. /// /// the type definition /// the newly created type IObjectType CreateType(ITypeDefinition type); /// /// Updates an object type. /// /// the updated type definition /// the updated type IObjectType UpdateType(ITypeDefinition type); /// /// Deletes a type. /// /// the type ID void DeleteType(string typeId); // navigation /// /// Gets the root folder of the repository. /// /// the root folder object, not null /// 1.0 IFolder GetRootFolder(); /// /// Gets the root folder of the repository with the given . /// /// the operation context /// the root folder object, not null /// 1.0 IFolder GetRootFolder(IOperationContext context); /// /// Returns all checked out documents. /// /// /// 1.0 IItemEnumerable GetCheckedOutDocs(); /// /// Returns all checked out documents with the given operation context. /// /// /// 1.0 IItemEnumerable GetCheckedOutDocs(IOperationContext context); /// /// Gets a CMIS object from the session cache. If the object is not in the cache or the cache is /// turned off per default operation context, it will load the object from the repository and puts /// it into the cache. /// /// 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 and /// to update the object if necessary. /// /// /// the object ID /// 1.0 ICmisObject GetObject(IObjectId objectId); /// /// Gets a CMIS object from the session cache. If the object is not in the cache or the cache is /// turned off or the given operation context has caching turned off, it will load the object /// from the repository and puts it into the cache. /// /// 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 and /// to update the object if necessary. /// /// /// the object ID /// the operation context /// 1.0 ICmisObject GetObject(IObjectId objectId, IOperationContext context); /// /// Gets a CMIS object from the session cache. If the object is not in the cache or the cache is /// turned off per default operation context, it will load the object from the repository and puts /// it into the cache. /// /// 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 and /// to update the object if necessary. /// /// /// the object ID /// 1.0 ICmisObject GetObject(string objectId); /// /// Gets a CMIS object from the session cache. If the object is not in the cache or the cache is /// turned off or the given operation context has caching turned off, it will load the object /// from the repository and puts it into the cache. /// /// 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 and /// to update the object if necessary. /// /// /// the object ID /// the operation context /// 1.0 ICmisObject GetObject(string objectId, IOperationContext context); /// /// Gets a CMIS object from the session cache. If the object is not in the cache or the cache is /// turned off per default operation context, it will load the object /// from the repository and puts it into the cache. /// /// 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 and /// to update the object if necessary. /// /// /// the path to the object /// 1.0 ICmisObject GetObjectByPath(string path); /// /// Gets a CMIS object from the session cache. If the object is not in the cache or the cache is /// turned off or the given operation context has caching turned off, it will load the object /// from the repository and puts it into the cache. /// /// 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 and /// to update the object if necessary. /// /// /// the path to the object /// the operation context /// 1.0 ICmisObject GetObjectByPath(string path, IOperationContext context); /// /// Gets a CMIS object from the session cache. If the object is not in the cache or the cache is /// turned off per default operation context, it will load the object /// from the repository and puts it into the cache. /// /// 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 and /// to update the object if necessary. /// /// /// the path of the parent folder /// name of the object /// 1.0 ICmisObject GetObjectByPath(string parentPath, string name); /// /// Gets a CMIS object from the session cache. If the object is not in the cache or the cache is /// turned off or the given operation context has caching turned off, it will load the object /// from the repository and puts it into the cache. /// /// 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 and /// to update the object if necessary. /// /// /// the path of the parent folder /// name of the object /// the operation context /// 1.0 ICmisObject GetObjectByPath(string parentPath, string name, IOperationContext context); /// /// Gets the latest version in a version series. /// /// the document ID of an arbitrary version in the version series /// 1.0 IDocument GetLatestDocumentVersion(string objectId); /// /// Gets the latest version in a version series with the given operation context. /// /// the document ID of an arbitrary version in the version series /// the operation context /// 1.0 IDocument GetLatestDocumentVersion(string objectId, IOperationContext context); /// /// Gets the latest version in a version series. /// /// the document ID of an arbitrary version in the version series /// 1.0 IDocument GetLatestDocumentVersion(IObjectId objectId); /// /// Gets the latest version in a version series with the given operation context. /// /// the document ID of an arbitrary version in the version series /// the operation context /// 1.0 IDocument GetLatestDocumentVersion(IObjectId objectId, IOperationContext context); /// /// Gets the latest version in a version series with the given operation context. /// /// the document ID of an arbitrary version in the version series /// defines if the latest major or the latest minor version should be returned /// the operation context /// 1.0 IDocument GetLatestDocumentVersion(IObjectId objectId, bool major, IOperationContext context); /// /// Checks if an object with given object ID exists in the repository and is visible for the current user. /// /// If the object doesn't exist (anymore), it is removed from the cache. /// the object ID /// true if the object exists in the repository, false otherwise /// 1.0 bool Exists(IObjectId objectId); /// /// Checks if an object with given object ID exists in the repository and is visible for the current user. /// /// If the object doesn't exist (anymore), it is removed from the cache. /// the object ID /// true if the object exists in the repository, false otherwise /// 1.0 bool Exists(string objectId); /// /// Checks if an object with given path exists in the repository and is visible for the current user. /// /// If the object doesn't exist (anymore), it is removed from the cache. /// the path /// true if the object exists in the repository, false otherwise /// 1.0 bool ExistsPath(string path); /// /// Checks if an object with given path exists in the repository and is visible for the current user. /// /// If the object doesn't exist (anymore), it is removed from the cache. /// the path of the parent folder /// the (path segment) name of the object in the folder /// true if the object exists in the repository, false otherwise /// 1.0 bool ExistsPath(string parentPath, string name); /// /// Removes the given object from the cache. /// /// the object ID void RemoveObjectFromCache(IObjectId objectId); /// /// Removes the given object from the cache. /// /// the object ID void RemoveObjectFromCache(string objectId); // discovery /// /// Performs a query. /// /// the CMIS QL statement /// indicates if all versions or only latest version should be searched /// query results /// 1.0 IItemEnumerable Query(string statement, bool searchAllVersions); /// /// Performs a query that returns objects. /// /// a type ID /// WHERE part of the query, may be null /// indicates whether all versions should searched or not /// the operation context /// query results /// 1.0 IItemEnumerable QueryObjects(string typeId, string where, bool searchAllVersions, IOperationContext context); /// /// Creates a query statement. /// /// the CMIS QL statement /// the query statement object /// /// 1.0 IQueryStatement CreateQueryStatement(string statement); /// /// Performs a query using the given . /// /// the CMIS QL statement /// indicates if all versions or only latest version should be searched /// the /// query results /// 1.0 IItemEnumerable Query(string statement, bool searchAllVersions, IOperationContext context); /// /// Gets the latest change log token from the repository. /// /// the latest change log token /// 1.0 string GetLatestChangeLogToken(); /// /// Gets the change log. /// /// the change log token, may be null /// indicates whether properties should be included or /// max number of changes /// the change events /// 1.0 IChangeEvents GetContentChanges(string changeLogToken, bool includeProperties, long maxNumItems); /// /// Gets the change log. /// /// the change log token, may be null /// indicates whether properties should be included or /// max number of changes /// the operation context /// the change events /// 1.0 IChangeEvents GetContentChanges(string changeLogToken, bool includeProperties, long maxNumItems, IOperationContext context); // create /// /// Creates a new document. /// /// the object ID of the new document /// 1.0 IObjectId CreateDocument(IDictionary properties, IObjectId folderId, IContentStream contentStream, VersioningState? versioningState, IList policies, IList addAces, IList removeAces); /// /// Creates a new document. /// /// the object ID of the new document IObjectId CreateDocument(IDictionary properties, IObjectId folderId, IContentStream contentStream, VersioningState? versioningState); /// /// Creates a new document from a source document. /// /// the object ID of the new document /// 1.0 IObjectId CreateDocumentFromSource(IObjectId source, IDictionary properties, IObjectId folderId, VersioningState? versioningState, IList policies, IList addAces, IList removeAces); /// /// Creates a new document from a source document. /// /// the object ID of the new document /// 1.0 IObjectId CreateDocumentFromSource(IObjectId source, IDictionary properties, IObjectId folderId, VersioningState? versioningState); /// /// Creates a new folder. /// /// the object ID of the new folder /// 1.0 IObjectId CreateFolder(IDictionary properties, IObjectId folderId, IList policies, IList addAces, IList removeAces); /// /// Creates a new folder. /// /// the object ID of the new folder /// 1.0 IObjectId CreateFolder(IDictionary properties, IObjectId folderId); /// /// Creates a new policy. /// /// the object ID of the new policy /// 1.0 IObjectId CreatePolicy(IDictionary properties, IObjectId folderId, IList policies, IList addAces, IList removeAces); /// /// Creates a new policy. /// /// the object ID of the new policy /// 1.0 IObjectId CreatePolicy(IDictionary properties, IObjectId folderId); /// /// Creates a new relationship. /// /// the object ID of the new relationship /// 1.0 IObjectId CreateRelationship(IDictionary properties, IList policies, IList addAces, IList removeAces); /// /// Creates a new relationship. /// /// the object ID of the new relationship /// 1.0 IObjectId CreateRelationship(IDictionary properties); /// /// Creates a new item. /// /// the object ID of the new item /// 1.1 IObjectId CreateItem(IDictionary properties, IObjectId folderId, IList policies, IList addAces, IList removeAces); /// /// Creates a new item. /// /// the object ID of the new item /// 1.1 IObjectId CreateItem(IDictionary properties, IObjectId folderId); /// /// Fetches the relationships from or to an object from the repository. /// /// 1.0 IItemEnumerable GetRelationships(IObjectId objectId, bool includeSubRelationshipTypes, RelationshipDirection? relationshipDirection, IObjectType type, IOperationContext context); /// /// Updates multiple objects in one request. /// /// the objects /// updated property values /// secondary types to add /// secondary types to remove /// IList BulkUpdateProperties(IList objects, IDictionary properties, IList addSecondaryTypeIds, IList removeSecondaryTypeIds); /// /// Deletes an object and, if it is a document, all versions in the version series. /// /// the ID of the object /// 1.0 void Delete(IObjectId objectId); /// /// Deletes an object. /// /// the ID of the object /// if this object is a document this parameter defines if only this version or all versions should be deleted /// 1.0 void Delete(IObjectId objectId, bool allVersions); /// /// Deletes a folder and all subfolders. /// /// the ID of the folder /// if this object is a document this parameter defines /// if only this version or all versions should be deleted /// defines how objects should be unfiled /// if true the repository tries to delete as many objects as possible; /// if false the repository stops at the first object that could not be deleted /// a list of object IDs which failed to be deleted /// 1.0 IList DeleteTree(IObjectId folderId, bool allVersions, UnfileObject? unfile, bool continueOnFailure); /// /// Retrieves the main content stream of a document. /// /// the ID of the document /// the content stream or null if the document has no content stream /// 1.0 IContentStream GetContentStream(IObjectId docId); /// /// Retrieves the main content stream of a document. /// /// the ID of the document /// the stream ID /// the offset of the stream or null to read the stream from the beginning /// the maximum length of the stream or null to read to the end of the stream /// the content stream or null if the document has no content stream /// 1.0 IContentStream GetContentStream(IObjectId docId, string streamId, long? offset, long? length); // permissions /// /// Gets the ACL of an object. /// /// the object ID /// a flag indicating whether only basic permissions are requested /// the ACL /// 1.0 IAcl GetAcl(IObjectId objectId, bool onlyBasicPermissions); /// /// Applies an ACL. /// /// the object ID /// the ACEs to be added /// the ACSs to be removed /// the ACL propagation flag /// the new ACL of the object /// 1.0 IAcl ApplyAcl(IObjectId objectId, IList addAces, IList removeAces, AclPropagation? aclPropagation); /// /// Applies policies. /// /// the object ID /// the policy IDs /// 1.0 void ApplyPolicy(IObjectId objectId, params IObjectId[] policyIds); /// /// Removes policies. /// /// the object ID /// the policy IDs /// 1.0 void RemovePolicy(IObjectId objectId, params IObjectId[] policyIds); } /// /// Object Factory implementations convert low-level objects to high-level objects. /// public interface IObjectFactory { /// /// Initializes the factory. /// /// the session /// some parameters void Initialize(ISession session, IDictionary parameters); // Acl and ACE /// /// Converts ACEs into an ACL. /// IAcl ConvertAces(IList aces); /// /// Creates an ACL from the given ACEs. /// IAcl CreateAcl(IList aces); /// /// Converts ACEs into an ACL. /// IAce CreateAce(string principal, IList permissions); // policies /// /// Converts policies. /// IList ConvertPolicies(IList policies); // renditions /// /// Converts renditions. /// IRendition ConvertRendition(string objectId, IRenditionData rendition); // content stream /// /// Creates a new Content Stream object. /// IContentStream CreateContentStream(string filename, long length, string mimetype, Stream stream); // types /// /// Converts a type definition. /// IObjectType ConvertTypeDefinition(ITypeDefinition typeDefinition); /// /// Gets the type from a low-level object. /// IObjectType GetTypeFromObjectData(IObjectData objectData); // properties /// /// Creates a property object. /// IProperty CreateProperty(IPropertyDefinition type, IList values); /// /// Converts properties. /// IDictionary ConvertProperties(IObjectType objectType, ICollection secondaryTypes, IProperties properties); /// /// Converts properties. /// IProperties ConvertProperties(IDictionary properties, IObjectType type, ICollection secondaryTypes, ISet updatabilityFilter); /// /// Converts properties from a query result. /// IList ConvertQueryProperties(IProperties properties); // objects /// /// Converts a low-level object into a hig-level object. /// ICmisObject ConvertObject(IObjectData objectData, IOperationContext context); /// /// Converts a query result. /// IQueryResult ConvertQueryResult(IObjectData objectData); /// /// Converts a change event. /// IChangeEvent ConvertChangeEvent(IObjectData objectData); /// /// Converts a collection of change events. /// IChangeEvents ConvertChangeEvents(string changeLogToken, IObjectList objectList); } /// /// Operation context interface. /// public interface IOperationContext { /// /// Gets and sets the property filter. /// /// /// This is a set of query names. /// ISet Filter { get; set; } /// /// Gets and sets the property filter. /// /// /// This is a comma-separated list of query names. /// string FilterString { get; set; } /// /// Gets and sets if allowable actions should be retrieved. /// bool IncludeAllowableActions { get; set; } /// /// Gets and sets if ACLs should be retrieved. /// bool IncludeAcls { get; set; } /// /// Gets and sets if relationships should be retrieved. /// IncludeRelationships? IncludeRelationships { get; set; } /// /// Gets and sets if policies should be retrieved. /// bool IncludePolicies { get; set; } /// /// Gets and sets the rendition filter. /// /// /// This is a set of rendition kinds or MIME types. /// ISet RenditionFilter { get; set; } /// /// Gets and sets the rendition filter. /// /// /// This is a comma-separated list of rendition kinds or MIME types. /// string RenditionFilterString { get; set; } /// /// Gets and sets if path segments should be retrieved. /// bool IncludePathSegments { get; set; } /// /// Gets and sets order by list. /// /// /// This is a comma-separated list of query names. /// string OrderBy { get; set; } /// /// Gets and sets if object fetched with this /// should be cached or not. /// bool CacheEnabled { get; set; } /// /// Gets the cache key. (For internal use.) /// string CacheKey { get; } /// /// Gets and sets how many items should be fetched per page. /// int MaxItemsPerPage { get; set; } } /// /// A tree node. /// public interface ITree { /// /// The node item. /// T Item { get; } /// /// The children of this node. /// IList> Children { get; } } /// /// Query Statement. /// /// /// /// DateTime cal = ... /// IFolder folder = ... /// /// IQueryStatement qs = /// Session.CreateQueryStatement("SELECT ?, ? FROM ? WHERE ? > TIMESTAMP ? AND IN_FOLDER(?) OR ? IN (?)"); /// /// qs.SetProperty(1, "cmis:document", "cmis:name"); /// qs.SetProperty(2, "cmis:document", "cmis:objectId"); /// qs.SetType(3, "cmis:document"); /// /// qs.SetProperty(4, "cmis:document", "cmis:creationDate"); /// qs.SetDateTime(5, cal); /// /// qs.SetId(6, folder); /// /// qs.SetProperty(7, "cmis:document", "cmis:createdBy"); /// qs.SetString(8, "bob", "tom", "lisa"); /// /// string statement = qs.ToQueryString(); /// /// public interface IQueryStatement { /// /// Sets the designated parameter to the query name of the given type ID. /// /// the parameter index (one-based) /// the type ID void SetType(int parameterIndex, string typeId); /// /// Sets the designated parameter to the query name of the given type. /// /// the parameter index (one-based) /// the object type void SetType(int parameterIndex, IObjectType type); /// /// Sets the designated parameter to the query name of the given property. /// /// the parameter index (one-based) /// the type ID /// the property ID void SetProperty(int parameterIndex, string typeId, string propertyId); /// /// Sets the designated parameter to the query name of the given property. /// /// the parameter index (one-based) /// the property definition void SetProperty(int parameterIndex, IPropertyDefinition propertyDefinition); /// /// Sets the designated parameter to the given decimal. /// /// the parameter index (one-based) /// the number void SetInteger(int parameterIndex, params BigInteger[] num); /// /// Sets the designated parameter to the given string. /// /// the parameter index (one-based) /// the number void SetDecimal(int parameterIndex, params decimal[] num); /// /// Sets the designated parameter to the given string. /// /// the parameter index (one-based) /// the string void SetString(int parameterIndex, params string[] str); /// /// Sets the designated parameter to the given string. It does not escape /// backslashes ('\') in front of '%' and '_'. /// /// the parameter index (one-based) /// the LIKE string void SetStringLike(int parameterIndex, string str); /// /// Sets the designated parameter to the given string in a CMIS contains statement. /// /// /// Note that the CMIS specification requires two levels of escaping. The /// first level escapes ', ", \ characters to \', \" and \\. The characters /// *, ? and - are interpreted as text search operators and are not escaped /// on first level. If *, ?, - shall be used as literals, they must be passed /// escaped with \*, \? and \- to this method. /// /// For all statements in a CONTAINS() clause it is required to isolate those /// from a query statement. Therefore a second level escaping is performed. /// On the second level grammar ", ', - and \ are escaped with a \. See the /// spec for further details. /// /// /// Summary: /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// ///
inputfirst level escapingsecond level escaping
***
???
---
\\\\\\\
/// (for any other character following other than///?-)
\*\*\\*
\?\?\\?
\-\-\\-+
'\'\\\'
"\"\\\"
///
///
/// the parameter index (one-based) /// the CONTAINS string void SetStringContains(int parameterIndex, string str); /// /// Sets the designated parameter to the given object ID. /// /// the parameter index (one-based) /// the object ID void SetId(int parameterIndex, params IObjectId[] id); /// /// Sets the designated parameter to the given URI. /// /// the parameter index (one-based) /// the URI void SetUri(int parameterIndex, params Uri[] uri); /// /// Sets the designated parameter to the given boolean. /// /// the parameter index (one-based) /// the boolean void SetBoolean(int parameterIndex, params bool[] boolean); /// /// Sets the designated parameter to the given DateTime value. /// /// the parameter index (one-based) /// the DateTime value as Calendar object void SetDateTime(int parameterIndex, params DateTime[] dt); /// /// Sets the designated parameter to the given DateTime value. /// /// the parameter index (one-based) /// the DateTime value in milliseconds from midnight, January 1, 1970 UTC. void SetDateTime(int parameterIndex, params long[] ms); /// /// Sets the designated parameter to the given DateTime value with the prefix /// 'TIMESTAMP '. /// /// the parameter index (one-based) /// the DateTime value as Calendar object void SetDateTimeTimestamp(int parameterIndex, params DateTime[] dt); /// /// Sets the designated parameter to the given DateTime value with the prefix /// 'TIMESTAMP '. /// /// the parameter index (one-based) /// the DateTime value in milliseconds from midnight, January 1, 1970 UTC. void SetDateTimeTimestamp(int parameterIndex, params long[] ms); /// /// Returns the query statement. /// /// the query statement, not null string ToQueryString(); /// /// Executes the query. /// /// /// true if all document versions should be included in /// the search results, false if only the latest document /// versions should be included in the search results IItemEnumerable Query(bool searchAllVersions); /// /// Executes the query. /// /// /// true if all document versions should be included in /// the search results, false if only the latest document /// versions should be included in the search results /// the operation context to use IItemEnumerable Query(bool searchAllVersions, IOperationContext context); } /// /// Base interface for all CMIS types. /// public interface IObjectType : ITypeDefinition { /// /// Gets the base type. /// bool IsBaseType { get; } /// /// Gets the base type definition. /// IObjectType BaseType { get; } /// /// Returns the parent type definition. /// IObjectType ParentType { get; } /// /// Gets the list of types directly derived from this type. /// /// list of types which are directly derived from this type IItemEnumerable GetChildren(); /// /// Gets the list of all types somehow derived from this type. /// /// the tree depth, must be greater than 0 or -1 for infinite depth /// a list of trees of types which are derived from this type (direct and via their parents) IList> GetDescendants(int depth); } /// /// Document type interface. /// public interface IDocumentType : IObjectType { /// /// Gets the versionable flag. /// bool? IsVersionable { get; } /// /// Gets the content stream allowed flag. /// ContentStreamAllowed? ContentStreamAllowed { get; } } /// /// Folder type interface. /// public interface IFolderType : IObjectType { } /// /// Secondary type interface. /// public interface ISecondaryType : IObjectType { } /// /// Relationship type interface. /// public interface IRelationshipType : IObjectType { /// /// Gets the list of allowed source object types. /// IList GetAllowedSourceTypes { get; } /// /// Gets the list of allowed target object types. /// IList GetAllowedTargetTypes { get; } } /// /// Policy type interface. /// public interface IPolicyType : IObjectType { } /// /// Item type interface. /// public interface IItemType : IObjectType { } /// /// Enumerable that allows to skip and page. /// public interface IItemEnumerable : IEnumerable { /// /// Skips to position within the CMIS collection. /// /// the position /// IItemEnumerable whose starting point is the specified skip to position IItemEnumerable SkipTo(BigInteger position); /// /// Gets an IItemEnumerable for the current sub collection within /// the CMIS collection using default maximum number of items. /// /// IItemEnumerable for current page IItemEnumerable GetPage(); /// /// Gets an IItemEnumerable for the current sub collection within the CMIS collection. /// /// maximum number of items the sub collection will contain /// IItemEnumerable for current page IItemEnumerable GetPage(int maxNumItems); /// /// Gets the number of items fetched for the current page. /// BigInteger PageNumItems { get; } /// /// Gets whether the repository contains additional items beyond the page of items already fetched. /// bool HasMoreItems { get; } /// /// Gets the total number of items. If the repository knows the total number of items /// in a result set, the repository SHOULD include the number here. /// If the repository does not know the number of items in a result set, /// this parameter SHOULD not be set. The value in the parameter MAY NOT be /// accurate the next time the client retrieves the result set or the next page /// in the result set. /// BigInteger TotalNumItems { get; } } /// /// Object ID interface. /// public interface IObjectId { /// /// Gets the object ID. /// string Id { get; } } /// /// Rendition interface. /// public interface IRendition : IRenditionData { /// /// Returns the rendition document if the rendition is a stand-alone document. /// /// the rendition document or null if there is no rendition document IDocument GetRenditionDocument(); /// /// Returns the rendition document using the provided operation context if the rendition is a stand-alone document. /// /// the operation context /// the rendition document or null if there is no rendition document IDocument GetRenditionDocument(IOperationContext context); /// /// Returns the content stream of the rendition. /// /// the content stream of the rendition or null if the rendition has no content IContentStream GetContentStream(); } /// /// Property interface. /// public interface IProperty { /// /// Gets the property ID. /// string Id { get; } /// /// Gets the property local name. /// string LocalName { get; } /// /// Gets the property display name. /// string DisplayName { get; } /// /// Gets the property query name. /// string QueryName { get; } /// /// Gets whether this property is a multi-value property or not. /// bool IsMultiValued { get; } /// /// Gets the property type. /// PropertyType? PropertyType { get; } /// /// Gets the property definition. /// IPropertyDefinition PropertyDefinition { get; } /// /// Gets the property value. /// /// /// If the property is a single-value property the single value is returned. /// If the property is a multi-value property a IList<object> is returned. /// object Value { get; } /// /// Gets the value list of the property. /// /// /// If the property is a single-value property a list with one or no items is returned. /// IList Values { get; } /// /// Gets the first value of the value list or null if the list has no values. /// object FirstValue { get; } /// /// Gets a string representation of the first value of the value list. /// string ValueAsString { get; } /// ///Gets a string representation of the value list. /// string ValuesAsString { get; } } /// /// Collection of common CMIS properties. /// public interface ICmisObjectProperties { /// /// List of all available CMIS properties. /// IList Properties { get; } /// /// Gets a property by property ID. /// /// the property ID /// the property or null if the property is not available IProperty this[string propertyId] { get; } /// /// Gets the value of the requested property. /// /// the property ID /// the property value or null if the property is not available or not set object GetPropertyValue(string propertyId); /// /// Gets the value of the requested property and converts it to string. /// /// the property ID /// the property value or null if the property is not available or not set string GetPropertyAsStringValue(string propertyId); /// /// Gets the value of the requested property and converts it to long value. /// /// the property ID /// the property value or null if the property is not available or not set /// value is not in an appropriate format /// the conversion is not supported /// value represents a number that is less than Int64.MinValue or greater than Int64.MaxValue long? GetPropertyAsLongValue(string propertyId); /// /// Gets the value of the requested property and converts it to bool value. /// /// the property ID /// the property value or null if the property is not available or not set /// value is not in an appropriate format /// the conversion is not supported bool? GetPropertyAsBoolValue(string propertyId); /// /// Gets the value of the requested property and converts it to DateTime value. /// /// the property ID /// the property value or null if the property is not available or not set /// value is not in an appropriate format /// the conversion is not supported DateTime? GetPropertyAsDateTimeValue(string propertyId); /// /// Gets the name of this CMIS object (CMIS property cmis:name). /// string Name { get; } /// /// Gets the user who created this CMIS object (CMIS property cmis:createdBy). /// string CreatedBy { get; } /// /// Gets the timestamp when this CMIS object has been created (CMIS property cmis:creationDate). /// DateTime? CreationDate { get; } /// /// Gets the user who modified this CMIS object (CMIS property cmis:lastModifiedBy). /// string LastModifiedBy { get; } /// /// Gets the timestamp when this CMIS object has been modified (CMIS property cmis:lastModificationDate). /// DateTime? LastModificationDate { get; } /// /// Gets the ID of the base type of this CMIS object (CMIS property cmis:baseTypeId). /// BaseTypeId BaseTypeId { get; } /// /// Gets the base type of this CMIS object (object type identified by cmis:baseTypeId). /// IObjectType BaseType { get; } /// /// Gets the type of this CMIS object (object type identified by cmis:objectTypeId). /// IObjectType ObjectType { get; } /// /// Gets the change token (CMIS property cmis:changeToken). /// string ChangeToken { get; } /// /// Gets the secondary types. /// IList SecondaryTypes { get; } } /// /// Extension level. /// public enum ExtensionLevel { /// /// Object extensions. /// Object, /// /// Properties extensions. /// Properties, /// /// Allowable Actions extensions. /// AllowableActions, /// /// ACL extensions. /// Acl, /// /// Policies extensions. /// Policies, /// /// Change Event extensions. /// ChangeEvent } /// /// Base interface for all CMIS objects. /// public interface ICmisObject : IObjectId, ICmisObjectProperties { /// /// Gets the allowable actions if they have been fetched for this object. /// IAllowableActions AllowableActions { get; } /// /// Gets the relationships if they have been fetched for this object. /// IList Relationships { get; } /// /// Gets the ACL if it has been fetched for this object. /// IAcl Acl { get; } /// /// Checks whether the given allowable action is set or not. /// bool HasAllowableAction(PortCMIS.Enums.Action action); /// /// Deletes this object. /// /// /// If this object is a document, the whole version series is deleted. /// void Delete(); /// /// Deletes this object. /// /// if this object is a document this parameter defines if just this version or all versions should be deleted void Delete(bool allVersions); /// /// Updates the properties that are provided. /// /// the properties to update /// the updated object (a repository might have created a new object) ICmisObject UpdateProperties(IDictionary properties); /// /// Updates the properties that are provided. /// /// the properties to update /// indicates if the object should be refresh after the update /// the object ID of the updated object (a repository might have created a new object) IObjectId UpdateProperties(IDictionary properties, bool refresh); /// /// Renames the object. /// /// the new name /// the updated object (a repository might have created a new object) ICmisObject Rename(string newName); /// /// Renames the object. /// /// the new name /// indicates if the object should be refresh after the update /// the object ID of the updated object (a repository might have created a new object) IObjectId Rename(string newName, bool refresh); /// /// Gets the renditions if they have been fetched for this object. /// IList Renditions { get; } /// /// Applies the given policies to the object. /// void ApplyPolicy(params IObjectId[] policyId); /// /// Removes the given policies from the object. /// void RemovePolicy(params IObjectId[] policyId); /// /// Gets a list of policies applied to this object. /// IList Policies { get; } /// /// Adds and removes ACEs to this object. /// /// the new ACL of this object IAcl ApplyAcl(IList addAces, IList removeAces, AclPropagation? aclPropagation); /// /// Adds ACEs to this object. /// /// the new ACL of this object IAcl AddAcl(IList addAces, AclPropagation? aclPropagation); /// /// Removes ACEs from this object. /// /// the new ACL of this object IAcl RemoveAcl(IList removeAces, AclPropagation? aclPropagation); /// /// Gets the extensions of the given level. /// IList GetExtensions(ExtensionLevel level); /// /// The timestamp of the last refresh. /// DateTime RefreshTimestamp { get; } /// /// Reloads the data from the repository. /// void Refresh(); /// /// Reloads the data from the repository if the last refresh did not occur within durationInMillis. /// void RefreshIfOld(long durationInMillis); } /// /// Base interface for all fileable CMIS objects. /// public interface IFileableCmisObject : ICmisObject { /// /// Moves this object from a source folder to a target folder. /// /// the source folder ID /// the target folder ID /// the object in the new location IFileableCmisObject Move(IObjectId sourceFolderId, IObjectId targetFolderId); /// /// Gets a list of all parent folders. /// /// /// Returns an empty list if it is an unfiled object or the root folder. /// IList Parents { get; } /// /// All paths for this object /// /// /// Returns an empty list for unfiled objects. /// IList Paths { get; } /// /// Adds this object to the given folder. /// /// the ID of the target folder /// indicates if only this object or all versions of the object should be added void AddToFolder(IObjectId folderId, bool allVersions); /// /// Removes this object from the given folder. /// /// the ID of the folder void RemoveFromFolder(IObjectId folderId); } /// /// Document properties. /// public interface IDocumentProperties { /// /// Gets if this CMIS object is immutable (CMIS property cmis:isImmutable). /// bool? IsImmutable { get; } /// /// Gets if this CMIS object is the latest version (CMIS property cmis:isLatestVersion) /// bool? IsLatestVersion { get; } /// /// Gets if this CMIS object is the latest version (CMIS property cmis:isMajorVersion). /// bool? IsMajorVersion { get; } /// /// Gets if this CMIS object is the latest major version (CMIS property cmis:isLatestMajorVersion). /// bool? IsLatestMajorVersion { get; } /// /// Gets the version label (CMIS property cmis:versionLabel). /// string VersionLabel { get; } /// /// Gets the version series ID (CMIS property cmis:versionSeriesId). /// string VersionSeriesId { get; } /// /// Gets if this version series is checked out (CMIS property cmis:isVersionSeriesCheckedOut). /// bool? IsVersionSeriesCheckedOut { get; } /// /// Gets the user who checked out this version series (CMIS property cmis:versionSeriesCheckedOutBy). /// string VersionSeriesCheckedOutBy { get; } /// /// Gets the PWC ID of this version series (CMIS property cmis:versionSeriesCheckedOutId). /// string VersionSeriesCheckedOutId { get; } /// /// Gets the checkin comment (CMIS property cmis:checkinComment). /// string CheckinComment { get; } /// /// Gets the content stream length or null if the document has no content (CMIS property cmis:contentStreamLength). /// long? ContentStreamLength { get; } /// /// Gets the content stream MIME type or null if the document has no content (CMIS property cmis:contentStreamMimeType). /// string ContentStreamMimeType { get; } /// /// Gets the content stream filename or null if the document has no content (CMIS property cmis:contentStreamFileName). /// string ContentStreamFileName { get; } /// /// Gets the content stream ID or null if the document has no content (CMIS property cmis:contentStreamId). /// string ContentStreamId { get; } /// /// Gets the content stream hashes or null if the document has no content or the repository hasn't provided content hashes (CMIS property cmis:contentStreamHash). /// IList ContentStreamHashes { get; } } /// /// Document interface. /// public interface IDocument : IFileableCmisObject, IDocumentProperties { /// /// Deletes all versions of this document. /// void DeleteAllVersions(); /// /// Gets the content stream of this document. /// /// the content stream or null if the document has no content IContentStream GetContentStream(); /// /// Gets the content stream identified by the given stream ID. /// /// the content stream or null if the stream ID is not associated with content IContentStream GetContentStream(string streamId); /// /// Gets the content stream identified by the given stream ID with the given offset and length. /// /// the content stream or null if the stream ID is not associated with content IContentStream GetContentStream(string streamId, long? offset, long? length); /// /// Sets a new content stream for this document. /// /// the content stream /// indicates if the current stream should be overwritten /// the new document object /// /// Repositories might create a new version if the content is updated. /// IDocument SetContentStream(IContentStream contentStream, bool overwrite); /// /// Sets a new content stream for this document. /// /// the content stream /// indicates if the current stream should be overwritten /// indicates if this object should be refreshed after the new content is set /// the new document object ID /// /// Repositories might create a new version if the content is updated. /// IObjectId SetContentStream(IContentStream contentStream, bool overwrite, bool refresh); /// /// Appends a content stream for this document. /// /// the content stream /// indicates if the current stream should be the last trunk /// the new document object /// /// Repositories might create a new version if the content is appended. /// IDocument AppendContentStream(IContentStream contentStream, bool isLastChunk); /// /// Appends a content stream for this document. /// /// the content stream /// indicates if the current stream should be the last trunk /// indicates if this object should be refreshed after the new content is set /// the new document object ID /// /// Repositories might create a new version if the content is appended. /// IObjectId AppendContentStream(IContentStream contentStream, bool isLastChunk, bool refresh); /// /// Deletes the current content stream for this document. /// /// the new document object /// /// Repositories might create a new version if the content is deleted. /// IDocument DeleteContentStream(); /// /// Deletes the current content stream for this document. /// /// indicates if this object should be refreshed after the content is deleted /// the new document object ID /// /// Repositories might create a new version if the content is deleted. /// IObjectId DeleteContentStream(bool refresh); /// /// Checks out this document. /// /// the object ID of the newly created private working copy (PWC). IObjectId CheckOut(); /// /// Cancels the check out. /// void CancelCheckOut(); /// /// Checks in this private working copy (PWC). /// /// the object ID of the new created document IObjectId CheckIn(bool major, IDictionary properties, IContentStream contentStream, string checkinComment, IList policies, IList addAces, IList removeAces); /// /// Checks in this private working copy (PWC). /// /// the object ID of the new created document IObjectId CheckIn(bool major, IDictionary properties, IContentStream contentStream, string checkinComment); /// /// Fetches the latest major or minor version of this document. /// /// indicates if the latest major or the very last version should be returned /// the latest document object IDocument GetObjectOfLatestVersion(bool major); /// /// Fetches the latest major or minor version of this document with the given operation context. /// /// indicates if the latest major or the very last version should be returned /// the operation context /// the latest document object IDocument GetObjectOfLatestVersion(bool major, IOperationContext context); /// /// Gets a list of all versions in this version series. /// IList GetAllVersions(); /// /// Gets a list of all versions in this version series using the given operation context. /// IList GetAllVersions(IOperationContext context); /// /// Creates a copy of this document, including content. /// /// the new document object IDocument Copy(IObjectId targetFolderId); /// /// Creates a copy of this document, including content. /// /// the new document object IDocument Copy(IObjectId targetFolderId, IDictionary properties, VersioningState? versioningState, IList policies, IList addACEs, IList removeACEs, IOperationContext context); } /// /// Folder properties. /// public interface IFolderProperties { /// /// Gets the parent ID. /// string ParentId { get; } /// /// Gets the list of allowable child object types. /// IList AllowedChildObjectTypes { get; } } /// /// Folder interface. /// public interface IFolder : IFileableCmisObject, IFolderProperties { /// /// Creates a new document in this folder. /// /// the new document object IDocument CreateDocument(IDictionary properties, IContentStream contentStream, VersioningState? versioningState, IList policies, IList addAces, IList removeAces, IOperationContext context); /// /// Creates a new document in this folder. /// /// the new document object IDocument CreateDocument(IDictionary properties, IContentStream contentStream, VersioningState? versioningState); /// /// Creates a new document from a source document in this folder. /// /// the new document object IDocument CreateDocumentFromSource(IObjectId source, IDictionary properties, VersioningState? versioningState, IList policies, IList addAces, IList removeAces, IOperationContext context); /// /// Creates a new document from a source document in this folder. /// /// the new document object IDocument CreateDocumentFromSource(IObjectId source, IDictionary properties, VersioningState? versioningState); /// /// Creates a new subfolder in this folder. /// /// the new folder object IFolder CreateFolder(IDictionary properties, IList policies, IList addAces, IList removeAces, IOperationContext context); /// /// Creates a new subfolder in this folder. /// /// the new folder object IFolder CreateFolder(IDictionary properties); /// /// Creates a new policy in this folder. /// /// the new policy object IPolicy CreatePolicy(IDictionary properties, IList policies, IList addAces, IList removeAces, IOperationContext context); /// /// Creates a new policy in this folder. /// /// the new policy object IPolicy CreatePolicy(IDictionary properties); /// /// Creates a new item in this folder. /// /// the new item object IItem CreateItem(IDictionary properties, IList policies, IList addAces, IList removeAces, IOperationContext context); /// /// Creates a new item in this folder. /// /// the new item object IItem CreateItem(IDictionary properties); /// /// Deletes this folder and all subfolders. /// /// a flag whether all versions or just the filed version of a document should be deleted /// defines the unfiling behavoir /// a flag whether the operation should continue if an error occurs or not /// a list of object IDs which failed to be deleted IList DeleteTree(bool allversions, UnfileObject? unfile, bool continueOnFailure); /// /// Gets the folder tress of this folder (only folder). /// /// the depth /// a list of folder trees /// /// If depth == 1 only objects that are children of this folder are returned. /// If depth > 1 only objects that are children of this folder and descendants up to "depth" levels deep are returned. /// If depth == -1 all descendant objects at all depth levels in the CMIS hierarchy are returned. /// IList> GetFolderTree(int depth); /// /// Gets the folder tress of this folder (only folder) using the given . /// /// the depth /// the /// a list of folder trees /// /// If depth == 1 only objects that are children of this folder are returned. /// If depth > 1 only objects that are children of this folder and descendants up to "depth" levels deep are returned. /// If depth == -1 all descendant objects at all depth levels in the CMIS hierarchy are returned. /// IList> GetFolderTree(int depth, IOperationContext context); /// /// Gets the descendants of this folder (all filable objects). /// /// the depth /// a list of descendant trees /// /// If depth == 1 only objects that are children of this folder are returned. /// If depth > 1 only objects that are children of this folder and descendants up to "depth" levels deep are returned. /// If depth == -1 all descendant objects at all depth levels in the CMIS hierarchy are returned. /// IList> GetDescendants(int depth); /// /// Gets the descendants of this folder (all filable objects) using the given . /// /// the depth /// the /// a list of descendant trees /// /// If depth == 1 only objects that are children of this folder are returned. /// If depth > 1 only objects that are children of this folder and descendants up to "depth" levels deep are returned. /// If depth == -1 all descendant objects at all depth levels in the CMIS hierarchy are returned. /// IList> GetDescendants(int depth, IOperationContext context); /// /// Gets the children of this folder. /// IItemEnumerable GetChildren(); /// /// Gets the children of this folder using the given . /// IItemEnumerable GetChildren(IOperationContext context); /// /// Gets if this folder is the root folder. /// bool IsRootFolder { get; } /// /// Gets the parent of this folder or null if this folder is the root folder. /// IFolder FolderParent { get; } /// /// Gets the path of this folder. /// string Path { get; } /// /// Returns all checked out documents in this folder. /// /// the checked out documents IItemEnumerable GetCheckedOutDocs(); /// /// Returns all checked out documents in this folder using the given operation context. /// /// the operation context /// the checked out documents IItemEnumerable GetCheckedOutDocs(IOperationContext context); } /// /// Policy properties. /// public interface IPolicyProperties { /// /// Gets the policy text of this CMIS policy (CMIS property cmis:policyText). /// string PolicyText { get; } } /// /// Policy interface. /// public interface IPolicy : IFileableCmisObject, IPolicyProperties { } /// /// Relationship properties. /// public interface IRelationshipProperties { /// /// Gets the ID of the relationship source object. /// IObjectId SourceId { get; } /// /// Gets the ID of the relationships target object. /// IObjectId TargetId { get; } } /// /// Relationship interface. /// public interface IRelationship : ICmisObject, IRelationshipProperties { /// /// Gets the relationship source object. /// /// /// If the source object ID is invalid, null will be returned. /// ICmisObject GetSource(); /// /// Gets the relationship source object using the given . /// /// /// If the source object ID is invalid, null will be returned. /// ICmisObject GetSource(IOperationContext context); /// /// Gets the relationship target object. /// /// /// If the target object ID is invalid, null will be returned. /// ICmisObject GetTarget(); /// /// Gets the relationship target object using the given . /// /// /// If the target object ID is invalid, null will be returned. /// ICmisObject GetTarget(IOperationContext context); } /// /// Item properties. /// public interface ItemProperties { } /// /// Item interface. /// public interface IItem : IFileableCmisObject, ItemProperties { } /// /// Content hash. /// public interface IContentStreamHash { /// /// Gets the content stream hash property value. /// string PropertyValue { get; } /// /// Gets the hash algorithm. /// string Algorithm { get; } /// /// Gets the hash value. /// string Hash { get; } } /// /// Query result. /// public interface IQueryResult { /// /// Gets the property. /// /// the property's query name or alias IPropertyData this[string queryName] { get; } /// /// Gets the list of all properties in this query result. /// IList Properties { get; } /// /// Returns a property by ID. /// /// the property ID /// /// Since repositories are not obligated to add property IDs to their /// query result properties, this method might not always work as expected with /// some repositories. Use instead. /// IPropertyData GetPropertyById(string propertyId); /// /// Gets the property (single) value by query name or alias. /// object GetPropertyValueByQueryName(string queryName); /// /// Gets the property (single) value by property ID. /// object GetPropertyValueById(string propertyId); /// /// Gets the property value by query name or alias. /// IList GetPropertyMultivalueByQueryName(string queryName); /// /// Gets the property value by property ID. /// IList GetPropertyMultivalueById(string propertyId); /// /// Gets the allowable actions if they were requested. /// IAllowableActions AllowableActions { get; } /// /// Gets the relationships if they were requested. /// IList Relationships { get; } /// /// Gets the renditions if they were requested. /// IList Renditions { get; } } /// /// A change event. /// public interface IChangeEvent : IChangeEventInfo { /// /// Gets the object ID. /// string ObjectId { get; } /// /// Gets the object properties, if provided. /// IDictionary> Properties { get; } /// /// Gets the policy IDs, if provided. /// IList PolicyIds { get; } /// /// Gets the ACL, if provided. /// IAcl Acl { get; } } /// /// A collection of change events. /// public interface IChangeEvents { /// /// Gets the latest change log token. /// string LatestChangeLogToken { get; } /// /// Gets the list of change events. /// IList ChangeEventList { get; } /// /// Gets the hasMoreItems flag, if provided. /// bool? HasMoreItems { get; } /// /// Gets the total number of change events, if provided. /// BigInteger? TotalNumItems { get; } } }