001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/portal/standard/csw/MetadataTransformer.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001-2008 by:
006     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     53177 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.portal.standard.csw;
045    
046    import java.io.FileInputStream;
047    import java.io.FileNotFoundException;
048    import java.io.IOException;
049    import java.io.InputStream;
050    import java.io.Reader;
051    import java.io.StringWriter;
052    
053    import javax.xml.transform.Transformer;
054    import javax.xml.transform.TransformerConfigurationException;
055    import javax.xml.transform.TransformerException;
056    import javax.xml.transform.TransformerFactory;
057    import javax.xml.transform.TransformerFactoryConfigurationError;
058    import javax.xml.transform.stream.StreamResult;
059    import javax.xml.transform.stream.StreamSource;
060    
061    import org.deegree.framework.log.ILogger;
062    import org.deegree.framework.log.LoggerFactory;
063    import org.deegree.i18n.Messages;
064    import org.deegree.portal.standard.context.control.ContextLoadListener;
065    
066    /**
067     * A <code>${type_name}</code> class.<br/> 
068     * TODO class description
069     * 
070     * @author <a href="mailto:mays@lat-lon.de">Judit Mays</a>
071     * @author last edited by: $Author: apoth $
072     * 
073     * @version 2.0, $Revision: 9346 $, $Date: 2007-12-27 17:39:07 +0100 (Do, 27 Dez 2007) $
074     * 
075     * @since 2.0
076     */
077    public class MetadataTransformer {
078    
079        private static final ILogger LOG = LoggerFactory.getLogger( ContextLoadListener.class );
080    
081        /**
082         * The <code>Transformer</code> object used in the transformation of a map context xml to
083         * html.
084         */
085        private Transformer transformer = null;
086    
087        /**
088         * Creates a new MetadataTransformer and initializes it with the given <code>file</code> (path
089         * and name).
090         * 
091         * @param filePathName
092         * @throws FileNotFoundException,
093         *             if filePathName does not point to an existing file.
094         */
095        public MetadataTransformer( String filePathName ) throws FileNotFoundException {
096            initTransformer( filePathName );
097        }
098    
099        /**
100         * @param filePathName
101         * @throws FileNotFoundException
102         */
103        private void initTransformer( String filePathName )
104                                throws FileNotFoundException {
105    
106            InputStream xslInputStream = new FileInputStream( filePathName );
107    
108            try {
109                TransformerFactory tFactory = TransformerFactory.newInstance();
110                transformer = tFactory.newTransformer( new StreamSource( xslInputStream ) );
111            } catch ( TransformerConfigurationException e ) {
112                LOG.logError( e.getMessage() );
113            } catch ( TransformerFactoryConfigurationError e ) {
114                LOG.logError( e.getMessage() );
115            }
116        }
117    
118        /**
119         * Transforms the context pointed to by <code>context</code> into html using
120         * <code>xsltURL</code>
121         * 
122         * @param metadataXml
123         *            The <code>Reader</code> containing the xml document to be transformed.
124         * @param catalog
125         *            The name of the catalog.
126         * @param serviceCatalogs
127         * @param hits
128         *            The number of records matched for this catalog.
129         * @param startPosition
130         *            The position to start displaying the matched records from.
131         * @param metaVersion
132         *            The version of metadata to transform ( list, overview, detailed ).
133         * @return Returns result of transformation.
134         * @throws TransformerException
135         * @throws IOException
136         */
137        public String transformMetadata( Reader metadataXml, String catalog, String[] serviceCatalogs,
138                                        int hits, int startPosition, String metaVersion )
139                                throws TransformerException, IOException {
140    
141            if ( transformer == null ) {
142                throw new IOException( Messages.getMessage( "IGEO_STD_CSW_TRANSFORMER_ERROR" ) );
143            }
144    
145            StringWriter sw = new StringWriter();
146            StreamResult strmResult = new StreamResult( sw );
147            StreamSource xmlSrc = new StreamSource( metadataXml );
148    
149            // turn array of Strings into one comma-separated String
150            StringBuffer sb = new StringBuffer();
151            if ( serviceCatalogs != null ) {
152                for ( int i = 0; i < serviceCatalogs.length; i++ ) {
153                    sb.append( serviceCatalogs[i] );
154                    if ( i < serviceCatalogs.length - 1 ) {
155                        sb.append( "," );
156                    }
157                }
158            }
159    
160            // setting global variables for xslt-scripts
161            transformer.setParameter( "CATALOG", catalog );
162            transformer.setParameter( "SERVICECATALOGS", sb.toString() );
163            transformer.setParameter( "HITS", new Integer( hits ) );
164            transformer.setParameter( "STARTPOS", new Integer( startPosition ) );
165            transformer.setParameter( "METAVERSION", metaVersion );
166    
167            transformer.transform( xmlSrc, strmResult );
168            try {
169                sw.close();
170            } catch ( IOException e ) {
171                LOG.logError( "Unable to close string writer.\n" );
172            }
173    
174            return sw.toString();
175        }
176    
177        @Override
178        public String toString() {
179            return transformer.toString();
180        }
181    
182    }