001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/ogcwebservices/csw/discovery/DescribeRecord.java $
002 /*---------------- FILE HEADER ------------------------------------------
003 This file is part of deegree.
004 Copyright (C) 2001-2007 by:
005 Department of Geography, University of Bonn
006 http://www.giub.uni-bonn.de/deegree/
007 lat/lon GmbH
008 http://www.lat-lon.de
009
010 This library is free software; you can redistribute it and/or
011 modify it under the terms of the GNU Lesser General Public
012 License as published by the Free Software Foundation; either
013 version 2.1 of the License, or (at your option) any later version.
014
015 This library is distributed in the hope that it will be useful,
016 but WITHOUT ANY WARRANTY; without even the implied warranty of
017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
018 Lesser General Public License for more details.
019
020 You should have received a copy of the GNU Lesser General Public
021 License along with this library; if not, write to the Free Software
022 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
023
024 Contact:
025
026 Andreas Poth
027 lat/lon GmbH
028 Aennchenstraße 19
029 53177 Bonn
030 Germany
031 E-Mail: poth@lat-lon.de
032
033 Prof. Dr. Klaus Greve
034 Department of Geography
035 University of Bonn
036 Meckenheimer Allee 166
037 53115 Bonn
038 Germany
039 E-Mail: greve@giub.uni-bonn.de
040
041 ---------------------------------------------------------------------------*/
042
043 package org.deegree.ogcwebservices.csw.discovery;
044
045 import java.net.URI;
046 import java.net.URISyntaxException;
047 import java.util.HashMap;
048 import java.util.Map;
049
050 import org.deegree.framework.log.ILogger;
051 import org.deegree.framework.log.LoggerFactory;
052 import org.deegree.ogcwebservices.InvalidParameterValueException;
053 import org.deegree.ogcwebservices.MissingParameterValueException;
054 import org.deegree.ogcwebservices.OGCWebServiceException;
055 import org.deegree.ogcwebservices.csw.AbstractCSWRequest;
056 import org.w3c.dom.Element;
057
058 /**
059 * The mandatory DescribeRecord operation allows a client to discover elements of the information
060 * model supported by the target catalogue service. The operation allows some or all of the
061 * information model to be described.
062 *
063 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
064 * @author <a href="mailto:tfr@users.sourceforge.net">Torsten Friebe </a>
065 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
066 *
067 * @author last edited by: $Author: apoth $
068 *
069 * @version $Revision: 6705 $, $Date: 2007-04-26 21:55:39 +0200 (Do, 26 Apr 2007) $
070 */
071 public class DescribeRecord extends AbstractCSWRequest {
072
073 private static final long serialVersionUID = 6554937884331546780L;
074
075 private static final ILogger LOG = LoggerFactory.getLogger( DescribeRecord.class );
076
077 private Map namespaceMappings;
078
079 private String[] typeNames;
080
081 private String outputFormat;
082
083 private URI schemaLanguage;
084
085 /**
086 * creates a GetRecords request from the XML fragment passed. The passed element must be valid
087 * against the OGC CSW 2.0 GetRecords schema.
088 *
089 * @param id
090 * unique ID of the request
091 * @param root
092 * root element of the GetRecors request
093 * @return
094 */
095 public static DescribeRecord create( String id, Element root )
096 throws MissingParameterValueException, InvalidParameterValueException,
097 OGCWebServiceException {
098
099 DescribeRecordDocument document = new DescribeRecordDocument();
100 document.setRootElement( root );
101 DescribeRecord ogcRequest = document.parse( id );
102
103 return ogcRequest;
104 }
105
106 /**
107 * Creates a new <code>DecribeRecord</code> instance from the values stored in the submitted
108 * Map. Keys (parameter names) in the Map must be uppercase.
109 *
110 * @TODO evaluate vendorSpecificParameter
111 *
112 * @param kvp
113 * Map containing the parameters
114 * @exception InvalidParameterValueException
115 * @throws MissingParameterValueException
116 */
117 public static DescribeRecord create( Map<String,String> kvp )
118 throws InvalidParameterValueException, MissingParameterValueException {
119 LOG.entering();
120
121 String id;
122 String version;
123 Map<String, String> vendorSpecificParameter = new HashMap<String, String>();
124 Map namespaceMappings;
125 String[] typeNames = new String[0];
126 String outputFormat;
127 URI schemaLanguage;
128
129 // 'ID'-attribute (optional)
130 id = getParam( "ID", kvp, "" );
131
132 // 'VERSION'-attribute (mandatory)
133 version = getRequiredParam( "VERSION", kvp );
134
135 // 'NAMESPACE'-attribute (optional)
136 namespaceMappings = getNSMappings( getParam( "NAMESPACE", kvp, null ) );
137
138 // 'TYPENAME'-attribute (optional)
139 String typeNamesString = getParam( "TYPENAME", kvp, null );
140 if ( typeNamesString != null ) {
141 typeNames = typeNamesString.split( "," );
142 }
143
144 // 'OUTPUTFORMAT'-attribute (optional)
145 outputFormat = getParam( "OUTPUTFORMAT", kvp, "text/xml" );
146
147 // 'SCHEMALANGUAGE'-attribute (optional)
148 String schemaLanguageString = getParam( "SCHEMALANGUAGE", kvp, "XMLSCHEMA" );
149 try {
150 schemaLanguage = new URI( schemaLanguageString );
151 } catch ( URISyntaxException e ) {
152 String msg = "Value '" + schemaLanguageString + "' for parameter 'SCHEMALANGUAGE' is invalid. Must "
153 + "denote a valid URI.";
154 throw new InvalidParameterValueException( msg );
155 }
156
157 LOG.exiting();
158 return new DescribeRecord( id, version, vendorSpecificParameter, namespaceMappings, typeNames, outputFormat,
159 schemaLanguage );
160 }
161
162 /**
163 * Creates a new <code>DescribeRecord</code> instance.
164 *
165 * @param id
166 * @param version
167 * @param vendorSpecificParameter
168 */
169 DescribeRecord( String id, String version, Map<String, String> vendorSpecificParameter ) {
170 super( version, id, vendorSpecificParameter );
171 }
172
173 /**
174 * Creates a new <code>DescribeRecord</code> instance.
175 *
176 * @param id
177 * @param version
178 * @param vendorSpecificParameter
179 * @param namespaceMappings
180 * @param typeNames
181 * @param outputFormat
182 * @param schemaLanguage
183 */
184 DescribeRecord( String id, String version, Map<String, String> vendorSpecificParameter, Map namespaceMappings, String[] typeNames,
185 String outputFormat, URI schemaLanguage ) {
186 this( id, version, vendorSpecificParameter );
187 this.namespaceMappings = namespaceMappings;
188 this.typeNames = typeNames;
189 this.outputFormat = outputFormat;
190 this.schemaLanguage = schemaLanguage;
191 }
192
193 /**
194 * Used to specify namespace(s) and their prefix(es). Format is [prefix:]uri. If prefix is not
195 * specified, then this is the default namespace.
196 * <p>
197 * Zero or one (Optional). Include value for each namespace used by a TypeName. If not included,
198 * all qualified names are in the default namespace
199 */
200 public Map getNamespaces() {
201 return this.namespaceMappings;
202 }
203
204 /**
205 * One or more qualified type names to be described.
206 * <p>
207 * Zero or one (Optional). Default action is to describe all types known to server.
208 *
209 */
210 public String[] getTypeNames() {
211 return this.typeNames;
212 }
213
214 /**
215 * A MIME type indicating the format that the output document should have.
216 * <p>
217 * Zero or one (Optional). Default value is text/xml
218 *
219 */
220 public String getOutputFormat() {
221 return this.outputFormat;
222 }
223
224 /**
225 * Default value is 'XMLSCHEMA'.
226 *
227 */
228 public URI getSchemaLanguage() {
229 return this.schemaLanguage;
230 }
231 }