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

import java.net.URL;

import org.geotools.data.ows.Specification;
import org.geotools.data.wms.request.DescribeLayerRequest;
import org.geotools.data.wms.request.GetFeatureInfoRequest;
import org.geotools.data.wms.request.GetLegendGraphicRequest;
import org.geotools.data.wms.request.GetMapRequest;
import org.geotools.data.wms.request.GetStylesRequest;
import org.geotools.data.wms.request.PutStylesRequest;

public abstract class WMSSpecification extends Specification {

    /**
     * Creates a GetMapRequest for this specification, populating it with valid
     * values.
     * 
     * @param onlineResource the URL for the GetMapRequest
     * @return a GetMapRequest that can be configured and used
     */
    public abstract GetMapRequest createGetMapRequest( URL onlineResource );

    /**
     * Creates a GetFeatureInfoRequest for this specification, populating it 
     * with valid values.
     * 
     * @param onlineResource the URL to be executed against
     * @param getMapRequest a previously configured GetMapRequest
     * @return a GetFeatureInfoRequest that can be configured and used
     */
    public abstract GetFeatureInfoRequest createGetFeatureInfoRequest( URL onlineResource, GetMapRequest getMapRequest);
    
    /**
     * Creates a DescribeLayer request which can be used to retrieve
     * information about specific layers on the Web Map Server.
     * 
     * @param onlineResource the location where the request can be made
     * @return a DescribeLayerRequest to be configured and then passed to the Web Map Server
     * @throws UnsupportedOperationException if the version of the specification doesn't support this request
     */
    public abstract DescribeLayerRequest createDescribeLayerRequest( URL onlineResource ) throws UnsupportedOperationException;

    /**
     * Creates a GetLegendGraphicRequest which can be used to retrieve legend
     * graphics from the WebMapServer
     * 
     * @param onlineResource the location where the request can be made
     * @return a GetLegendGraphicRequest to be configured and passed to the WMS
     * @throws UnsupportedOperationException if the version of the specification doesn't support this request
     */
    public abstract GetLegendGraphicRequest createGetLegendGraphicRequest(URL onlineResource) throws UnsupportedOperationException;
    
    
    /**
     * Creates a GetStylesRequest which can be used to retrieve styles from
     * the WMS.
     * 
     * @param onlineResource The location where the request can be made
     * @return a configurable request object to be passed to a WMS
     * @throws UnsupportedOperationException if the version of the specification doesn't support this request
     */
    public abstract GetStylesRequest createGetStylesRequest(URL onlineResource) throws UnsupportedOperationException;
    
    /**
     * Creates a PutStyles request which can be configured and the passed to 
     * the WMS to store styles for later use.
     * 
     * @param onlineResource the location where the request can be made
     * @return a configureable request object to be passed to the WMS
     * @throws UnsupportedOperationException if the version of the specification doesn't support this request
     */
    public abstract PutStylesRequest createPutStylesRequest(URL onlineResource) throws UnsupportedOperationException;
}
