001    /*----------------------------------------------------------------------------
002     This file is part of deegree, http://deegree.org/
003     Copyright (C) 2001-2009 by:
004       Department of Geography, University of Bonn
005     and
006       lat/lon GmbH
007    
008     This library is free software; you can redistribute it and/or modify it under
009     the terms of the GNU Lesser General Public License as published by the Free
010     Software Foundation; either version 2.1 of the License, or (at your option)
011     any later version.
012     This library is distributed in the hope that it will be useful, but WITHOUT
013     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
014     FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
015     details.
016     You should have received a copy of the GNU Lesser General Public License
017     along with this library; if not, write to the Free Software Foundation, Inc.,
018     59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019    
020     Contact information:
021    
022     lat/lon GmbH
023     Aennchenstr. 19, 53177 Bonn
024     Germany
025     http://lat-lon.de/
026    
027     Department of Geography, University of Bonn
028     Prof. Dr. Klaus Greve
029     Postfach 1147, 53001 Bonn
030     Germany
031     http://www.geographie.uni-bonn.de/deegree/
032    
033     e-mail: info@deegree.org
034    ----------------------------------------------------------------------------*/
035    package org.deegree.tools.importer;
036    
037    import java.io.BufferedReader;
038    import java.io.IOException;
039    import java.io.InputStream;
040    import java.io.InputStreamReader;
041    import java.util.Iterator;
042    import java.util.List;
043    import java.util.Properties;
044    
045    import org.deegree.framework.log.ILogger;
046    import org.deegree.framework.log.LoggerFactory;
047    import org.deegree.framework.util.StringTools;
048    
049    /**
050     *
051     * This generic importer handles the way of inserting data. First data are loaded from source
052     * container, followed by structural validation, transformation and content validation. Finally the
053     * exporter insert data in target container. The classes the loader needed for this five steps must
054     * be specified in 'classes.properties'.
055     *
056     * @author <a href="mailto:buesching@lat-lon.de">Lyn Buesching</a>
057     * @author last edited by: $Author: buesching $
058     *
059     * @version $Revision: 1.3 $, $Date: 2007-10-30 14:34:54 $
060     *
061     */
062    public class Importer {
063    
064        private static final ILogger LOG = LoggerFactory.getLogger( Importer.class );
065    
066        private Loader loader;
067    
068        private StructValidator structValidator;
069    
070        private ContentValidator contentValidator;
071    
072        private Transformer transformer;
073    
074        private Exporter exporter;
075    
076        /**
077         * The constructor reads the classes which should be used during import process from the
078         * property file 'classes.properties' and instantiate them. Make sure that the desired classes
079         * are configured in this file!
080         */
081        public Importer() {
082            this( "classes.properties" );
083        }
084    
085        public Importer( String propertiesFile ) {
086    
087            LOG.logInfo( Messages.getString( "Importer.BEGIN_INSTANTIATION" ) );
088            // read properties file
089            Properties classes = new Properties();
090            try {
091                InputStream is = Importer.class.getResourceAsStream( propertiesFile );
092                InputStreamReader isr = new InputStreamReader( is );
093                BufferedReader br = new BufferedReader( isr );
094                String line = null;
095                while ( ( line = br.readLine() ) != null ) {
096                    if ( !line.trim().startsWith( "#" ) ) {
097                        String[] tmp = StringTools.toArray( line.trim(), "=", false );
098                        classes.put( tmp[0], tmp[1] );
099                    }
100                }
101                // instantiate classes essential for importer
102                String loaderClass = classes.getProperty( "loader" );
103                LOG.logInfo( Messages.getString( "Importer.LOADER_CLASS", loaderClass ) );
104                loader = (Loader) Class.forName( loaderClass ).newInstance();
105    
106                String structValidatorClass = classes.getProperty( "structValidator" );
107                LOG.logInfo( Messages.getString( "Importer.STRUCTVALIDATOR_CLASS", structValidatorClass ) );
108                structValidator = (StructValidator) Class.forName( structValidatorClass ).newInstance();
109    
110                String transformerClass = classes.getProperty( "transformer" );
111                LOG.logInfo( Messages.getString( "Importer.TRANSFORMER_CLASS", transformerClass ) );
112                transformer = (Transformer) Class.forName( transformerClass ).newInstance();
113    
114                String contentValidatorClass = classes.getProperty( "contentValidator" );
115                LOG.logInfo( Messages.getString( "Importer.CONTENTVALIDATOR_CLASS", contentValidatorClass ) );
116                contentValidator = (ContentValidator) Class.forName( contentValidatorClass ).newInstance();
117    
118                String exporterClass = classes.getProperty( "exporter" );
119                LOG.logInfo( Messages.getString( "Importer.EXPORTER_CLASS", exporterClass ) );
120                exporter = (Exporter) Class.forName( exporterClass ).newInstance();
121    
122                LOG.logInfo( Messages.getString( "Importer.END_INSTANTIATION" ) );
123    
124            } catch ( IOException e ) {
125                LOG.logError( Messages.getString( "Importer.ERROR_READING_CLASSES_PROPERTIES", e.getMessage() ) );
126            } catch ( ClassNotFoundException e ) {
127                LOG.logError( Messages.getString( "Importer.ERROR_FIND_CLASSES", e.getMessage() ) );
128            } catch ( InstantiationException e ) {
129                LOG.logError( Messages.getString( "Importer.ERROR_INSTANTIATION", e.getMessage() ) );
130            } catch ( IllegalAccessException e ) {
131                LOG.logError( Messages.getString( "Importer.ERROR_ACCESS", e.getMessage() ) );
132            }
133    
134        }
135    
136        /**
137         * handles the import
138         *
139         * @param importObjects
140         *            List of objects to import
141         */
142        public void handleImport( List<Object> importObjects ) {
143            int numberObjects = importObjects.size();
144            LOG.logInfo( Messages.getString( "Importer.BEGIN_IMPORT", numberObjects ) );
145            long startTimeAll = System.currentTimeMillis();
146            int successCounter = 0;
147            int counter = 1;
148            for ( Iterator iter = importObjects.iterator(); iter.hasNext(); ) {
149                long startTime = System.currentTimeMillis();
150                Object element = (Object) iter.next();
151                Object loadedObject = load( element );
152                if ( loadedObject != null ) {
153                    LOG.logInfo( Messages.getString( "Importer.OBJECT_LOADED", counter ) );
154                    if ( validateStructure( loadedObject ) ) {
155                        Object transformedObject = transform( loadedObject );
156                        if ( transformedObject != null ) {
157                            LOG.logInfo( Messages.getString( "Importer.OBJECT_TRANSFORMED", counter ) );
158                            if ( validateContent( transformedObject ) ) {
159                                if ( export( transformedObject ) ) {
160                                    LOG.logInfo( Messages.getString( "Importer.OBJECT_EXPORTED", counter ) );
161                                    ++successCounter;
162                                } else {
163                                    LOG.logInfo( Messages.getString( "Importer.ERROR_EXPORT" ) );
164                                }
165                            }
166                        }
167                    }
168                    if ( LOG.getLevel() == ILogger.LOG_DEBUG ) {
169                        long endTime = System.currentTimeMillis();
170                        LOG.logDebug( "Time needed to import one object: ", endTime - startTime );
171                    }
172                }
173                LOG.logInfo( Messages.getString( "Importer.IMPORT_ONE_OBJECT_END" ) );
174                counter++;
175            }
176            long endTimeAll = System.currentTimeMillis();
177            if ( LOG.getLevel() == ILogger.LOG_DEBUG ) {
178                String msg = StringTools.concat( 200, "Time needed to import ", successCounter, " object(s): " );
179                LOG.logDebug( msg, endTimeAll - startTimeAll );
180            }
181            LOG.logInfo( Messages.getString( "Importer.IMPORT_END", successCounter, numberObjects ) );
182        }
183    
184        private Object load( Object importObject ) {
185            return loader.loadObject( importObject );
186        }
187    
188        private boolean validateStructure( Object importObject ) {
189            return structValidator.validate( importObject );
190        }
191    
192        private Object transform( Object importObject ) {
193            return transformer.transform( importObject );
194        }
195    
196        private boolean validateContent( Object importObject ) {
197            return contentValidator.validate( importObject );
198        }
199    
200        private boolean export( Object importObject ) {
201            return exporter.export( importObject );
202        }
203    
204    }