001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/metadata/iso19115/ISO19115Document.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 This library is free software; you can redistribute it and/or 010 modify it under the terms of the GNU Lesser General Public 011 License as published by the Free Software Foundation; either 012 version 2.1 of the License, or (at your option) any later version. 013 This library is distributed in the hope that it will be useful, 014 but WITHOUT ANY WARRANTY; without even the implied warranty of 015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 016 Lesser General Public License for more details. 017 You should have received a copy of the GNU Lesser General Public 018 License along with this library; if not, write to the Free Software 019 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 Contact: 021 Andreas Poth 022 lat/lon GmbH 023 Aennchenstraße 19 024 53177 Bonn 025 Germany 026 E-Mail: poth@lat-lon.de 027 Jens Fitzke 028 lat/lon GmbH 029 Aennchenstraße 19 030 53177 Bonn 031 Germany 032 E-Mail: jens.fitzke@uni-bonn.de 033 ---------------------------------------------------------------------------*/ 034 package org.deegree.model.metadata.iso19115; 035 036 import java.net.MalformedURLException; 037 import java.net.URI; 038 import java.net.URL; 039 import java.util.ArrayList; 040 import java.util.List; 041 042 import org.deegree.datatypes.Code; 043 import org.deegree.framework.xml.XMLFragment; 044 import org.deegree.framework.xml.XMLParsingException; 045 import org.deegree.framework.xml.XMLTools; 046 import org.deegree.ogcbase.CommonNamespaces; 047 import org.w3c.dom.Element; 048 049 /** 050 * Parser class that can parse various elements defined in the OWS subset of the ISO 19115 specification. 051 * 052 * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a> 053 * @author last edited by: $Author: apoth $ 054 * 055 * @version 2.0, $Revision: 6845 $, $Date: 2007-05-07 11:28:14 +0200 (Mo, 07 Mai 2007) $ 056 * 057 * @since 2.0 058 */ 059 060 public class ISO19115Document extends XMLFragment { 061 062 private static final long serialVersionUID = -5536802360612196021L; 063 064 private static final String POWS = CommonNamespaces.OWS_PREFIX + ":"; 065 066 private static final String PXLINK = CommonNamespaces.XLINK_PREFIX + ":"; 067 068 /** 069 * @param root an element of type ows:ResponsiblePartySubsetType 070 * @return the data object 071 * @throws XMLParsingException 072 */ 073 public CitedResponsibleParty parseCitedResponsibleParty( Element root ) throws XMLParsingException { 074 String individualName = XMLTools.getNodeAsString( root, POWS + "IndividualName", nsContext, null ); 075 076 String positionName = XMLTools.getNodeAsString( root, POWS + "PositionName", nsContext, null ); 077 078 Element roleElement = (Element) XMLTools.getNode( root, POWS + "Role", nsContext ); 079 RoleCode role = null; 080 if( roleElement != null ) role = parseRoleCode( roleElement ); 081 082 Element contactElement = (Element) XMLTools.getNode( root, POWS + "ContactInfo", nsContext ); 083 ContactInfo contactInfo = null; 084 if( contactElement != null ) contactInfo = parseContactInfo( contactElement ); 085 086 // why Lists/Arrays are necessary here is beyond my knowledge 087 List<String> name = new ArrayList<String>(); 088 name.add( individualName ); 089 List<String> pName = new ArrayList<String>(); 090 pName.add( positionName ); 091 List<RoleCode> roles = new ArrayList<RoleCode>(); 092 roles.add( role ); 093 List<ContactInfo> contactInfos = new ArrayList<ContactInfo>(); 094 contactInfos.add( contactInfo ); 095 096 CitedResponsibleParty result = new CitedResponsibleParty( contactInfos, name, null, pName, roles ); 097 return result; 098 } 099 100 /** 101 * @param root the ContactInfo element 102 * @return the <code>ContactInfo</code> data object 103 * @throws XMLParsingException 104 */ 105 public ContactInfo parseContactInfo( Element root ) throws XMLParsingException { 106 Element phoneElement = (Element) XMLTools.getNode( root, POWS + "Phone", nsContext ); 107 Phone phone = null; 108 if( phoneElement != null ) phone = parsePhone( phoneElement ); 109 110 Address address = null; 111 Element addressElement = (Element) XMLTools.getNode( root, POWS + "Address", nsContext ); 112 if( addressElement != null ) address = parseAddress( addressElement ); 113 114 OnlineResource onlineResource = null; 115 Element onlineResourceElement = (Element) XMLTools.getNode( root, POWS + "OnlineResource", nsContext ); 116 if( onlineResourceElement != null ) onlineResource = parseOnlineResource( onlineResourceElement ); 117 118 String hoursOfService = XMLTools.getNodeAsString( root, POWS + "HoursOfService", nsContext, null ); 119 String contactInstructions = XMLTools.getNodeAsString( root, POWS + "ContactInstructions", nsContext, null ); 120 121 ContactInfo result = new ContactInfo( address, contactInstructions, hoursOfService, onlineResource, phone ); 122 return result; 123 } 124 125 /** 126 * @param root the Address element 127 * @return the <code>Address</code> data object 128 * @throws XMLParsingException 129 */ 130 public Address parseAddress( Element root ) throws XMLParsingException { 131 String[] deliveryPoint = XMLTools.getNodesAsStrings( root, POWS + "DeliveryPoint", nsContext ); 132 String city = XMLTools.getNodeAsString( root, POWS + "City", nsContext, null ); 133 String administrativeArea = XMLTools.getNodeAsString( root, POWS + "AdministrativeArea", nsContext, null ); 134 String postalCode = XMLTools.getNodeAsString( root, POWS + "PostalCode", nsContext, null ); 135 String country = XMLTools.getNodeAsString( root, POWS + "Country", nsContext, null ); 136 String[] emails = XMLTools.getNodesAsStrings( root, POWS + "ElectronicMailAddress", nsContext ); 137 138 Address result = new Address( administrativeArea, city, country, deliveryPoint, emails, postalCode ); 139 return result; 140 } 141 142 /** 143 * @param root the Phone element 144 * @return a <code>Phone</code> data object 145 * @throws XMLParsingException 146 */ 147 public Phone parsePhone( Element root ) throws XMLParsingException { 148 String[] voice = XMLTools.getNodesAsStrings( root, POWS + "Voice", nsContext ); 149 150 String[] facsimile = XMLTools.getNodesAsStrings( root, POWS + "Facsimile", nsContext ); 151 152 Phone result = new Phone( facsimile, voice ); 153 return result; 154 } 155 156 /** 157 * @param root the element containing the xlink attributes 158 * @return the <code>OnlineResource</data> data object 159 * @throws XMLParsingException 160 */ 161 public OnlineResource parseOnlineResource( Element root ) throws XMLParsingException { 162 // This is just a preview version, not sure how to handle all the xlink attributes 163 // correctly. 164 165 URL href = null; 166 String url = null; 167 168 try { 169 url = XMLTools.getNodeAsString( root, "@" + PXLINK + "href", nsContext, null ); 170 if( url != null ) href = new URL( url ); 171 } catch ( MalformedURLException e ) { 172 throw new XMLParsingException( "'" 173 + url + "' is not a valid URL." ); 174 } 175 176 Linkage linkage = new Linkage( href ); 177 OnlineResource result = new OnlineResource( linkage ); 178 return result; 179 } 180 181 /** 182 * @param root the Code element 183 * @return a <code>Code</code> data object 184 */ 185 public Code parseCode( Element root ) { 186 URI codeSpace = null; 187 try{ 188 codeSpace = new URI( XMLTools.getAttrValue( root, null, "codeSpace", null ) ); 189 } catch ( Exception e ) { 190 // ignore codeSpace 191 } 192 193 String code = XMLTools.getStringValue( root ); 194 195 if( codeSpace != null ) return new Code( code, codeSpace ); 196 return new Code( code ); 197 } 198 199 /** 200 * @param root the Type element 201 * @return the <code>TypeCode</code> data object 202 */ 203 public TypeCode parseTypeCode( Element root ) { 204 Code code = parseCode( root ); 205 // since the TypeCode class already existed, it is used. Deleting the TypeCode class and 206 // just using the Code class would be the better solution, though. 207 return new TypeCode( code.getCode(), code.getCodeSpace() ); 208 } 209 210 /** 211 * @param root the Role element 212 * @return the <code>RoleCode</code> data object 213 */ 214 public RoleCode parseRoleCode( Element root ) { 215 Code code = parseCode( root ); 216 // since the RoleCode class already existed, it is used. Deleting the RoleCode class and 217 // just using the Code class would be the better solution, though. 218 return new RoleCode( code.getCode() ); 219 } 220 221 /** 222 * @param root the AccessConstraints element 223 * @param fee 224 * @return the <code>Constraints</code> object containing the parsed data 225 * @throws XMLParsingException 226 */ 227 public Constraints parseConstraint( Element root, String fee ) throws XMLParsingException { 228 // please note that the same fee is used for all constraints 229 230 List<String> constr = new ArrayList<String>(); 231 String str = XMLTools.getRequiredNodeAsString( root, ".", nsContext ); 232 constr.add( str ); 233 234 Constraints result = new Constraints( fee, null, null, null, constr, null, null, null ); 235 return result; 236 } 237 238 /** 239 * @param root the Keywords element 240 * @return the <code>Keywords</code> object 241 * @throws XMLParsingException 242 */ 243 public Keywords parseKeywords( Element root ) throws XMLParsingException { 244 String[] keywords = XMLTools.getRequiredNodesAsStrings( root, POWS + "Keyword", nsContext ); 245 Element codeElem = (Element) XMLTools.getNode( root, POWS + "Type", nsContext ); 246 TypeCode type = null; 247 if( codeElem != null ) type = parseTypeCode( codeElem ); 248 249 Keywords result = null; 250 251 // the thesaurus name is ignored at the moment, as it is omitted by the OWS specification as well 252 if( type != null ) result = new Keywords( keywords ); 253 else result = new Keywords( keywords, "", type ); 254 255 return result; 256 } 257 258 }