content: /*
   *
   * 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.commons.server;
  
  import java.util.List;
  
  import org.apache.chemistry.opencmis.commons.data.Acl;
  import org.apache.chemistry.opencmis.commons.data.ContentStream;
  import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
  import org.apache.chemistry.opencmis.commons.data.Properties;
  import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
  import org.apache.chemistry.opencmis.commons.enums.VersioningState;
  import org.apache.chemistry.opencmis.commons.spi.AclService;
  import org.apache.chemistry.opencmis.commons.spi.DiscoveryService;
  import org.apache.chemistry.opencmis.commons.spi.MultiFilingService;
  import org.apache.chemistry.opencmis.commons.spi.NavigationService;
  import org.apache.chemistry.opencmis.commons.spi.ObjectService;
  import org.apache.chemistry.opencmis.commons.spi.PolicyService;
  import org.apache.chemistry.opencmis.commons.spi.RelationshipService;
  import org.apache.chemistry.opencmis.commons.spi.RepositoryService;
  import org.apache.chemistry.opencmis.commons.spi.VersioningService;
  
  /**
   * OpenCMIS server interface.
   * 
   * <p>
   * <em>
   * See CMIS 1.0 and CMIS 1.1 specifications for details on the operations, parameters,
   * exceptions and the domain model.
   * </em>
   * </p>
   * 
   * <p>
   * This interface adds a few more operations to the operation set defined by
   * CMIS to address binding specific requirements.
   * </p>
   */
  public interface CmisService extends RepositoryService, NavigationService, ObjectService, VersioningService,
          DiscoveryService, MultiFilingService, RelationshipService, AclService, PolicyService {
  
      /**
       * Creates a new document, folder, policy, or item.
       * 
       * The property "cmis:objectTypeId" defines the type and implicitly the base
       * type.
       * 
       * @param repositoryId
       *            the identifier for the repository
       * @param properties
       *            the property values that MUST be applied to the newly created
       *            object
       * @param folderId
       *            <em>(optional)</em> if specified, the identifier for the
       *            folder that MUST be the parent folder for the newly created
       *            object
       * @param contentStream
       *            <em>(optional)</em> if the object to create is a document
       *            object, the content stream that MUST be stored for the newly
       *            created document object
       * @param versioningState
       *            <em>(optional)</em> if the object to create is a document
       *            object, it specifies what the versioning state of the newly
       *            created object MUST be (default is
       *            {@link VersioningState#MAJOR})
       * @param policies
       *            <em>(optional)</em> a list of policy IDs that MUST be applied
       *            to the newly created object
       * @param extension
       *            extension data
       * @return the object ID of the newly created object
       */
      String create(String repositoryId, Properties properties, String folderId, ContentStream contentStream,
              VersioningState versioningState, List<String> policies, ExtensionsData extension);
  
      /**
       * Deletes an object or cancels a check out.
       * 
       * For the Web Services binding this is always an object deletion. For the
       * AtomPub it depends on the referenced object. If it is a checked out
       * document then the check out must be canceled. If the object is not a
       * checked out document then the object must be deleted.
       * 
       * @param repositoryId
       *            the identifier for the repository
       * @param objectId
       *            the identifier for the object
       * @param allVersions
       *            <em>(optional)</em> If {@code true} then delete all versions
       *            of the document, otherwise delete only the document object
       *            specified (default is {@code true})
       * @param extension
       *            extension data
       */
      void deleteObjectOrCancelCheckOut(String repositoryId, String objectId, Boolean allVersions,
              ExtensionsData extension);
  
      /**
       * Applies a new ACL to an object.
       * 
       * Since it is not possible to transmit an "add ACL" and a "remove ACL" via
       * AtomPub, the merging has to be done the client side. The ACEs provided
       * here is supposed to the new complete ACL.
       * 
       * @param repositoryId
       *            the identifier for the repository
       * @param objectId
       *            the identifier for the object
       * @param aces
       *            the ACEs that should replace the current ACL of the object
       * @param aclPropagation
       *            <em>(optional)</em> specifies how ACEs should be handled
       *            (default is {@link AclPropagation#REPOSITORYDETERMINED})
       * @return new ACL
       */
      Acl applyAcl(String repositoryId, String objectId, Acl aces, AclPropagation aclPropagation);
  
      /**
       * Returns the {@link ObjectInfo} of the given object id or {@code null} if
       * no object info exists.
       * 
       * Only AtomPub requests will require object infos.
       * 
       * @param repositoryId
       *            the identifier for the repository
       * @param objectId
       *            the identifier for the object
       * @return the object info
       */
      ObjectInfo getObjectInfo(String repositoryId, String objectId);
  
      /**
       * Signals that this object will not be used anymore and resources can
       * released.
       */
      void close();
  }
  