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.inmemory.storedobj.api;
  
  import java.util.GregorianCalendar;
  import java.util.List;
  import java.util.Map;
  
  import org.apache.chemistry.opencmis.commons.data.AllowableActions;
  import org.apache.chemistry.opencmis.commons.data.PropertyData;
  import org.apache.chemistry.opencmis.commons.server.CallContext;
  import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
  
  /**
   * Stored Object interface is common part that all objects handled by CMIS
   * (Documents, Folders, Relations, Policies, ACLs) share. Objects that implement
   * this interface are always concrete and can live in the object store. A stored
   * object always has an id, a name and properties.
   * 
   */
  public interface StoredObject {
  
      /**
       * Retrieve the id of this object.
       * 
       * @return id of this object
       */
      String getId();
  
      /**
       * Set the id of this object.
       * 
       * @param id
       *            id of this object
       */
      void setId(String id);
  
      /**
       * Retrieve the name of this object.
       * 
       * @return name of this object
       */
      String getName();
  
      /**
       * Set the name of this document. This method does not persist the object.
       * 
       * @param name
       *            name that is assigned to this object
       */
      void setName(String name);
  
      /**
       * Retrieve the type of this document.
       * 
       * @return Id of the type identifying the type of this object
       */
      String getTypeId();
  
      /**
       * Set the type of this document. This method does not persist the object.
       * 
       * @param type
       *            id of the type this object gets assigned.
       */
      void setTypeId(String type);
  
      /**
       * CMIS 1.1 get ids of all secondary types.
       * 
       * @return list of type ids
       */
      List<String> getSecondaryTypeIds();
  
      /**
       * CMIS 1.1: set description of an object.
       * 
       * @param description
       *            description of this object
       */
      void setDescription(String description);
  
      /**
       * CMIS 1.1: get description of an object.
       * 
       * @return description of this object
       */
      String getDescription();
  
      /**
       * Retrieve the user who created the document.
       * 
       * @return user who created the document.
       */
      String getCreatedBy();
  
      /**
       * Set the user who last modified the object. This method does not persist.
       * the object.
       * 
       * @param createdBy
       *            user who last modified the document
       */
      void setCreatedBy(String createdBy);
  
      /**
       * Retrieve the user who last modified the document.
       * 
       * @return user who last modified the document.
       */
      String getModifiedBy();
  
      /**
       * Set the user who last modified the object. This method does not persist.
       * the object.
       * 
       * @param modifiedBy
       *            user who last modified the document
       */
      void setModifiedBy(String modifiedBy);
  
      /**
       * Get the creation date.
       * 
       * @return date the object was created at
       */
      GregorianCalendar getCreatedAt();
  
      /**
       * Assign date and time when the object was created. Usually you should not
       * call this method externally. This method does not persist the object.
       * 
       * @param createdAt
       *            date the object was created at
       */
      void setCreatedAt(GregorianCalendar createdAt);
  
      /**
       * Retrieve date and time when the object was last modified.
       * 
       * @return date the object was last modified
       */
      GregorianCalendar getModifiedAt();
  
      /**
       * Assign current date and time when the object was last modified. Usually
       * you should not call this method externally. This method does not persist
       * the object.
       */
      void setModifiedAtNow();
  
      /**
       * Set the date and time of the last modification of this object.
       * 
       * @param calendar
       *            timestamp of last modification
       */
      void setModifiedAt(GregorianCalendar calendar);
  
      /**
       * Get the repository id of this object where the object is stored.
       * 
       * @return
       *      repository id of this object
       */
      String getRepositoryId();
  
      /**
       * Assign a repository where this object will be stored. This method does
       * not persist the object.
       * 
       * @param repositoryId
       *            id of the repository
       */
      void setRepositoryId(String repositoryId);
  
      /**
       * Retrieve the list of properties.
       * 
       * @return map of properties
       */
      Map<String, PropertyData<?>> getProperties();
  
      /**
       * Assign the properties to an object. This method does not persist the
       * object.
       * 
       * @param props
       *            properties to be assigned
       */
      void setProperties(Map<String, PropertyData<?>> props);
  
      /**
       * Retrieve a change token uniquely identifying the state of the object when
       * it was persisted (used for optimistic locking).
       * 
       * @return String identifying the change token
       */
      String getChangeToken();
  
      /**
       * Create all system base properties that need to be stored with every
       * object in the repository This method is called when a new object is
       * created to record all of the capturing data like the creation time,
       * creator etc.
       * 
       * @param properties
       *            The properties passed by the client, containing, name, type,
       *            etc
       * @param user
       *            The user creating the document
       */
      void createSystemBasePropertiesWhenCreated(Map<String, PropertyData<?>> properties, String user);
  
      /**
       * Update all system base properties that need to be stored with every
       * object in the repository This method is called when an object is is
       * updated to record all of the capturing data like the modification time,
       * updating user etc.
       * 
       * @param properties
       *            The properties passed by the client, containing, name, type,
       *            etc
       * @param user
       *            The user creating the document
       */
      void updateSystemBasePropertiesWhenModified(Map<String, PropertyData<?>> properties, String user);
  
      /**
       * fill a passed map object with properties of this object.
       * 
       * @param properties
       *            map to fill
       * @param objFactory
       *            object factory to create objects
       * @param requestedIds
       *            list of property ids being requested
       */
      void fillProperties(Map<String, PropertyData<?>> properties, BindingsObjectFactory objFactory,
              List<String> requestedIds);
  
      /**
       * Set all properties which are not system properties. These are the
       * properties as defined in Type system definition. This method is called
       * when an object is created or updated. The implementation must ignore the
       * system properties.
       * 
       * @param properties
       *            Set of properties as set by the client, including system
       *            parameters
       */
      void setCustomProperties(Map<String, PropertyData<?>> properties);
  
      /**
       * get the Acl id of the stored object.
       * 
       * @return acl id of the ACl of this object
       */
      int getAclId();
  
      /**
       * get the allowable actions of the object.
       * 
       * @param context
       *            call context of this call
       * @param user
       *            user requesting allowable actions
       * @return allowable actions of this object for the use
       */
      AllowableActions getAllowableActions(CallContext context, String user);
  
      /**
       * check if the document can generate a renditions and rendition is visible
       * for user.
       * 
       * @param user
       *            user requesting allowable actions
       * @return true if rendition exists, false if not.
       */
      boolean hasRendition(String user);
  
      /**
       * get applied policies of this object.
       * 
       * @return list of ids of policies applied to this object
       */
      List<String> getAppliedPolicies();
  
      /**
       * add an id of a policy to an object.
       * 
       * @param policyId
       *            id of policy to add
       */
      void addAppliedPolicy(String policyId);
  
      /**
       * remove an id of a policy from an object.
       * 
       * @param policyId
       *            id of policy to remove
       */
      void removePolicy(String policyId);
  
  }