001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/ogcwebservices/AbstractOGCWebServiceRequest.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001-2006 by:
006     EXSE, Department of Geography, University of Bonn
007     http://www.giub.uni-bonn.de/deegree/
008     lat/lon GmbH
009     http://www.lat-lon.de
010    
011     This library is free software; you can redistribute it and/or
012     modify it under the terms of the GNU Lesser General Public
013     License as published by the Free Software Foundation; either
014     version 2.1 of the License, or (at your option) any later version.
015    
016     This library is distributed in the hope that it will be useful,
017     but WITHOUT ANY WARRANTY; without even the implied warranty of
018     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
019     Lesser General Public License for more details.
020    
021     You should have received a copy of the GNU Lesser General Public
022     License along with this library; if not, write to the Free Software
023     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
024    
025     Contact:
026    
027     Andreas Poth
028     lat/lon GmbH
029     Aennchenstr. 19
030     53115 Bonn
031     Germany
032     E-Mail: poth@lat-lon.de
033    
034     Prof. Dr. Klaus Greve
035     Department of Geography
036     University of Bonn
037     Meckenheimer Allee 166
038     53115 Bonn
039     Germany
040     E-Mail: greve@giub.uni-bonn.de
041    
042     
043     ---------------------------------------------------------------------------*/
044    
045    package org.deegree.ogcwebservices;
046    
047    import java.io.Serializable;
048    import java.util.HashMap;
049    import java.util.Map;
050    
051    /**
052     * This is the abstract base class for all requests to OGC Web Services (OWS).
053     * <p>
054     * Contains utility methods to ease the extraction of values from KVP parameter maps.
055     * 
056     * @author <a href="mailto:k.lupp@web.de">Katharina Lupp </a>
057     * @author last edited by: $Author: bezema $
058     * 
059     * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $
060     */
061    public abstract class AbstractOGCWebServiceRequest implements OGCWebServiceRequest, Serializable {
062    
063        private Map<String, String> vendorSpecificParameter;
064    
065        private String id;
066    
067        private String version;
068    
069        /**
070         * returns the ID of a request
071         */
072        public String getId() {
073            return id;
074        }
075    
076        /**
077         * returns the requested service version
078         */
079        public String getVersion() {
080            return version;
081        }    
082    
083        /**
084         * Creates a new instance of <code>AbstractOGCWebServiceRequest</code>.
085         * 
086         * @param version
087         * @param id
088         * @param vendorSpecificParameter
089         */
090        protected AbstractOGCWebServiceRequest( String version, String id, Map<String, String> vendorSpecificParameter ) {
091            this.id = id;
092            if ( vendorSpecificParameter != null ) {
093                this.vendorSpecificParameter = vendorSpecificParameter;
094            } else {
095                this.vendorSpecificParameter = new HashMap<String, String>();
096            }
097            this.version = version;
098        }
099    
100        /**
101         * Finally, the requests allow for optional vendor-specific parameters (VSPs) that will enhance
102         * the results of a request. Typically, these are used for private testing of non-standard
103         * functionality prior to possible standardization. A generic client is not required or expected
104         * to make use of these VSPs.
105         */
106        public Map<String, String> getVendorSpecificParameters() {
107            return vendorSpecificParameter;
108        }
109    
110        /**
111         * Finally, the requests allow for optional vendor-specific parameters (VSPs) that will enhance
112         * the results of a request. Typically, these are used for private testing of non-standard
113         * functionality prior to possible standardization. A generic client is not required or expected
114         * to make use of these VSPs.
115         */
116        public String getVendorSpecificParameter( String name ) {
117            return vendorSpecificParameter.get( name );
118        }
119    
120        /**
121         * returns the URI of a HTTP GET request. If the request doesn't support HTTP GET a
122         * <tt>WebServiceException</tt> will be thrown
123         * 
124         */
125        public String getRequestParameter() throws OGCWebServiceException {
126            throw new OGCWebServiceException( "HTTP GET isn't supported" );
127        }
128    
129        /**
130         * Extracts a <code>String</code> parameter value from the given parameter map. If the given
131         * parameter does not exist, the also submitted default value is returned.
132         * 
133         * @param name
134         *            name of the parameter to be looked up
135         * @param kvp
136         *            must contain Strings as keys and Strings as values
137         * @param defaultValue
138         *            default value to be used if parameter is missing
139         * @return parameter value
140         */
141        protected static String getParam( String name, Map<String, String> kvp, String defaultValue ) {
142            String value = kvp.remove( name );
143            if ( value == null ) {
144                value = defaultValue;
145            }
146            return value;
147        }
148    
149        /**
150         * Extracts a <code>String</code> list from the given parameter map. The single values
151         * are separated by commas. If the given parameter does not exist, the also submitted
152         * default value is returned.
153         * 
154         * @param name
155         *            name of the parameter to be looked up
156         * @param kvp
157         *            must contain Strings as keys and Strings as values
158         * @param defaultValue
159         *            default value to be used if parameter is missing
160         * @return parameter value
161         */
162        protected static String [] getParamValues( String name, Map<String, String> kvp, String defaultValue ) {
163            String value = kvp.get( name );
164            if ( value == null ) {
165                value = defaultValue;
166            }
167            return value.split(",");
168        }    
169        
170        /**
171         * Extracts a <code>String</code> parameter value from the given parameter map. Generates
172         * exceptions with descriptive messages, if the parameter does not exist in the <code>Map</code>.
173         * 
174         * @param name
175         *            name of the parameter to be looked up
176         * @param kvp
177         *            must contain Strings as keys and Strings as values
178         * @return parameter value
179         * @throws MissingParameterValueException
180         */
181        protected static String getRequiredParam( String name, Map<String, String> kvp )
182            throws MissingParameterValueException {
183            String value = kvp.remove( name );
184            if ( value == null ) {
185                throw new MissingParameterValueException (
186                    "Cannot create OGC web service request. Required parameter '"
187                        + name + "' is missing.", name );
188            }
189            return value;
190        }    
191        
192        /**
193         * Extracts an <code>int</code> parameter value from the given parameter map. If the given
194         * parameter does not exist, the also submitted default value is returned.
195         * 
196         * @param name
197         *            name of the parameter to be looked up
198         * @param kvp
199         *            must contain Strings as keys and Strings as values
200         * @param defaultValue
201         *            default value to be used if parameter is missing
202         * @return parameter value
203         * @throws InvalidParameterValueException
204         */
205        protected static int getParamAsInt( String name, Map<String, String> kvp, int defaultValue )
206            throws InvalidParameterValueException {
207            int value = defaultValue;
208            String paramValue = kvp.get( name );
209            if ( paramValue != null ) {
210                try {
211                    value = Integer.parseInt( paramValue );
212                } catch (NumberFormatException e) {
213                    throw new InvalidParameterValueException( "Value '"
214                        + paramValue + "' for parameter '" + name
215                        + "' is invalid. Must be of type integer." );
216                }
217            }
218            return value;
219        }
220    
221        @Override
222        public String toString() {
223            String ret = "vendorSpecificParameter = "
224                + vendorSpecificParameter + "\n" ;
225            ret += ( "id = "
226                + id + "\n" );
227            ret += ( "version = "
228                + version);
229            return ret;
230        }
231    }
232    
233    /* ********************************************************************
234    Changes to this class. What the people have been up to:
235    $Log$
236    Revision 1.19  2006/11/29 16:01:01  bezema
237    fixed toString
238    
239    Revision 1.18  2006/11/28 16:29:20  bezema
240    Fixed a null pointer bug in the tostring method
241    
242    Revision 1.17  2006/11/07 11:09:54  mschneider
243    Fixed footer formatting.
244    
245    Revision 1.16  2006/10/27 13:25:26  poth
246    chaged getParam and getRequiredParam methods to remove the parameters read from the Map
247    
248    Revision 1.15  2006/08/28 12:52:04  bezema
249    little javadoc corrections
250    
251    Revision 1.14  2006/08/28 07:52:16  bezema
252    added typesafety (<String, String>) for the map, and fixed documentation, no more warnings found
253    
254    Revision 1.13  2006/07/21 14:07:09  mschneider
255    Improved javadoc.
256    
257    Revision 1.12  2006/07/12 14:46:16  poth
258    comment footer added
259    
260    ********************************************************************** */