/*
 *    GeoTools - OpenSource mapping toolkit
 *    http://geotools.org
 *    (C) 2004-2006, Geotools Project Managment Committee (PMC)
 *
 *    This library 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 library 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.
 */
package org.geotools.data.ows;

import java.net.URI;
import java.util.LinkedList;
import java.util.List;

import com.vividsolutions.jts.geom.Envelope;


/**
 * <p>
 * Represents a wfs:FeatureType ... and didn't want to use FeatureType as it
 * could get confused with org.geotools.data.FeatureType
 * </p>
 *
 * @author dzwiers
 * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/plugin/wfs/src/main/java/org/geotools/data/ows/FeatureSetDescription.java $
 */
public class FeatureSetDescription {
	/**
	 * Mask for no operation allowed on the FeatureType
	 */
    public static final int NO_OPERATION = 0;
	/**
	 * Mask for query operation allowed on the FeatureType
	 */
    public static final int QUERY_OPERATION = 1;
	/**
	 * Mask for insert operation allowed on the FeatureType
	 */
    public static final int INSERT_OPERATION = 2;
	/**
	 * Mask for update operation allowed on the FeatureType
	 */
    public static final int UPDATE_OPERATION = 4;
	/**
	 * Mask for delete operation allowed on the FeatureType
	 */
    public static final int DELETE_OPERATION = 8;
	/**
	 * Mask for lock operation allowed on the FeatureType
	 */
    public static final int LOCK_OPERATION = 16;

    private String name;
    private URI namespace;
    private String title;
    private String _abstract;
    private String SRS;
    private List keywords;
    private Envelope latLongBoundingBox;
    private int operations;

    /**
     * Converts the string into the appropriate mask.
     * 
     * @param s The String to attempt to convert
     * @return one of the Constant Operation Values
     * @see FeatureSetDescription#DELETE_OPERATION
     * @see FeatureSetDescription#UPDATE_OPERATION
     * @see FeatureSetDescription#LOCK_OPERATION
     * @see FeatureSetDescription#NO_OPERATION
     * @see FeatureSetDescription#QUERY_OPERATION
     * @see FeatureSetDescription#INSERT_OPERATION
     */
    public static int findOperation(String s) {
        if ("Query".equals(s)) {
            return 1;
        }

        if ("Insert".equals(s)) {
            return 2;
        }

        if ("Update".equals(s)) {
            return 4;
        }

        if ("Delete".equals(s)) {
            return 8;
        }

        if ("Lock".equals(s)) {
            return 16;
        }

        return 0;
    }

    /**
     * Converts the int into the appropriate String.
     * 
     * @param i the int to convert, must match exactly.
     * @return A string representation of the int.
     * @see FeatureSetDescription#DELETE_OPERATION
     * @see FeatureSetDescription#UPDATE_OPERATION
     * @see FeatureSetDescription#LOCK_OPERATION
     * @see FeatureSetDescription#NO_OPERATION
     * @see FeatureSetDescription#QUERY_OPERATION
     * @see FeatureSetDescription#INSERT_OPERATION
     */
    public static String writeOperation(int i) {
        switch (i) {
        case 1:
            return "Query";

        case 2:
            return "Insert";

        case 4:
            return "Update";

        case 8:
            return "Delete";

        case 16:
            return "Lock";
        }

        return "";
    }

    /**
     * Converts the int mask into the appropriate set of Strings.
     * 
     * @param i The int mask to attempt to convert
     * @return Set of Strings representing the mask
     * @see FeatureSetDescription#DELETE_OPERATION
     * @see FeatureSetDescription#UPDATE_OPERATION
     * @see FeatureSetDescription#LOCK_OPERATION
     * @see FeatureSetDescription#NO_OPERATION
     * @see FeatureSetDescription#QUERY_OPERATION
     * @see FeatureSetDescription#INSERT_OPERATION
     */
    public static String[] writeOperations(int i) {
        List l = new LinkedList();

        if ((i & 1) == 1) {
            l.add("Query");
        }

        if ((i & 2) == 2) {
            l.add("Insert");
        }

        if ((i & 4) == 4) {
            l.add("Update");
        }

        if ((i & 8) == 8) {
            l.add("Delete");
        }

        if ((i & 16) == 16) {
            l.add("Lock");
        }

        return (String[]) l.toArray(new String[l.size()]);
    }

    /**
     * DOCUMENT ME!
     *
     * @return Returns the abstracT.
     */
    public String getAbstract() {
        return _abstract;
    }

    /**
     * DOCUMENT ME!
     *
     * @param _abstract The abstracT to set.
     */
    public void setAbstract(String _abstract) {
        this._abstract = _abstract;
    }

    /**
     * DOCUMENT ME!
     *
     * @return Returns the keywords.
     */
    public List getKeywords() {
        return keywords;
    }

    /**
     * DOCUMENT ME!
     *
     * @param keywords The keywords to set.
     */
    public void setKeywords(List keywords) {
        this.keywords = keywords;
    }

    /**
     * DOCUMENT ME!
     *
     * @return Returns the latLongBoundingBox.
     */
    public Envelope getLatLongBoundingBox() {
        return latLongBoundingBox;
    }

    /**
     * DOCUMENT ME!
     *
     * @param latLongBoundingBox The latLongBoundingBox to set.
     */
    public void setLatLongBoundingBox(Envelope latLongBoundingBox) {
        this.latLongBoundingBox = latLongBoundingBox;
    }

    /**
     * DOCUMENT ME!
     *
     * @return Returns the name.
     */
    public String getName() {
        return name;
    }

    /**
     * DOCUMENT ME!
     *
     * @param name The name to set.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * DOCUMENT ME!
     *
     * @return Returns the operations.
     */
    public int getOperations() {
        return operations;
    }

    /**
     * DOCUMENT ME!
     *
     * @param operations The operations to set.
     */
    public void setOperations(int operations) {
        this.operations = operations;
    }

    /**
     * DOCUMENT ME!
     *
     * @return Returns the sRS.
     */
    public String getSRS() {
        return SRS;
    }

    /**
     * DOCUMENT ME!
     *
     * @param srs The sRS to set.
     */
    public void setSRS(String srs) {
        SRS = srs;
    }

    /**
     * DOCUMENT ME!
     *
     * @return Returns the title.
     */
    public String getTitle() {
        return title;
    }

    /**
     * DOCUMENT ME!
     *
     * @param title The title to set.
     */
    public void setTitle(String title) {
        this.title = title;
    }
    /**
     * @return Returns the namespace.
     */
    public URI getNamespace() {
        return namespace;
    }
    /**
     * @param namespace The namespace to set.
     */
    public void setNamespace(URI namespace) {
        this.namespace = namespace;
    }
}
