/*
 * Copyright (C) 2009 eXo Platform SAS.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.exoplatform.services.jcr.impl.storage.value.cas;

import org.exoplatform.services.jcr.config.RepositoryConfigurationException;

import java.util.List;
import java.util.Properties;

/**
 * Created by The eXo Platform SAS .
 * 
 * Some concept description from Wikipedia: CAS system records a content address, which is an
 * identifier uniquely and permanently linked to the information content itself. A request to
 * retrieve information from a CAS system must provide the content identifier, from which the system
 * can determine the physical location of the data and retrieve it. Because the identifiers are
 * based on content, any change to a data element will necessarily change its content address. In
 * nearly all cases, a CAS device will not permit editing information once it has been stored.
 * Whether it can be deleted is often controlled by a policy.
 * 
 * Storage for content addresses. Physically content address is presented as ValueData content
 * checksum, assuming that here are no collisions in checksum calculation (i.e. an address is unique
 * for given content)
 * 
 * @author Gennady Azarenkov
 * @version $Id: ValueContentAddressStorage.java 34801 2009-07-31 15:44:50Z dkatayev $
 */

public interface ValueContentAddressStorage
{

   static final String DIGEST_ALGO_PARAM = "digest-algo";

   static final String VCAS_TYPE_PARAM = "vcas-type";

   /**
    * Deletes the address for given Property.
    * 
    * @param propertyId String Property ID
    * @throws RecordNotFoundException if Record not found
    */
   void deleteProperty(String propertyId) throws RecordNotFoundException, VCASException;

   /**
    * Deletes the address for given Property Value.
    * 
    * @param propertyId String Property ID
    * @param orderNum int
    * @throws RecordNotFoundException if Record not found
    */
   void deleteValue(String propertyId, int orderNumb) throws RecordNotFoundException, VCASException;

   /**
    * Add Property Value address record to the storage.
    * 
    * @param propertyId String Property ID
    * @param orderNum int
    * @param identifier CAS ID (hash)
    * @throws RecordAlreadyExistsException
    *           if such propertyId/orderNumber already exists in storage
    */
   void addValue(String propertyId, int orderNum, String identifier) throws RecordAlreadyExistsException, VCASException;

   /**
    * Return CAS Identifier (address) by given property id and value order number.
    * 
    * @param propertyId
    * @param orderNum
    * @return identifier - content address
    * @throws RecordNotFoundException
    *           if no item found
    */
   String getIdentifier(String propertyId, int orderNum) throws RecordNotFoundException, VCASException;

   /**
    * Return identifiers (addresses) list for the given property.<br/>
    * 
    * @param propertyId
    *          - property id
    * @param ownOnly
    *          - boolean, if true the list will contains only owned values, false - all, including
    *          shared
    * @return identifiers - content address list
    */
   List<String> getIdentifiers(String propertyId, boolean ownOnly) throws RecordNotFoundException, VCASException;

   /**
    * Tell if given property shares content with other properties.<br/>
    * 
    * NOTE: not used now.
    * 
    * @param propertyId
    * @return boolean flag, true if given property shares content with other properties
    */
   boolean hasSharedContent(String propertyId) throws RecordNotFoundException, VCASException;

   /**
    * Initializes values CAS.
    * 
    * @param props
    * @throws VCASException
    */
   void init(Properties props) throws RepositoryConfigurationException, VCASException;
}
