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