/*
 * 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.validation;

//OODT imports
import org.apache.oodt.cas.filemgr.structs.Element;
import org.apache.oodt.cas.filemgr.structs.ProductType;
import org.apache.oodt.cas.filemgr.structs.exceptions.ValidationLayerException;

//JDK imports
import java.util.List;

/**
 * @author mattmann
 * @author bfoster
 * @version $Revision$
 * 
 * <p>
 * The Validation Layer for the File Manager, allowing {@link Element}s to be
 * mapped to {@link ProductType}s.
 * </p>
 * 
 */
public interface ValidationLayer {

    /**
     * <p>
     * Adds the <code>Element</code> to the ValidationLayer.
     * </p>
     * 
     * @param element
     *            The element to add.
     * @throws ValidationLayerException
     *             If any error occurs during the add.
     */
    public void addElement(Element element) throws ValidationLayerException;

    /**
     * <p>
     * Modifies an existing {@link Element} in the ValidationLayer.
     * </p>
     * 
     * @param element
     *            The new {@link Element} data to update.
     * @throws ValidationLayerException
     *             If any error occurs.
     */
    public void modifyElement(Element element) throws ValidationLayerException;

    /**
     * <p>
     * Removes a metadata {@link Element} from the ValidationLayer.
     * 
     * @param element
     *            The element to remove.
     * @throws ValidationLayerException
     *             If any error occurs.
     */
    public void removeElement(Element element) throws ValidationLayerException;

    /**
     * <p>
     * Adds the specified <code>element</code> to the {@link ProductType}
     * specified by its <code>productTypeId</code>.
     * 
     * @param type
     *            The {@link ProductType} to associate the metadata Element
     *            with.
     * @param element
     *            The {@link Element} to associate with the ProductType.
     * @throws ValidationLayerException
     *             If any error occurs.
     */
    public void addElementToProductType(ProductType type, Element element)
            throws ValidationLayerException;

    /**
     * <p>
     * Removes a metadata {@link Element} from the specified
     * <code>productTypeId</code>.
     * </p>
     * 
     * @param type
     *            The {@link ProductType} to remove the association of the
     *            specified <code>element</code> with.
     * @param element
     *            The element whose association will be removed from the
     *            specified ProductType.
     * @throws ValidationLayerException
     *             If any error occurs.
     */
    public void removeElementFromProductType(ProductType type, Element element)
            throws ValidationLayerException;

    /**
     * <p>
     * Returns a {@link List} of {@link Element}s corresponding to the given
     * ProductType.
     * 
     * @param type
     *            The product type to retrieve the metadata {@link Element}s
     *            for.
     * @return A {@link List} of {@link Element}s corresponding to the given
     *         ProductType.
     * @throws ValidationLayerException
     *             If any error occurs.
     */
    public List<Element> getElements(ProductType type)
            throws ValidationLayerException;

    /**
     * @return A {@link List} of all the metadata {@link Element}s in the
     *         ValidationLayer.
     * @throws ValidationLayerException
     *             If any error occurs.
     */
    public List<Element> getElements() throws ValidationLayerException;

    /**
     * Gets an element by its String identifier.
     * 
     * @param elementId
     *            The String identifier of the {@link Element} to get.
     * @return An {@link Element} by its String identifier.
     * @throws ValidationLayerException
     *             If any error occurs.
     */
    public Element getElementById(String elementId)
            throws ValidationLayerException;

    /**
     * Gets an element by its String name.
     * 
     * @param elementName
     *            The String name of the {@link Element} to get.
     * @return An {@link Element} by its String name.
     * @throws ValidationLayerException
     *             If any error occurs.
     */
    public Element getElementByName(String elementName)
            throws ValidationLayerException;

}
