1 /* 2 * Copyright (c) 2002-2017, Mairie de Paris 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright notice 10 * and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright notice 13 * and the following disclaimer in the documentation and/or other materials 14 * provided with the distribution. 15 * 16 * 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 * 32 * License 1.0 33 */ 34 package fr.paris.lutece.plugins.antexecuter.service; 35 36 import fr.paris.lutece.plugins.antexecuter.business.CheckDatabaseDAO; 37 import fr.paris.lutece.portal.service.init.IStartUpBeforeSpring; 38 import fr.paris.lutece.portal.service.util.AppException; 39 import fr.paris.lutece.portal.service.util.AppPathService; 40 41 import org.apache.tools.ant.DefaultLogger; 42 import org.apache.tools.ant.Project; 43 import org.apache.tools.ant.ProjectHelper; 44 45 import java.io.File; 46 47 48 /** 49 * This class dynamically executes an ant buildfile. 50 * The ant file is executed only if the database doesn't exist yet. 51 * See methods javadoc for more details. 52 */ 53 public class AntExecuter implements IStartUpBeforeSpring 54 { 55 // CONSTANTS 56 private static final String PATH_BUILDFILE = "/WEB-INF/sql/build.xml"; 57 private static final String ANTFILE_PROPERTY = "ant.file"; 58 private static final String ANT_TARGET = "all"; 59 60 61 /** 62 * Executes the ant buildfile. 63 */ 64 private void executeAntFile( ) 65 { 66 // Project creation 67 Project project = new Project( ); 68 project.init( ); 69 70 // Logger to see ant execution and error messages 71 DefaultLogger logger = new DefaultLogger( ); 72 logger.setMessageOutputLevel( Project.MSG_INFO ); 73 logger.setErrorPrintStream( System.err ); 74 logger.setOutputPrintStream( System.out ); 75 project.addBuildListener( logger ); 76 77 // Loading of build file, configuration of the project and execution 78 File buildFile = new File( AppPathService.getAbsolutePathFromRelativePath( PATH_BUILDFILE ) ); 79 ProjectHelper.configureProject( project, buildFile ); 80 project.setProperty( ANTFILE_PROPERTY, buildFile.getAbsolutePath( ) ); 81 project.executeTarget( ANT_TARGET ); 82 } 83 84 /** 85 * This method is specified in the StartUpService interface. 86 * It is called when the webapp is deployed. 87 * It calls a random SQL query and executes the build file if the query 88 * fails. 89 */ 90 @Override 91 public void process( ) 92 { 93 try 94 { 95 CheckDatabaseDAO.checkDataBase( ); 96 97 }catch( AppException e ){ 98 executeAntFile( ); 99 } 100 101 } 102 @Override 103 public int order() { 104 return 1; 105 } 106 }