001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/model/metadata/iso19115/ISO19115Document.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2008 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 package org.deegree.model.metadata.iso19115; 045 046 import java.net.MalformedURLException; 047 import java.net.URI; 048 import java.net.URL; 049 import java.util.ArrayList; 050 import java.util.List; 051 052 import org.deegree.datatypes.Code; 053 import org.deegree.framework.xml.XMLFragment; 054 import org.deegree.framework.xml.XMLParsingException; 055 import org.deegree.framework.xml.XMLTools; 056 import org.deegree.ogcbase.CommonNamespaces; 057 import org.w3c.dom.Element; 058 059 /** 060 * Parser class that can parse various elements defined in the OWS subset of the ISO 19115 061 * specification. 062 * 063 * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a> 064 * @author last edited by: $Author: apoth $ 065 * 066 * @version 2.0, $Revision: 9343 $, $Date: 2007-12-27 14:30:32 +0100 (Do, 27 Dez 2007) $ 067 * 068 * @since 2.0 069 */ 070 071 public class ISO19115Document extends XMLFragment { 072 073 private static final long serialVersionUID = -5536802360612196021L; 074 075 private static final String POWS = CommonNamespaces.OWS_PREFIX + ":"; 076 077 private static final String PXLINK = CommonNamespaces.XLINK_PREFIX + ":"; 078 079 /** 080 * @param root 081 * an element of type ows:ResponsiblePartySubsetType 082 * @return the data object 083 * @throws XMLParsingException 084 */ 085 public CitedResponsibleParty parseCitedResponsibleParty( Element root ) 086 throws XMLParsingException { 087 String individualName = XMLTools.getNodeAsString( root, POWS + "IndividualName", nsContext, null ); 088 089 String positionName = XMLTools.getNodeAsString( root, POWS + "PositionName", nsContext, null ); 090 091 Element roleElement = (Element) XMLTools.getNode( root, POWS + "Role", nsContext ); 092 RoleCode role = null; 093 if ( roleElement != null ) 094 role = parseRoleCode( roleElement ); 095 096 Element contactElement = (Element) XMLTools.getNode( root, POWS + "ContactInfo", nsContext ); 097 ContactInfo contactInfo = null; 098 if ( contactElement != null ) 099 contactInfo = parseContactInfo( contactElement ); 100 101 // why Lists/Arrays are necessary here is beyond my knowledge 102 List<String> name = new ArrayList<String>(); 103 name.add( individualName ); 104 List<String> pName = new ArrayList<String>(); 105 pName.add( positionName ); 106 List<RoleCode> roles = new ArrayList<RoleCode>(); 107 roles.add( role ); 108 List<ContactInfo> contactInfos = new ArrayList<ContactInfo>(); 109 contactInfos.add( contactInfo ); 110 111 CitedResponsibleParty result = new CitedResponsibleParty( contactInfos, name, null, pName, roles ); 112 return result; 113 } 114 115 /** 116 * @param root 117 * the ContactInfo element 118 * @return the <code>ContactInfo</code> data object 119 * @throws XMLParsingException 120 */ 121 public ContactInfo parseContactInfo( Element root ) 122 throws XMLParsingException { 123 Element phoneElement = (Element) XMLTools.getNode( root, POWS + "Phone", nsContext ); 124 Phone phone = null; 125 if ( phoneElement != null ) 126 phone = parsePhone( phoneElement ); 127 128 Address address = null; 129 Element addressElement = (Element) XMLTools.getNode( root, POWS + "Address", nsContext ); 130 if ( addressElement != null ) 131 address = parseAddress( addressElement ); 132 133 OnlineResource onlineResource = null; 134 Element onlineResourceElement = (Element) XMLTools.getNode( root, POWS + "OnlineResource", nsContext ); 135 if ( onlineResourceElement != null ) 136 onlineResource = parseOnlineResource( onlineResourceElement ); 137 138 String hoursOfService = XMLTools.getNodeAsString( root, POWS + "HoursOfService", nsContext, null ); 139 String contactInstructions = XMLTools.getNodeAsString( root, POWS + "ContactInstructions", nsContext, null ); 140 141 ContactInfo result = new ContactInfo( address, contactInstructions, hoursOfService, onlineResource, phone ); 142 return result; 143 } 144 145 /** 146 * @param root 147 * the Address element 148 * @return the <code>Address</code> data object 149 * @throws XMLParsingException 150 */ 151 public Address parseAddress( Element root ) 152 throws XMLParsingException { 153 String[] deliveryPoint = XMLTools.getNodesAsStrings( root, POWS + "DeliveryPoint", nsContext ); 154 String city = XMLTools.getNodeAsString( root, POWS + "City", nsContext, null ); 155 String administrativeArea = XMLTools.getNodeAsString( root, POWS + "AdministrativeArea", nsContext, null ); 156 String postalCode = XMLTools.getNodeAsString( root, POWS + "PostalCode", nsContext, null ); 157 String country = XMLTools.getNodeAsString( root, POWS + "Country", nsContext, null ); 158 String[] emails = XMLTools.getNodesAsStrings( root, POWS + "ElectronicMailAddress", nsContext ); 159 160 Address result = new Address( administrativeArea, city, country, deliveryPoint, emails, postalCode ); 161 return result; 162 } 163 164 /** 165 * @param root 166 * the Phone element 167 * @return a <code>Phone</code> data object 168 * @throws XMLParsingException 169 */ 170 public Phone parsePhone( Element root ) 171 throws XMLParsingException { 172 String[] voice = XMLTools.getNodesAsStrings( root, POWS + "Voice", nsContext ); 173 174 String[] facsimile = XMLTools.getNodesAsStrings( root, POWS + "Facsimile", nsContext ); 175 176 Phone result = new Phone( facsimile, voice ); 177 return result; 178 } 179 180 /** 181 * @param root 182 * the element containing the xlink attributes 183 * @return the <code>OnlineResource</data> data object 184 * @throws XMLParsingException 185 */ 186 public OnlineResource parseOnlineResource( Element root ) 187 throws XMLParsingException { 188 // This is just a preview version, not sure how to handle all the xlink attributes 189 // correctly. 190 191 URL href = null; 192 String url = null; 193 194 try { 195 url = XMLTools.getNodeAsString( root, "@" + PXLINK + "href", nsContext, null ); 196 if ( url != null ) 197 href = new URL( url ); 198 } catch ( MalformedURLException e ) { 199 throw new XMLParsingException( "'" + url + "' is not a valid URL." ); 200 } 201 202 Linkage linkage = new Linkage( href ); 203 OnlineResource result = new OnlineResource( linkage ); 204 return result; 205 } 206 207 /** 208 * @param root 209 * the Code element 210 * @return a <code>Code</code> data object 211 */ 212 public Code parseCode( Element root ) { 213 URI codeSpace = null; 214 try { 215 codeSpace = new URI( XMLTools.getAttrValue( root, null, "codeSpace", null ) ); 216 } catch ( Exception e ) { 217 // ignore codeSpace 218 } 219 220 String code = XMLTools.getStringValue( root ); 221 222 if ( codeSpace != null ) 223 return new Code( code, codeSpace ); 224 return new Code( code ); 225 } 226 227 /** 228 * @param root 229 * the Type element 230 * @return the <code>TypeCode</code> data object 231 */ 232 public TypeCode parseTypeCode( Element root ) { 233 Code code = parseCode( root ); 234 // since the TypeCode class already existed, it is used. Deleting the TypeCode class and 235 // just using the Code class would be the better solution, though. 236 return new TypeCode( code.getCode(), code.getCodeSpace() ); 237 } 238 239 /** 240 * @param root 241 * the Role element 242 * @return the <code>RoleCode</code> data object 243 */ 244 public RoleCode parseRoleCode( Element root ) { 245 Code code = parseCode( root ); 246 // since the RoleCode class already existed, it is used. Deleting the RoleCode class and 247 // just using the Code class would be the better solution, though. 248 return new RoleCode( code.getCode() ); 249 } 250 251 /** 252 * @param root 253 * the AccessConstraints element 254 * @param fee 255 * @return the <code>Constraints</code> object containing the parsed data 256 * @throws XMLParsingException 257 */ 258 public Constraints parseConstraint( Element root, String fee ) 259 throws XMLParsingException { 260 // please note that the same fee is used for all constraints 261 262 List<String> constr = new ArrayList<String>(); 263 String str = XMLTools.getRequiredNodeAsString( root, ".", nsContext ); 264 constr.add( str ); 265 266 Constraints result = new Constraints( fee, null, null, null, constr, null, null, null ); 267 return result; 268 } 269 270 /** 271 * @param root 272 * the Keywords element 273 * @return the <code>Keywords</code> object 274 * @throws XMLParsingException 275 */ 276 public Keywords parseKeywords( Element root ) 277 throws XMLParsingException { 278 String[] keywords = XMLTools.getRequiredNodesAsStrings( root, POWS + "Keyword", nsContext ); 279 Element codeElem = (Element) XMLTools.getNode( root, POWS + "Type", nsContext ); 280 TypeCode type = null; 281 if ( codeElem != null ) 282 type = parseTypeCode( codeElem ); 283 284 Keywords result = null; 285 286 // the thesaurus name is ignored at the moment, as it is omitted by the OWS specification as 287 // well 288 if ( type != null ) 289 result = new Keywords( keywords ); 290 else 291 result = new Keywords( keywords, "", type ); 292 293 return result; 294 } 295 296 }