/*
 * 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.oodt.cas.filemgr.repository;

//OODT imports
import org.apache.oodt.cas.filemgr.structs.Product;
import org.apache.oodt.cas.filemgr.structs.ProductType;
import org.apache.oodt.cas.filemgr.structs.exceptions.RepositoryManagerException;

//JDK imports
import java.util.List;

/**
 * @author mattmann
 * @author bfoster
 * @version $Revision$
 * 
 * A Repository Manager is an extension point that is responsible for managing
 * {@link ProductType} information which boils down to policy information about
 * {@link Product}s that are ingested into the File Manager. This includes
 * information such as the root repository path for a product type, what type of
 * URI generation scheme to apply, etc.
 * </p>
 * 
 */
public interface RepositoryManager {

    /* extension point ID */
    public static String X_POINT_ID = RepositoryManager.class.getName();

    /**
     * <p>
     * Adds a ProductType to the RepositoryManager.
     * </p>
     * 
     * @param productType
     *            The {@link ProductType} to add.
     * @throws RepositoryManagerException
     */
    public void addProductType(ProductType productType)
            throws RepositoryManagerException;

    /**
     * <p>
     * Modifies a ProductType in the RepositoryManager with the specified ID
     * field of the <code>productType</code>.
     * </p>
     * 
     * @param productType
     *            The new {@link ProductType} information.
     * @throws RepositoryManagerException
     *             If any error occurs.
     */
    public void modifyProductType(ProductType productType)
            throws RepositoryManagerException;

    /**
     * <p>
     * Removes a ProductType from the RepositoryManager
     * </p>.
     * 
     * @param productType
     *            The productType to remove.
     * @throws RepositoryManagerException
     *             If any error occurs during the removal.
     */
    public void removeProductType(ProductType productType)
            throws RepositoryManagerException;

    /**
     * <p>
     * Gets a {link ProductType} from the RepositoryManager identified by its
     * <code>productTypeId</code>.
     * </p>
     * 
     * @param productTypeId
     *            The ID of the ProductType to retrieve.
     * @return The {@link ProductType} corresponding to the specified
     *         <code>productTypeId</code>.
     * @throws RepositoryManagerException
     *             If any error occurs.
     */
    public ProductType getProductTypeById(String productTypeId)
            throws RepositoryManagerException;

    /**
     * <p>
     * Gets a {@link ProductType} specified by its <code>productTypeName</code>,
     * from the RepositoryManager.
     * </p>
     * 
     * @param productTypeName
     *            The name of the ProductType to get.
     * @return A {@link ProductType}, with the specified name.
     * @throws RepositoryManagerException
     *             If any error occurs.
     */
    public ProductType getProductTypeByName(String productTypeName)
            throws RepositoryManagerException;

    /**
     * <p>
     * Gets all the {@link ProductType}s from the repository.
     * </p>
     * 
     * @return A {@link List} of {@link ProductType}s from the repository.
     * @throws RepositoryManagerException
     *             If any error occurs.
     */
    public List<ProductType> getProductTypes() throws RepositoryManagerException;
}
