001 //$HeadURL: https://sushibar/svn/deegree/base/trunk/src/org/deegree/framework/xml/Arc2ISO.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.ogcwebservices.csw.iso_profile; 045 046 import java.text.DecimalFormat; 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.framework.util.StringTools; 053 import org.deegree.framework.xml.XMLTools; 054 import org.w3c.dom.Node; 055 056 /** 057 * @version $Revision: 6259 $ 058 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 059 * @author last edited by: $Author: bezema $ 060 * 061 * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mrz 2007) $ 062 */ 063 public class Arc2ISO { 064 065 private static ILogger LOG = LoggerFactory.getLogger( Arc2ISO.class ); 066 067 private static Map<String, String> roleCd = new HashMap<String, String>(); 068 069 private static Map<String, String> geomObjTypeCd = new HashMap<String, String>(); 070 071 private static Map<String, String> dateTypCd = new HashMap<String, String>(); 072 073 private static Map<String, String> topCatCd = new HashMap<String, String>(); 074 075 private static Map<String, String> charSetCd = new HashMap<String, String>(); 076 077 private static Map<String, String> securityCd = new HashMap<String, String>(); 078 079 private static Map<String, String> maintenanceCd = new HashMap<String, String>(); 080 081 private static Map<String, String> progressCd = new HashMap<String, String>(); 082 083 private static Map<String, String> mediumNameCd = new HashMap<String, String>(); 084 085 private static Map<String, String> mediumFormatCd = new HashMap<String, String>(); 086 087 static { 088 // fill role code map 089 roleCd.put( "001", "resourceProvider" ); 090 roleCd.put( "002", "custodian" ); 091 roleCd.put( "003", "owner" ); 092 roleCd.put( "004", "user" ); 093 roleCd.put( "005", "distributor" ); 094 roleCd.put( "006", "originator" ); 095 roleCd.put( "007", "pointOfContact" ); 096 roleCd.put( "008", "principalInvestigator" ); 097 roleCd.put( "009", "processor" ); 098 roleCd.put( "010", "publisher" ); 099 roleCd.put( "011", "author" ); 100 101 // fill GeometricObjectTypeCode map 102 geomObjTypeCd.put( "Point", "point" ); 103 geomObjTypeCd.put( "MultiPoint", "NO MATCHING AVAILABLE" ); 104 geomObjTypeCd.put( "Polyline", "curve" ); 105 geomObjTypeCd.put( "Polygon", "surface" ); 106 geomObjTypeCd.put( "Arc", "NO MATCHING AVAILABLE" ); 107 geomObjTypeCd.put( "Node", "NO MATCHING AVAILABLE" ); 108 geomObjTypeCd.put( "Region", "NO MATCHING AVAILABLE" ); 109 geomObjTypeCd.put( "Route", "NO MATCHING AVAILABLE" ); 110 geomObjTypeCd.put( "Tic", "NO MATCHING AVAILABLE" ); 111 geomObjTypeCd.put( "Label", "NO MATCHING AVAILABLE" ); 112 geomObjTypeCd.put( "Annotation", "NO MATCHING AVAILABLE" ); 113 geomObjTypeCd.put( "Triangle", "NO MATCHING AVAILABLE" ); 114 geomObjTypeCd.put( "Edge", "NO MATCHING AVAILABLE" ); 115 116 // fill dateTypCd map 117 dateTypCd.put( "001", "creation" ); 118 dateTypCd.put( "002", "publication" ); 119 dateTypCd.put( "003", "revision" ); 120 121 // fill topic category code map 122 topCatCd.put( "001", "farming" ); 123 topCatCd.put( "002", "biota" ); 124 topCatCd.put( "003", "boundaries" ); 125 topCatCd.put( "004", "climatologyMeteorologyAtmosphere" ); 126 topCatCd.put( "005", "economy" ); 127 topCatCd.put( "006", "elevation" ); 128 topCatCd.put( "007", "environment" ); 129 topCatCd.put( "008", "geoscientificInformation" ); 130 topCatCd.put( "009", "health" ); 131 topCatCd.put( "010", "imageryBaseMapsEarthCover" ); 132 topCatCd.put( "011", "intelligenceMilitary" ); 133 topCatCd.put( "012", "inlandWaters" ); 134 topCatCd.put( "013", "location" ); 135 topCatCd.put( "014", "oceans" ); 136 topCatCd.put( "015", "planningCadastre" ); 137 topCatCd.put( "016", "society" ); 138 topCatCd.put( "017", "structure" ); 139 topCatCd.put( "018", "transportation" ); 140 topCatCd.put( "019", "utilitiesCommunication" ); 141 142 // fill MD_CharacterSetCode list 143 charSetCd.put( "003", "utf7" ); 144 charSetCd.put( "004", "utf8" ); 145 charSetCd.put( "005", "utf16" ); 146 charSetCd.put( "006", "8859part1" ); 147 charSetCd.put( "007", "8859part2" ); 148 charSetCd.put( "025", "usAscii" ); 149 150 // fill MD_ClassificationCode list 151 securityCd.put( "Top secret", "topSecret" ); 152 securityCd.put( "Secret", "secret" ); 153 securityCd.put( "Confidential", "confidential" ); 154 securityCd.put( "Restricted", "restricted" ); 155 securityCd.put( "Unclassified", "unclassified" ); 156 securityCd.put( "Sensitive", "unclassified" ); 157 158 // fill MD_MaintenanceFrequencyCode list 159 maintenanceCd.put( "Continually", "continual" ); 160 maintenanceCd.put( "Daily", "daily" ); 161 maintenanceCd.put( "Weekly", "weekly" ); 162 maintenanceCd.put( "Monthly", "monthly" ); 163 maintenanceCd.put( "Annually", "annually" ); 164 maintenanceCd.put( "Unknown", "unknown" ); 165 maintenanceCd.put( "As needed", "asNeeded" ); 166 maintenanceCd.put( "Irregular", "irregular" ); 167 maintenanceCd.put( "None planned", "notPlanned" ); 168 169 progressCd.put( "Complete", "completed" ); 170 progressCd.put( "In work", "onGoing" ); 171 progressCd.put( "Planned", "planned" ); 172 173 mediumNameCd.put( "CD-ROM", "cdRom" ); 174 mediumNameCd.put( "DVD", "dvd" ); 175 mediumNameCd.put( "DVD-ROM", "dvdRom" ); 176 mediumNameCd.put( "3-1/2 inch floppy disk", "3halfInchFloppy" ); 177 mediumNameCd.put( "5-1/4 inch floppy disk", "5quarterInchFloppy" ); 178 mediumNameCd.put( "7-track tape", "7trackTape" ); 179 mediumNameCd.put( "9-track tape", "9trackTape" ); 180 mediumNameCd.put( "4 mm cartridge tape", "4mmCartridgeTape" ); 181 mediumNameCd.put( "8 mm cartridge tape", "8mmCartridgeTape" ); 182 mediumNameCd.put( "1/4-inch cartridge tape", "1quarterInchCartridgeTape" ); 183 184 mediumFormatCd.put( "cpio", "cpio" ); 185 mediumNameCd.put( "tar", "tar" ); 186 mediumNameCd.put( "High Sierra", "highSierra" ); 187 mediumNameCd.put( "ISO 9660", "iso9660" ); 188 mediumNameCd.put( "ISO 9660 with Rock Ridge extensions", "iso9660RockRidge" ); 189 mediumNameCd.put( "ISO 9660 with Apple HFS extensions", "iso9660AppleHFS" ); 190 } 191 192 /** 193 * transforms a esri arc catalog date into a ISO8601 date format 194 * 195 * @param node 196 * @return 197 */ 198 public static String getISODate( Node node ) { 199 String result = "0000-01-01"; 200 String s = XMLTools.getStringValue( node ); 201 if ( s.length() == 8 ) { 202 String y = s.substring( 0, 4 ); 203 String m = s.substring( 4, 6 ); 204 String d = s.substring( 6, s.length() ); 205 result = y + '-' + m + '-' + d; 206 } else if ( s.length() == 4 ) { 207 String y = s.substring( 0, 4 ); 208 result = y + "-01-01"; 209 } 210 return result; 211 } 212 213 /** 214 * transforms a esri arc catalog date into a ISO8601 date format 215 * 216 * @param node 217 * @return 218 */ 219 public static String getISODate2( Node node ) { 220 221 String s = XMLTools.getStringValue( node ); 222 LOG.logDebug( "s: " + s ); 223 String[] arr = StringTools.toArray( s, ".", false ); 224 225 return arr[2] + '-' + arr[1] + '-' + arr[0]; 226 227 } 228 229 /** 230 * transforms a esri arc catalog date into a ISO8601 date format 231 * 232 * @param node 233 * @return 234 */ 235 public static String getISOTime( Node node ) { 236 String result = "00:00:00"; 237 String s = XMLTools.getStringValue( node ); 238 LOG.logDebug( "s: " + s ); 239 if ( s.length() == 6 ) { 240 String std = s.substring( 0, 2 ); 241 String m = s.substring( 2, 4 ); 242 String sec = s.substring( 4, 6 ); 243 result = std + ':' + m + ':' + sec; 244 } 245 return result; 246 } 247 248 /** 249 * returns the role code value matching the passed role code ID 250 * 251 * @param node 252 * @return 253 */ 254 public static String getRoleCode( Node node ) { 255 return roleCd.get( XMLTools.getStringValue( node ) ); 256 } 257 258 /** 259 * returns the role security code value matching the passed security code ID 260 * 261 * @param node 262 * @return the role security code value matching the passed security code ID 263 */ 264 public static String getSecurityCode( Node node ) { 265 if ( securityCd.containsKey( XMLTools.getStringValue( node ) ) ) { 266 return securityCd.get( XMLTools.getStringValue( node ) ); 267 } 268 return "unclassified"; 269 270 } 271 272 /** 273 * returns the role security code value matching the passed security code ID 274 * 275 * @param node 276 * @return the role security code value matching the passed security code ID 277 */ 278 public static String getMaintenanceCode( Node node ) { 279 if ( maintenanceCd.containsKey( XMLTools.getStringValue( node ) ) ) { 280 return maintenanceCd.get( XMLTools.getStringValue( node ) ); 281 } 282 return "unknown"; 283 284 } 285 286 /** 287 * returns the GeometricObjectTypeCode value matching the passed ESRI efeageom value 288 * 289 * @param node 290 * @return the GeometricObjectTypeCode value matching the passed ESRI 291 */ 292 public static String getGeometricObjectTypeCode( Node node ) { 293 return geomObjTypeCd.get( XMLTools.getStringValue( node ) ); 294 } 295 296 /** 297 * returns the date type code value matching the passed date type code ID 298 * 299 * @param node 300 * @return the date type code value matching the passed date type code ID 301 */ 302 public static String getDateTypeCode( Node node ) { 303 return dateTypCd.get( XMLTools.getStringValue( node ) ); 304 } 305 306 /** 307 * returns the topic category code value matching the passed topic category code ID. As default 308 * 'geoscientificInformation' will be returned if passed node is null. 309 * 310 * @param node 311 * @return 312 */ 313 public static String getTopCatTypeCode( Node node ) { 314 if ( node != null ) { 315 return topCatCd.get( XMLTools.getStringValue( node ) ); 316 } 317 return "geoscientificInformation"; 318 } 319 320 /** 321 * returns the CharacterSetCode value matching the passed CharacterSetCode ID 322 * 323 * @param node 324 * @return the CharacterSetCode value matching the passed 325 */ 326 public static String getCharacterSetCode( Node node ) { 327 return charSetCd.get( XMLTools.getStringValue( node ) ); 328 } 329 330 /** 331 * formats a number to a String formatted: ###.## 332 * 333 * @param node 334 * @return 335 */ 336 public static String formatCoord( Node node ) { 337 String s = XMLTools.getStringValue( node ); 338 DecimalFormat dc = new DecimalFormat( "###.##" ); 339 return dc.format( Double.parseDouble( s ) ).replace( ',', '.' ); 340 } 341 342 /** 343 * returns the ProgressCode value matching the passed progressCode 344 * 345 * @param node 346 * @return the ProgressCode value matching the passed progressCode 347 */ 348 public static String getProgressCode( Node node ) { 349 return progressCd.get( XMLTools.getStringValue( node ) ); 350 } 351 352 /** 353 * returns the MediumNameCode value matching the passed MediumNameCode 354 * 355 * @param node 356 * @return the MediumNameCode value matching the passed MediumNameCode 357 */ 358 public static String getMediumNameCode( Node node ) { 359 if ( mediumNameCd.containsKey( XMLTools.getStringValue( node ) ) ) { 360 return mediumNameCd.get( XMLTools.getStringValue( node ) ); 361 } 362 return "UNKNOWN"; 363 364 } 365 366 /** 367 * returns the MediumFormatCode value matching the passed MediumFormatCode 368 * 369 * @param node 370 * @return the MediumFormatCode value matching the passed MediumFormatCode 371 */ 372 public static String getMediumFormatCode( Node node ) { 373 if ( mediumFormatCd.containsKey( XMLTools.getStringValue( node ) ) ) { 374 return mediumFormatCd.get( XMLTools.getStringValue( node ) ); 375 } 376 return "UNKNOWN"; 377 378 } 379 }