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