001    //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/model/metadata/iso19115/XMLFactory.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    package org.deegree.model.metadata.iso19115;
037    
038    import java.net.URI;
039    import java.net.URL;
040    import java.util.List;
041    
042    import org.deegree.datatypes.Code;
043    import org.deegree.framework.xml.XMLTools;
044    import org.deegree.ogcbase.CommonNamespaces;
045    import org.w3c.dom.Element;
046    
047    /**
048     * <code>XMLFactory</code> with append methods for the various ISO 19115 elements as specified in
049     * the OWS common specification 1.0.0.
050     *
051     * @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a>
052     * @author last edited by: $Author: mschneider $
053     *
054     * @version 2.0, $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $
055     *
056     * @since 2.0
057     */
058    
059    public class XMLFactory extends org.deegree.ogcbase.XMLFactory {
060    
061        private static URI OWS = CommonNamespaces.OWSNS;
062    
063        private static String POWS = CommonNamespaces.OWS_PREFIX + ':';
064    
065        /**
066         * Appends the given <code>CitedResponsibleParty</code> object as XML.
067         *
068         * @param root
069         * @param party
070         */
071        public static void appendCitedResponsibleParty( Element root, CitedResponsibleParty party ) {
072            Element elem = XMLTools.appendElement( root, OWS, POWS + "ResponsiblePartySubsetType" );
073    
074            String[] individualNames = party.getIndividualName();
075            if ( ( individualNames != null ) && ( individualNames.length != 0 ) && ( individualNames[0] != null ) )
076                XMLTools.appendElement( elem, OWS, POWS + "IndividualName", individualNames[0] );
077    
078            String[] positionNames = party.getPositionName();
079            if ( ( positionNames != null ) && ( positionNames.length != 0 ) && ( positionNames[0] != null ) )
080                XMLTools.appendElement( elem, OWS, POWS + "PositionName", positionNames[0] );
081    
082            RoleCode[] roles = party.getRoleCode();
083            if ( ( roles != null ) && ( roles.length != 0 ) && ( roles[0] != null ) )
084                XMLTools.appendElement( elem, OWS, POWS + "Role", roles[0].getValue() );
085    
086            ContactInfo[] contactInfos = party.getContactInfo();
087            if ( ( contactInfos != null ) && ( contactInfos.length != 0 ) && ( contactInfos[0] != null ) )
088                appendContactInfo( elem, contactInfos[0] );
089        }
090    
091        /**
092         * Appends the contact info.
093         *
094         * @param root
095         * @param contactInfo
096         */
097        public static void appendContactInfo( Element root, ContactInfo contactInfo ) {
098            Element elem = XMLTools.appendElement( root, OWS, POWS + "ContactInfo" );
099    
100            appendPhone( elem, contactInfo.getPhone() );
101            appendAddress( elem, contactInfo.getAddress() );
102            appendOnlineResource( elem, contactInfo.getOnLineResource() );
103    
104            String hours = contactInfo.getHoursOfService();
105            String instructions = contactInfo.getContactInstructions();
106    
107            if ( hours != null )
108                XMLTools.appendElement( elem, OWS, POWS + "HoursOfService", hours );
109            if ( instructions != null )
110                XMLTools.appendElement( elem, OWS, POWS + "ContactInstructions", instructions );
111        }
112    
113        /**
114         * Appends the phone data.
115         *
116         * @param root
117         * @param phone
118         */
119        public static void appendPhone( Element root, Phone phone ) {
120            if ( phone == null )
121                return;
122    
123            Element elem = XMLTools.appendElement( root, OWS, POWS + "Phone" );
124    
125            String[] voice = phone.getVoice();
126            for ( String number : voice )
127                XMLTools.appendElement( elem, OWS, POWS + "Voice", number );
128    
129            String[] facsimile = phone.getFacsimile();
130            for ( String number : facsimile )
131                XMLTools.appendElement( elem, OWS, POWS + "Facsimile", number );
132        }
133    
134        /**
135         * Appends the address data.
136         *
137         * @param root
138         * @param address
139         */
140        public static void appendAddress( Element root, Address address ) {
141            if ( address == null )
142                return;
143    
144            Element elem = XMLTools.appendElement( root, OWS, POWS + "Address" );
145    
146            String[] deliveryPoint = address.getDeliveryPoint();
147            for ( String point : deliveryPoint )
148                XMLTools.appendElement( elem, OWS, POWS + "DeliveryPoint", point );
149    
150            String city = address.getCity();
151            if ( city != null )
152                XMLTools.appendElement( elem, OWS, POWS + "City", city );
153    
154            String adminArea = address.getAdministrativeArea();
155            if ( adminArea != null )
156                XMLTools.appendElement( elem, OWS, POWS + "AdministrativeArea", adminArea );
157    
158            String postalCode = address.getPostalCode();
159            if ( postalCode != null )
160                XMLTools.appendElement( elem, OWS, POWS + "PostalCode", postalCode );
161    
162            String country = address.getCountry();
163            if ( country != null )
164                XMLTools.appendElement( elem, OWS, POWS + "Country", country );
165    
166            String[] email = address.getElectronicMailAddress();
167            for ( String mail : email )
168                XMLTools.appendElement( elem, OWS, POWS + "ElectronicMailAddress", mail );
169        }
170    
171        /**
172         * Appends the link.
173         *
174         * @param root
175         * @param link
176         */
177        public static void appendOnlineResource( Element root, OnlineResource link ) {
178            if ( link == null )
179                return;
180            appendOnlineResource( root, link.getLinkage().getHref() );
181        }
182    
183        /**
184         * Appends the link.
185         *
186         * @param root
187         * @param link
188         */
189        public static void appendOnlineResource( Element root, URL link ) {
190            if ( link == null )
191                return;
192    
193            // fix up URL to standard form
194            String url = link.toExternalForm();
195            if ( !url.toString().endsWith( "?" ) ) {
196                if ( !url.endsWith( "&" ) ) {
197                    if ( url.indexOf( "?" ) == -1 )
198                        url = url + "?";
199                    else
200                        url = url + "&";
201                }
202            }
203    
204            root.setAttributeNS( "http://www.w3.org/1999/xlink", "xlink:type", "simple" );
205            root.setAttributeNS( "http://www.w3.org/1999/xlink", "xlink:href", url );
206    
207        }
208    
209        /**
210         * Appends an online resource in a newly created element in the OWS namespace. The new element
211         * will be named according to the tagName parameter.
212         *
213         * @param root
214         * @param link
215         * @param tagName
216         */
217        public static void appendOnlineResource( Element root, OnlineResource link, String tagName ) {
218            Element newElem = XMLTools.appendElement( root, OWS, POWS + tagName );
219            appendOnlineResource( newElem, link );
220        }
221    
222        /**
223         * Appends an online resource in a newly created element in the OWS namespace. The new element
224         * will be named according to the tagName parameter.
225         *
226         * @param root
227         * @param link
228         * @param tagName
229         */
230        public static void appendOnlineResource( Element root, URL link, String tagName ) {
231            Element newElem = XMLTools.appendElement( root, OWS, POWS + tagName );
232            appendOnlineResource( newElem, link );
233        }
234    
235        /**
236         * Appends the access constraint element. Please note that a lot of the information contained
237         * within will not be included in the output due to restrictions of the OWS specification.
238         *
239         * @param root
240         * @param constraints
241         */
242        public static void appendAccessConstraint( Element root, Constraints constraints ) {
243            List<String> constrList = constraints.getUseLimitations();
244            String constr = "";
245            if ( constrList.size() != 0 )
246                constr = constrList.get( 0 );
247    
248            XMLTools.appendElement( root, OWS, POWS + "AccessConstraint", constr );
249        }
250    
251        /**
252         * Appends an element of type CodeType with the given name and content.
253         *
254         * @param root
255         * @param tagName
256         * @param code
257         */
258        public static void appendCode( Element root, String tagName, Code code ) {
259            Element elem = XMLTools.appendElement( root, OWS, POWS + tagName, code.getCode() );
260            URI codeSpace = code.getCodeSpace();
261            if ( codeSpace != null )
262                elem.setAttribute( "codeSpace", codeSpace.toString() );
263        }
264    
265        /**
266         * Appends the contents of a <code>Keywords</code> object.
267         *
268         * @param root
269         * @param keywords
270         */
271        public static void appendKeywords( Element root, Keywords keywords ) {
272            Element elem = XMLTools.appendElement( root, OWS, POWS + "Keywords" );
273    
274            String[] words = keywords.getKeywords();
275            for ( String word : words )
276                XMLTools.appendElement( elem, OWS, POWS + "Keyword", word );
277    
278            TypeCode code = keywords.getTypeCode();
279            if ( code != null )
280                appendCode( elem, "Type", code );
281        }
282    
283    }