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 = "1000-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    }