001 /*----------------------------------------------------------------------------
002 This file is part of deegree, http://deegree.org/
003 Copyright (C) 2001-2009 by:
004 Department of Geography, University of Bonn
005 and
006 lat/lon GmbH
007
008 This library is free software; you can redistribute it and/or modify it under
009 the terms of the GNU Lesser General Public License as published by the Free
010 Software Foundation; either version 2.1 of the License, or (at your option)
011 any later version.
012 This library is distributed in the hope that it will be useful, but WITHOUT
013 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
014 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
015 details.
016 You should have received a copy of the GNU Lesser General Public License
017 along with this library; if not, write to the Free Software Foundation, Inc.,
018 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019
020 Contact information:
021
022 lat/lon GmbH
023 Aennchenstr. 19, 53177 Bonn
024 Germany
025 http://lat-lon.de/
026
027 Department of Geography, University of Bonn
028 Prof. Dr. Klaus Greve
029 Postfach 1147, 53001 Bonn
030 Germany
031 http://www.geographie.uni-bonn.de/deegree/
032
033 e-mail: info@deegree.org
034 ----------------------------------------------------------------------------*/
035
036 package org.deegree.ogcwebservices.csw.discovery;
037
038 import static org.deegree.ogcbase.CommonNamespaces.CSW202NS;
039 import static org.deegree.ogcbase.CommonNamespaces.CSWNS;
040
041 import java.io.IOException;
042 import java.net.URL;
043
044 import org.deegree.datatypes.QualifiedName;
045 import org.deegree.framework.util.StringTools;
046 import org.deegree.framework.xml.XMLFragment;
047 import org.deegree.framework.xml.XMLParsingException;
048 import org.deegree.framework.xml.XMLTools;
049 import org.deegree.ogcbase.ExceptionCode;
050 import org.deegree.ogcwebservices.InvalidParameterValueException;
051 import org.deegree.ogcwebservices.MissingParameterValueException;
052 import org.deegree.ogcwebservices.OGCWebServiceException;
053 import org.w3c.dom.Node;
054 import org.xml.sax.SAXException;
055
056 /**
057 * Represents an XML GetRecordsResponse document of an OGC CSW 2.0 compliant service.
058 * <p>
059 * The <GetRecordsResponse> element is a container for the response of the GetRecords
060 * operation. Three levels of detail may be contained in the response document.
061 * <ul>
062 * <li>The <RequestId> element may be used to correlate the response to a GetRecords request
063 * for which a value was defined for the requestId attribute.
064 * <li><SearchStatus> element must be present and indicates the status of the response. The
065 * status attribute is used to indicate the completion status of the GetRecords operation. Table 65
066 * shows the possible values for the status attribute.
067 * <li>The <SearchResults> element is a generic XML container for the actual response to a
068 * GetRecords request. The content of the <SearchResults> element is the set of records
069 * returned by the GetRecords operation. The actual records returned by the catalogue should
070 * substitute for the element <csw:AbstractRecord>.
071 * </ul>
072 *
073 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
074 *
075 * @author last edited by: $Author: mschneider $
076 *
077 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $
078 *
079 *
080 */
081 public class GetRecordsResultDocument extends XMLFragment {
082
083 private static final long serialVersionUID = 2796229558893029054L;
084
085 private static final String XML_TEMPLATE = "GetRecordsResponseTemplate.xml";
086
087 /**
088 *
089 */
090 public GetRecordsResultDocument() {
091 // load later
092 }
093
094 /**
095 * @param version
096 */
097 public GetRecordsResultDocument( String version ) {
098 super( new QualifiedName( "csw", "GetRecordsResponse", version.equals( "2.0.2" ) ? CSW202NS : CSWNS ) );
099 }
100
101 /**
102 * Extracts a <code>GetRecordsResult</code> representation of this object.
103 *
104 * @param request
105 *
106 * @return the actual GetRecordResult as a bean.
107 * @throws MissingParameterValueException
108 * @throws InvalidParameterValueException
109 * @throws OGCWebServiceException
110 */
111 public GetRecordsResult parseGetRecordsResponse( GetRecords request )
112 throws MissingParameterValueException, InvalidParameterValueException,
113 OGCWebServiceException {
114 try {
115 String requestId = null;
116 SearchStatus searchStatus = null;
117 SearchResults searchResults = null;
118 // '<csw:GetRecordsResponse>'-element (required)
119 Node contextNode = XMLTools.getRequiredNode( getRootElement(), "self::csw:GetRecordsResponse", nsContext );
120
121 // 'version'-attribute (optional)
122 String version = XMLTools.getNodeAsString( contextNode, "@version", nsContext, GetRecords.DEFAULT_VERSION );
123
124 // '<csw:RequestId>'-element (optional)
125 requestId = XMLTools.getNodeAsString( contextNode, "csw:RequestId", nsContext, requestId );
126
127 // '<csw:SearchStatus>'-element (required)
128 String status = XMLTools.getRequiredNodeAsString( contextNode, "csw:SearchStatus/@status", nsContext );
129 String timestamp = XMLTools.getNodeAsString( contextNode, "csw:SearchStatus/@timestamp", nsContext, null );
130 searchStatus = new SearchStatus( status, timestamp );
131
132 // '<csw:SearchResults>'-element (required)
133 contextNode = XMLTools.getRequiredNode( contextNode, "csw:SearchResults", nsContext );
134
135 // 'requestId'-attribute (optional)
136 requestId = XMLTools.getNodeAsString( contextNode, "@requestId", nsContext, requestId );
137
138 // 'resultSetId'-attribute (optional)
139 String resultSetId = XMLTools.getNodeAsString( contextNode, "@resultSetId", nsContext, null );
140
141 // 'elementSet'-attribute (optional)
142 String elementSet = XMLTools.getNodeAsString( contextNode, "@elementSet", nsContext, null );
143
144 // 'recordSchema'-attribute (optional)
145 String recordSchema = XMLTools.getNodeAsString( contextNode, "@recordSchema", nsContext, null );
146
147 // 'numberOfRecordsMatched'-attribute (required)
148 int numberOfRecordsMatched = XMLTools.getRequiredNodeAsInt( contextNode, "@numberOfRecordsMatched",
149 nsContext );
150
151 // 'numberOfRecordsReturned'-attribute (required)
152 int numberOfRecordsReturned = XMLTools.getRequiredNodeAsInt( contextNode, "@numberOfRecordsReturned",
153 nsContext );
154
155 // 'nextRecord'-attribute (required)
156 int nextRecord = XMLTools.getRequiredNodeAsInt( contextNode, "@nextRecord", nsContext );
157
158 // 'expires'-attribute (optional)
159 String expires = XMLTools.getNodeAsString( contextNode, "@expires", nsContext, "null" );
160
161 searchResults = new SearchResults( requestId, resultSetId, elementSet, recordSchema,
162 numberOfRecordsReturned, numberOfRecordsMatched, nextRecord,
163 contextNode, expires );
164 return new GetRecordsResult( request, version, searchStatus, searchResults );
165 } catch ( XMLParsingException e ) {
166 ExceptionCode code = ExceptionCode.INVALID_FORMAT;
167 throw new OGCWebServiceException( "GetRecordsResponseDocument", StringTools.stackTraceToString( e ), code );
168 }
169
170 }
171
172 /**
173 * creates an emtpy document as defined by the template
174 *
175 * @throws IOException
176 * if the template could not be found
177 * @throws SAXException
178 * if an error occurs while creating the rootnode.
179 */
180 public void createEmptyDocument()
181 throws IOException, SAXException {
182 URL url = GetRecordsResultDocument.class.getResource( XML_TEMPLATE );
183 if ( url == null ) {
184 throw new IOException( "The resource '" + XML_TEMPLATE + " could not be found." );
185 }
186 load( url );
187 }
188 }