    001    //$HeadURL: svn+ssh://developername@svn.wald.intevation.org/deegree/base/trunk/resources/eclipse/files_template.xml $
    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.portal.cataloguemanager.control;
    037
    038    import java.io.BufferedReader;
    039    import java.io.File;
    040    import java.io.FileInputStream;
    041    import java.io.FileOutputStream;
    042    import java.io.FileReader;
    043    import java.io.IOException;
    044    import java.net.URI;
    045    import java.nio.charset.Charset;
    046    import java.sql.Connection;
    047    import java.sql.Statement;
    048    import java.util.List;
    049    import java.util.Properties;
    050
    051    import org.deegree.enterprise.control.ajax.AbstractListener;
    052    import org.deegree.enterprise.control.ajax.ResponseHandler;
    053    import org.deegree.enterprise.control.ajax.WebEvent;
    054    import org.deegree.framework.log.ILogger;
    055    import org.deegree.framework.log.LoggerFactory;
    056    import org.deegree.framework.util.FileUtils;
    057    import org.deegree.framework.xml.NamespaceContext;
    058    import org.deegree.framework.xml.XMLFragment;
    059    import org.deegree.framework.xml.XMLParsingException;
    060    import org.deegree.framework.xml.XMLTools;
    061    import org.deegree.io.DBConnectionPool;
    062    import org.deegree.ogcbase.CommonNamespaces;
    063    import org.w3c.dom.Element;
    064    import org.xml.sax.SAXException;
    065
    066    /**
    067     * TODO add class documentation here
    068     *
    069     * @author <a href="mailto:name@deegree.org">Andreas Poth</a>
    070     * @author last edited by: $Author: admin $
    071     *
    072     * @version $Revision: $, $Date: $
    073     */
    074    public class DoConfigurationListener extends AbstractListener {
    075
    076        private static final ILogger LOG = LoggerFactory.getLogger( DoConfigurationListener.class );
    077
    078        private static final String[] sqlOracle = new String[] { "oracle/drop_harvester.sql",
    079                                                                "oracle/drop_searchTables.sql",
    080                                                                "oracle/drop_database.sql",
    081                                                                "oracle/create_database.sql",
    082                                                                "oracle/create_harvester.sql",
    083                                                                "oracle/create_searchTables.sql",
    084                                                                "oracle/create_spatial_index.sql",
    085                                                                "oracle/create_spatial_index.sql"};
    086
    087        private static final String[] sqlPostgis = new String[] { "postgis/drop_normal_index.sql",
    088                                                                 "postgis/drop_spatial_index.sql",
    089                                                                 "postgis/drop_harvester.sql",
    090                                                                 "postgis/drop_searchTables.sql",
    091                                                                 "postgis/drop_database.sql",
    092                                                                 "postgis/create_database.sql",
    093                                                                 "postgis/create_harvester.sql",
    094                                                                 "postgis/create_searchTables.sql",
    095                                                                 "postgis/create_normal_index.sql",
    096                                                                 "postgis/create_spatial_index.sql" };
    097
    098        private XMLFragment xml = null;
    099
    100        private String dbVendor;
    101
    102        private static NamespaceContext nsc = null;
    103        static {
    104            if ( nsc == null ) {
    105                nsc = CommonNamespaces.getNamespaceContext();
    106                nsc.addNamespace( "md", URI.create( "http://www.deegree.org/cataloguemanager" ) );
    107            }
    108        }
    109
    110        private WebEvent event;
    111
    112        /*
    113         * (non-Javadoc)
    114         *
    115         * @see
    116         * org.deegree.enterprise.control.ajax.AbstractListener#actionPerformed(org.deegree.enterprise.control.ajax.WebEvent
    117         * , org.deegree.enterprise.control.ajax.ResponseHandler)
    118         */
    119        public void actionPerformed( WebEvent event, ResponseHandler resp )
    120                                throws IOException {
    121            this.event = event;
    122            String cswurl = (String) event.getParameter().get( "cswurl" );
    123            String url = (String) event.getParameter().get( "url" );
    124            String db = (String) event.getParameter().get( "db" );
    125            String user = (String) event.getParameter().get( "user" );
    126            String password = (String) event.getParameter().get( "pw" );
    127            String sid = (String) event.getParameter().get( "sid" );
    128            String driver = null;
    129            String database = null;
    130            String[] sql = null;
    131            if ( db.equalsIgnoreCase( "postgres" ) ) {
    132                driver = "org.postgresql.Driver";
    133                database = "jdbc:postgresql://" + url + '/' + sid;
    134                sql = sqlPostgis;
    135                dbVendor = "postgres";
    136            } else if ( db.equalsIgnoreCase( "oracle" ) ) {
    137                driver = "oracle.jdbc.OracleDriver";
    138                database = "jdbc:oracle:thin:@" + url + ':' + sid;
    139                sql = sqlOracle;
    140                dbVendor = "oracle";
    141            } else {
    142                resp.writeAndClose( "ERROR: not supported database type" );
    143                return;
    144            }
    145            boolean newTables = (Boolean) event.getParameter().get( "newTables" );
    146            boolean transactions = (Boolean) event.getParameter().get( "transactions" );
    147            boolean searchClient = (Boolean) event.getParameter().get( "searchClient" );
    148            boolean editor = (Boolean) event.getParameter().get( "editor" );
    149            if ( newTables ) {
    150                try {
    151                    createTables( driver, database, user, password, sql );
    152                } catch ( Exception e ) {
    153                    resp.writeAndClose( "ERROR: can not create database: " + e.getMessage() );
    154                    return;
    155                }
    156            }
    157
    158            xml = new XMLFragment();
    159            try {
    160                xml.load( new File( event.getAbsolutePath( "./WEB-INF/web.xml" ) ).toURI().toURL() );
    161            } catch ( SAXException e ) {
    162                // should never happen
    163                e.printStackTrace();
    164            }
    165
    166            try {
    167                doCSWConfiguration( driver, database, user, password, cswurl, db, transactions );
    168            } catch ( Exception e ) {
    169                resp.writeAndClose( "ERROR: can not do CSW configuration: " + e.getMessage() );
    170                return;
    171            }
    172
    173            doSearchClientConfiguration( searchClient, cswurl );
    174
    175            doMetadataEditorConfiguration( cswurl );
    176
    177            markAsConfigured( searchClient, editor );
    178
    179            resp.writeAndClose( "success" );
    180        }
    181
    182        /**
    183         *
    184         * @param searchClient
    185         * @param editor
    186         * @throws IOException
    187         */
    188        private void markAsConfigured( boolean searchClient, boolean editor )
    189                                throws IOException {
    190            String s = event.getAbsolutePath( "WEB-INF/conf/setup/catalogueManager_config.properties" );
    191            Properties p = new Properties();
    192            FileInputStream fis = new FileInputStream( s );
    193            p.load( fis );
    194            fis.close();
    195            p.put( "configured", "true" );
    196            p.put( "searchClient", "" + searchClient );
    197            p.put( "editor", "" + editor );
    198            FileOutputStream fos = new FileOutputStream( s );
    199            p.store( fos, null );
    200            fos.close();
    201
    202        }
    203
    204        /**
    205         * @param searchClient
    206         * @param cswurl
    207         */
    208        private void doSearchClientConfiguration( boolean searchClient, String cswurl ) {
    209            // TODO Auto-generated method stub
    210
    211        }
    212
    213        /**
    214         * @param cswurl
    215         * @throws IOException
    216         */
    217        private void doMetadataEditorConfiguration( String cswurl ) throws IOException {
    218            String s = event.getAbsolutePath( "WEB-INF/conf/cataloguemanager/cataloguemanager.xml" );
    219            XMLFragment cm = new XMLFragment();
    220            try {
    221                cm.load( new File( s ).toURI().toURL() );
    222                String xpath = "md:CatalogueService/md:onlineResource";
    223                Element elem = XMLTools.getRequiredElement( cm.getRootElement(), xpath, nsc );
    224                elem.setAttribute( "xlink:href", cswurl );
    225                XMLTools.setNodeValue( elem, cswurl );
    226                FileUtils.writeToFile( s, cm.getAsPrettyString() );
    227            } catch ( Exception e ) {
    228                // should never happen
    229                e.printStackTrace();
    230                throw new IOException( e.getMessage() );
    231            }
    232        }
    233
    234        /**
    235         *
    236         * @param driver
    237         * @param url
    238         * @param user
    239         * @param password
    240         * @param cswurl
    241         * @param db
    242         * @param transactions
    243         * @throws XMLParsingException
    244         */
    245        private void doCSWConfiguration( String driver, String url, String user, String password, String cswurl, String db,
    246                                         boolean transactions )
    247                                throws Exception {
    248            // update CSW capabilities/configuration with desired URL
    249            String xpath = "./servlet[servlet-name ='owservice']/init-param[param-name ='csw.config']/param-value";
    250            String configFile = XMLTools.getRequiredNodeAsString( xml.getRootElement(), xpath, nsc );
    251            configFile = event.getAbsolutePath( configFile );
    252            XMLFragment csw = new XMLFragment( new File( configFile ).toURI().toURL() );
    253            xpath = "ows:OperationsMetadata/ows:Operation/ows:DCP/ows:HTTP/ows:Get";
    254            List<Element> elements = XMLTools.getElements( csw.getRootElement(), xpath, nsc );
    255            for ( Element element : elements ) {
    256                element.setAttributeNS( CommonNamespaces.XLNNS.toASCIIString(), "xlink:href", cswurl );
    257            }
    258            xpath = "ows:OperationsMetadata/ows:Operation/ows:DCP/ows:HTTP/ows:Post";
    259            elements = XMLTools.getElements( csw.getRootElement(), xpath, nsc );
    260            for ( Element element : elements ) {
    261                element.setAttributeNS( CommonNamespaces.XLNNS.toASCIIString(), "xlink:href", cswurl );
    262            }
    263
    264            // delete already existing feature type configurations
    265            FileUtils.writeToFile( configFile, csw.getAsPrettyString(), Charset.defaultCharset().displayName() );
    266            String ftFile = "WEB-INF/conf/csw/featuretypes/csw_postgres.xsd";
    267            ftFile = event.getAbsolutePath( ftFile );
    268            File tmp = new File(ftFile);
    269            if ( tmp.exists() ) {
    270                tmp.delete();
    271            }
    272            ftFile = "WEB-INF/conf/csw/featuretypes/csw_oracle.xsd";
    273            ftFile = event.getAbsolutePath( ftFile );
    274            tmp = new File(ftFile);
    275            if ( tmp.exists() ) {
    276                tmp.delete();
    277            }
    278
    279            // set database connection informations and feature type configurations
    280            if ( db.equalsIgnoreCase( "postgres" ) ) {
    281                ftFile = "WEB-INF/conf/csw/featuretypes/csw_postgres.xsd.ignore";
    282            } else if ( db.equalsIgnoreCase( "oracle" ) ) {
    283                ftFile = "WEB-INF/conf/csw/featuretypes/csw_oracle.xsd.ignore";
    284            }
    285
    286            ftFile = event.getAbsolutePath( ftFile );
    287            XMLFragment ftXML = new XMLFragment( new File( ftFile ).toURI().toURL() );
    288            xpath = "xs:annotation/xs:appinfo/dgjdbc:JDBCConnection/dgjdbc:Driver";
    289            Element element = (Element) XMLTools.getRequiredNode( ftXML.getRootElement(), xpath, nsc );
    290            XMLTools.setNodeValue( element, driver );
    291            xpath = "xs:annotation/xs:appinfo/dgjdbc:JDBCConnection/dgjdbc:Url";
    292            element = (Element) XMLTools.getRequiredNode( ftXML.getRootElement(), xpath, nsc );
    293            XMLTools.setNodeValue( element, url );
    294            xpath = "xs:annotation/xs:appinfo/dgjdbc:JDBCConnection/dgjdbc:User";
    295            element = (Element) XMLTools.getRequiredNode( ftXML.getRootElement(), xpath, nsc );
    296            XMLTools.setNodeValue( element, user );
    297            xpath = "xs:annotation/xs:appinfo/dgjdbc:JDBCConnection/dgjdbc:Password";
    298            element = (Element) XMLTools.getRequiredNode( ftXML.getRootElement(), xpath, nsc );
    299            XMLTools.setNodeValue( element, password );
    300            FileUtils.writeToFile( ftFile.substring( 0, ftFile.length() - 7 ), ftXML.getAsPrettyString(),
    301                                   Charset.defaultCharset().displayName() );
    302
    303            adaptProperties( driver, url, user, password, cswurl );
    304
    305        }
    306
    307        /**
    308         * @param driver
    309         * @param url
    310         * @param user
    311         * @param password
    312         * @param cswurl
    313         * @throws IOException
    314         */
    315        private void adaptProperties( String driver, String url, String user, String password, String cswurl ) throws IOException {
    316            File file = new File( event.getAbsolutePath( "./WEB-INF/classes/org/deegree/ogcwebservices/csw/csw202.properties" ) );
    317            try {
    318                FileInputStream fis = new FileInputStream( file );
    319                Properties prop = new Properties();
    320                prop.load( fis );
    321                fis.close();
    322
    323                prop.put( "db.driver", driver );
    324                prop.put( "db.url", url );
    325                prop.put( "db.user", user );
    326                prop.put( "db.password", password );
    327                prop.put( "csw.url", cswurl );
    328
    329                FileOutputStream fos = new FileOutputStream( file );
    330                prop.store( fos, null );
    331                fos.close();
    332            } catch ( Exception e ) {
    333                LOG.logWarning( file + ": " + e.getMessage() );
    334            }
    335            file = new File( event.getAbsolutePath( "./WEB-INF/classes/harvestrepository.properties" ) );
    336            try {
    337                FileInputStream fis = new FileInputStream( file );
    338                Properties prop = new Properties();
    339                prop.load( fis );
    340                fis.close();
    341
    342                prop.put( "harvester.Driver", driver );
    343                prop.put( "harvester.Url", url );
    344                prop.put( "harvester.User", user );
    345                prop.put( "harvester.Password", password );
    346
    347                FileOutputStream fos = new FileOutputStream( file );
    348                prop.store( fos, null );
    349                fos.close();
    350            } catch ( Exception e ) {
    351                LOG.logWarning( file + ": " + e.getMessage() );
    352            }
    353
    354        }
    355
    356        private void createTables( String driver, String url, String user, String password, String[] sql )
    357                                throws Exception {
    358
    359            for ( String script : sql ) {
    360                BufferedReader br = null;
    361                try {
    362                    String s = event.getAbsolutePath( "WEB-INF/scripts/sql/" + script );
    363                    LOG.logDebug( "load ", s );
    364                    br = new BufferedReader( new FileReader( s ) );
    365                } catch ( Exception e ) {
    366                    throw new Exception( "can not open database creation script: " + script );
    367                }
    368                String thisLine, sqlQuery;
    369                Statement stmt = null;
    370                DBConnectionPool pool = DBConnectionPool.getInstance();
    371                Connection conn = null;
    372                try {
    373                    conn = pool.acquireConnection( driver, url, user, password );
    374                    stmt = conn.createStatement();
    375                    sqlQuery = "";
    376                    while ( ( thisLine = br.readLine() ) != null ) {
    377
    378                        // Skip comments and empty lines
    379                        if ( thisLine.length() > 0 && thisLine.charAt( 0 ) == '-' || thisLine.length() == 0 ) {
    380                            continue;
    381                        }
    382                        sqlQuery = sqlQuery + " " + thisLine.trim();
    383                        // If one command complete
    384                        if ( sqlQuery.charAt( sqlQuery.length() - 1 ) == ';' ) {
    385                            sqlQuery = sqlQuery.replace( ';', ' ' ); // Remove the ; since jdbc complains
    386                            LOG.logDebug( "execute ", sqlQuery );
    387                            try {
    388                                stmt.execute( sqlQuery );
    389                            } catch ( Exception ex ) {
    390                                LOG.logInfo( "executed: ", sqlQuery );
    391                                LOG.logError( ex.getMessage() );
    392                            }
    393                            sqlQuery = "";
    394                        }
    395                    }
    396                } catch ( Exception ex ) {
    397                    br.close();
    398                    throw ex;
    399                } finally {
    400                    try {
    401                        if ( conn != null ) {
    402                            pool.releaseConnection( conn, driver, url, user, password );
    403                        }
    404                    } catch ( Exception e ) {
    405                        // do nothing
    406                    }
    407                }
    408                br.close();
    409            }
    410            if ( "oracle".equalsIgnoreCase( dbVendor ) ) {
    411                // special for creating oracle trigger
    412                createOracleTrigger( driver, url, user, password );
    413            }
    414        }
    415
    416        private void createOracleTrigger( String driver, String url, String user, String password )
    417                                throws Exception, IOException {
    418            BufferedReader br = null;
    419            try {
    420                String s = event.getAbsolutePath( "WEB-INF/scripts/sql/oracle/create_trigger.sql"  );
    421                LOG.logDebug( "load ", s );
    422                br = new BufferedReader( new FileReader( s ) );
    423            } catch ( Exception e ) {
    424                throw new Exception( "can not open database creation script: create_trigger.sql" );
    425            }
    426            String thisLine, sqlQuery;
    427            Statement stmt = null;
    428            DBConnectionPool pool = DBConnectionPool.getInstance();
    429            Connection conn = null;
    430            try {
    431                conn = pool.acquireConnection( driver, url, user, password );
    432                stmt = conn.createStatement();
    433                sqlQuery = "";
    434                while ( ( thisLine = br.readLine() ) != null ) {
    435
    436                    // Skip comments and empty lines
    437                    if ( (thisLine.length() > 0 && thisLine.charAt( 0 ) == '-') || thisLine.length() == 0 ) {
    438                        continue;
    439                    }
    440                    sqlQuery = sqlQuery + " " + thisLine.trim();
    441                    // If one command complete
    442                    if ( sqlQuery.indexOf( "END;" ) > -1 ) {
    443                        LOG.logDebug( "execute ", sqlQuery );
    444                        try {
    445                            stmt.execute( sqlQuery );
    446                        } catch ( Exception ex ) {
    447                            LOG.logInfo( "executed: ", sqlQuery );
    448                            LOG.logError( ex.getMessage() );
    449                        }
    450                        sqlQuery = "";
    451                    }
    452                }
    453            } catch ( Exception ex ) {
    454                br.close();
    455                throw ex;
    456            } finally {
    457                try {
    458                    if ( conn != null ) {
    459                        pool.releaseConnection( conn, driver, url, user, password );
    460                    }
    461                } catch ( Exception e ) {
    462                    // do nothing
    463                }
    464            }
    465            br.close();
    466        }
    467
    468    }