You are viewing a plain text version of this content. The canonical link for it is here.
Posted to kalumet-commits@incubator.apache.org by jb...@apache.org on 2011/10/29 14:13:10 UTC

svn commit: r1194890 - in /incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater: J2EEApplicationServerUpdater.java SoftwareUpdater.java SqlScriptUpdater.java

Author: jbonofre
Date: Sat Oct 29 14:13:10 2011
New Revision: 1194890

URL: http://svn.apache.org/viewvc?rev=1194890&view=rev
Log:
Add the SQL script updater.

Added:
    incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/SqlScriptUpdater.java
Modified:
    incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/J2EEApplicationServerUpdater.java
    incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/SoftwareUpdater.java

Modified: incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/J2EEApplicationServerUpdater.java
URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/J2EEApplicationServerUpdater.java?rev=1194890&r1=1194889&r2=1194890&view=diff
==============================================================================
--- incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/J2EEApplicationServerUpdater.java (original)
+++ incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/J2EEApplicationServerUpdater.java Sat Oct 29 14:13:10 2011
@@ -319,7 +319,7 @@ public class J2EEApplicationServerUpdate
         for (Iterator applicationIterator = server.getJ2EEApplications().iterator(); applicationIterator.hasNext(); ) {
             J2EEApplication application = (J2EEApplication) applicationIterator.next();
             try {
-                JEEApplicationUpdater.update(environment, server, application, updateLog);
+                J2EEApplicationUpdater.update(environment, server, application, updateLog);
             } catch (UpdateException updateException) {
                 // the J2EE application update has failed
                 if (application.isBlocker()) {

Modified: incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/SoftwareUpdater.java
URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/SoftwareUpdater.java?rev=1194890&r1=1194889&r2=1194890&view=diff
==============================================================================
--- incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/SoftwareUpdater.java (original)
+++ incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/SoftwareUpdater.java Sat Oct 29 14:13:10 2011
@@ -43,10 +43,10 @@ public class SoftwareUpdater {
     private static final transient Logger LOGGER = LoggerFactory.getLogger(SoftwareUpdater.class);
 
     /**
-     * Updates a <code>Software</code>.
+     * Updates a software.
      *
-     * @param environment the target environment.
-     * @param software    the target software.
+     * @param environment the target <code>Environment</code>.
+     * @param software    the target <code>Software</code>.
      * @param updateLog   the <code>UpdateLog</code> to use.
      */
     public static void update(Environment environment, Software software, UpdateLog updateLog) throws UpdateException {

Added: incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/SqlScriptUpdater.java
URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/SqlScriptUpdater.java?rev=1194890&view=auto
==============================================================================
--- incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/SqlScriptUpdater.java (added)
+++ incubator/kalumet/trunk/agent/src/main/java/org/apache/kalumet/agent/updater/SqlScriptUpdater.java Sat Oct 29 14:13:10 2011
@@ -0,0 +1,393 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.kalumet.agent.updater;
+
+import org.apache.commons.vfs.FileObject;
+import org.apache.kalumet.FileManipulator;
+import org.apache.kalumet.FileManipulatorException;
+import org.apache.kalumet.KalumetException;
+import org.apache.kalumet.agent.Configuration;
+import org.apache.kalumet.agent.utils.EventUtils;
+import org.apache.kalumet.model.*;
+import org.apache.kalumet.model.update.UpdateLog;
+import org.apache.kalumet.model.update.UpdateMessage;
+import org.apache.kalumet.utils.NotifierUtils;
+import org.apache.kalumet.utils.PublisherUtils;
+import org.apache.kalumet.utils.SqlScriptUtils;
+import org.apache.kalumet.utils.VariableUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Iterator;
+
+/**
+ * SQL script updater.
+ */
+public class SqlScriptUpdater {
+
+    private static final transient Logger LOGGER = LoggerFactory.getLogger(SqlScriptUpdater.class);
+
+    /**
+     * Executes SQL script.
+     *
+     * @param environment the target <code>Environment</code>.
+     * @param server      the target <code>J2EEApplicationServer</code>.
+     * @param application the target <code>J2EEApplication</code>.
+     * @param database    the target <code>Database</code>.
+     * @param sqlScript   the target <code>SqlScript</code>.
+     * @param updateLog   the <code>UpdateLog</code> to use.
+     * @throws UpdateException in case of update failure.
+     */
+    public static void execute(Environment environment, J2EEApplicationServer server, J2EEApplication application, Database database, SqlScript sqlScript, UpdateLog updateLog) throws UpdateException {
+        LOGGER.info("Executing SQL script {}", sqlScript.getName());
+        updateLog.addUpdateMessage(new UpdateMessage("info", "Executing SQL script " + sqlScript.getName()));
+        EventUtils.post(environment, "UPDATE", "Executing SQL script " + sqlScript.getName());
+
+        if (!sqlScript.isActive()) {
+            // SQL script is not active
+            LOGGER.info("SQL Script {} is inactive, so not executed", sqlScript.getName());
+            updateLog.addUpdateMessage(new UpdateMessage("info", "SQL Script " + sqlScript.getName() + " is inactive, so not executed"));
+            EventUtils.post(environment, "UPDATE", "SQL Script " + sqlScript.getName() + " is inactive, so not executed");
+            return;
+        }
+
+        // construct the SQL script URI
+        String sqlScriptUri = VariableUtils.replace(sqlScript.getUri(), environment.getVariables());
+        if (!FileManipulator.protocolExists(sqlScriptUri)) {
+            // the SQL script URI is relative , construct the SQL Script URI using
+            // the J2EE Application URI
+            LOGGER.debug("SQL Script URI is relative to J2EE application URI");
+            sqlScriptUri = FileManipulator.format(VariableUtils.replace(application.getUri(), environment.getVariables())) + "!/" + sqlScriptUri;
+        }
+        // get the application cache directory
+        String applicationCacheDir = null;
+        try {
+            applicationCacheDir = FileManipulator.createJ2EEApplicationCacheDir(environment, application);
+        } catch (FileManipulatorException fileManipulatorException) {
+            LOGGER.error("Can't initialize J2EE application cache directory", fileManipulatorException);
+            throw new UpdateException("Can't initialize J2EE application cache directory", fileManipulatorException);
+        }
+
+        // get file manipulator instance
+        FileManipulator fileManipulator = null;
+        try {
+            fileManipulator = FileManipulator.getInstance();
+        } catch (FileManipulatorException fileManipulatorException) {
+            LOGGER.error("Can't initialize the file manipulator", fileManipulatorException);
+            throw new UpdateException("Can't initialize the file manipulator", fileManipulatorException);
+        }
+
+        // copy the SQL script in the application working directory
+        String sqlScriptCache = applicationCacheDir + "/sql/" + sqlScript.getName() + ".cache";
+        String sqlScriptRuntime = applicationCacheDir + "/sql/" + sqlScript.getName();
+        try {
+            fileManipulator.copy(sqlScriptUri, sqlScriptCache);
+        } catch (FileManipulatorException fileManipulatorException) {
+            LOGGER.error("Can't copy the SQL script from {} to {}", new Object[]{sqlScriptUri, sqlScriptCache}, fileManipulatorException);
+            throw new UpdateException("Can't copy the SQL script from " + sqlScriptUri + " to " + sqlScriptCache, fileManipulatorException);
+        }
+
+        if (fileManipulator.isFolder(sqlScriptCache)) {
+            // TODO add a generic method to reuse in the case of directory
+
+            // the user provided a directory
+            updateLog.addUpdateMessage(new UpdateMessage("info", sqlScript.getName() + " is a folder, iterate in the SQL scripts"));
+            EventUtils.post(environment, "UPDATE", sqlScript.getName() + " is a folder, iterate in the SQL scripts");
+            LOGGER.info(sqlScript.getName() + " is a folder, iterate in the SQL scripts");
+            FileObject[] children = fileManipulator.browse(sqlScriptCache);
+            for (int i = 0; i < children.length; i++) {
+                FileObject current = children[i];
+                String name = current.getName().getBaseName();
+                String singleSqlScriptCache = sqlScriptCache + "/" + name;
+                String singleSqlScriptRuntime = sqlScriptRuntime + "/" + name;
+                // change mappings in the current SQL script
+                for (Iterator mappingIterator = sqlScript.getMappings().iterator(); mappingIterator.hasNext(); ) {
+                    Mapping mapping = (Mapping) mappingIterator.next();
+                    FileManipulator.searchAndReplace(mapping.getKey(), VariableUtils.replace(mapping.getValue(), environment.getVariables()), singleSqlScriptCache);
+                }
+                try {
+                    if (sqlScript.isForce() || (!fileManipulator.contentEquals(singleSqlScriptCache, singleSqlScriptRuntime))) {
+                        fileManipulator.copy(singleSqlScriptCache, singleSqlScriptRuntime);
+                        if (database.getSqlCommand() != null && database.getSqlCommand().trim().length() > 0) {
+                            // execute SQL script using system command
+                            String command = VariableUtils.replace(database.getSqlCommand(), environment.getVariables());
+                            String output = SqlScriptUtils.executeUsingCommand(singleSqlScriptRuntime, command);
+                            updateLog.addUpdateMessage(new UpdateMessage("info", "SQL script " + name + " executed: " + output));
+                            EventUtils.post(environment, "UPDATE", "SQL script " + name + " executed: " + output);
+                            LOGGER.info("SQL script " + name + " executed: " + output);
+                        } else {
+                            // execute SQL script using JDBC
+                            String user = null;
+                            String password = null;
+                            String driver = null;
+                            String url = null;
+                            if (database.getConnectionPool() != null && database.getConnectionPool().trim().length() > 0) {
+                                // the database is linked to a connection pool
+                                // looking for the connection pool (from the cache)
+                                String connectionPoolName = VariableUtils.replace(database.getConnectionPool(), environment.getVariables());
+                                JDBCConnectionPool connectionPool = server.getJDBCConnectionPool(connectionPoolName);
+                                if (connectionPool == null) {
+                                    LOGGER.error("JDBC connection pool {} is not found in J2EE application server {}", database.getConnectionPool(), server.getName());
+                                    throw new UpdateException("JDBC connection pool " + database.getConnectionPool() + " is not found in J2EE application server " + server.getName());
+                                }
+                                user = VariableUtils.replace(connectionPool.getUser(), environment.getVariables());
+                                password = VariableUtils.replace(connectionPool.getPassword(), environment.getVariables());
+                                driver = VariableUtils.replace(connectionPool.getDriver(), environment.getVariables());
+                                url = VariableUtils.replace(connectionPool.getUrl(), environment.getVariables());
+                            } else {
+                                // use the database connection data
+                                user = VariableUtils.replace(database.getUser(), environment.getVariables());
+                                password = VariableUtils.replace(database.getPassword(), environment.getVariables());
+                                driver = VariableUtils.replace(database.getDriver(), environment.getVariables());
+                                url = VariableUtils.replace(database.getJdbcurl(), environment.getVariables());
+                            }
+                            // execute SQL script using JDBC
+                            SqlScriptUtils.executeUsingJdbc(singleSqlScriptRuntime, driver, user, password, url);
+                        }
+                        // add message
+                        updateLog.setStatus("Update performed");
+                        updateLog.setUpdated(true);
+                        updateLog.addUpdateMessage(new UpdateMessage("info", "SQL script " + sqlScript.getName() + " executed"));
+                        EventUtils.post(environment, "UPDATE", "SQL script " + sqlScript.getName() + " executed");
+                        LOGGER.info("SQL script {} executed", sqlScript.getName());
+                    }
+                } catch (Exception e) {
+                    // SQL script execution failed, delete the SQL script from the cache
+                    try {
+                        fileManipulator.delete(sqlScriptRuntime);
+                    } catch (FileManipulatorException fileManipulatorException) {
+                        LOGGER.warn("Can't delete {}/sql/{}", new Object[]{applicationCacheDir, sqlScript.getName()}, fileManipulatorException);
+                    }
+                    LOGGER.error("SQL script {} execution failed", sqlScript.getName(), e);
+                    throw new UpdateException("SQL script " + sqlScript.getName() + " execution failed", e);
+                }
+            }
+        } else {
+            // the user provided a single SQL script
+
+            // change mappings in the SQL script
+            for (Iterator mappingIterator = sqlScript.getMappings().iterator(); mappingIterator.hasNext(); ) {
+                Mapping mapping = (Mapping) mappingIterator.next();
+                FileManipulator.searchAndReplace(mapping.getKey(), VariableUtils.replace(mapping.getValue(), environment.getVariables()), sqlScriptCache);
+            }
+
+            // compare the SQL script with the target one
+            try {
+                if (sqlScript.isForce() || (!fileManipulator.contentEquals(sqlScriptCache, sqlScriptRuntime))) {
+                    // the SQL script needs to be updated and executed
+                    // copy the SQL script to the target
+                    fileManipulator.copy(sqlScriptCache, sqlScriptRuntime);
+                    if (database.getSqlCommand() != null && database.getSqlCommand().trim().length() > 0) {
+                        // execute SQL script using system command
+                        String command = VariableUtils.replace(database.getSqlCommand(), environment.getVariables());
+                        String output = SqlScriptUtils.executeUsingCommand(sqlScriptRuntime, command);
+                        updateLog.addUpdateMessage(new UpdateMessage("info", "SQL script " + sqlScript.getName() + " executed: " + output));
+                        EventUtils.post(environment, "UPDATE", "SQL script " + sqlScript.getName() + " executed: " + output);
+                        LOGGER.info("SQL script " + sqlScript.getName() + " executed: " + output);
+                    } else {
+                        // execute SQL script using JDBC
+                        String user = null;
+                        String password = null;
+                        String driver = null;
+                        String url = null;
+                        if (database.getConnectionPool() != null && database.getConnectionPool().trim().length() > 0) {
+                            // the database is linked to a connection pool
+                            // looking for the connection pool (from the cache)
+                            String connectionPoolName = VariableUtils.replace(database.getConnectionPool(), environment.getVariables());
+                            JDBCConnectionPool connectionPool = server.getJDBCConnectionPool(connectionPoolName);
+                            if (connectionPool == null) {
+                                LOGGER.error("JDBC connection pool {} is not found in J2EE application server {}", database.getConnectionPool(), server.getName());
+                                throw new UpdateException("JDBC connection pool " + database.getConnectionPool() + " is not found in J2EE application server " + server.getName());
+                            }
+                            user = VariableUtils.replace(connectionPool.getUser(), environment.getVariables());
+                            password = VariableUtils.replace(connectionPool.getPassword(), environment.getVariables());
+                            driver = VariableUtils.replace(connectionPool.getDriver(), environment.getVariables());
+                            url = VariableUtils.replace(connectionPool.getUrl(), environment.getVariables());
+                        } else {
+                            // use the database connection data
+                            user = VariableUtils.replace(database.getUser(), environment.getVariables());
+                            password = VariableUtils.replace(database.getPassword(), environment.getVariables());
+                            driver = VariableUtils.replace(database.getDriver(), environment.getVariables());
+                            url = VariableUtils.replace(database.getJdbcurl(), environment.getVariables());
+                        }
+                        // execute SQL script using JDBC
+                        SqlScriptUtils.executeUsingJdbc(sqlScriptRuntime, driver, user, password, url);
+                    }
+                    // add message
+                    updateLog.setStatus("Update performed");
+                    updateLog.setUpdated(true);
+                    updateLog.addUpdateMessage(new UpdateMessage("info", "SQL script " + sqlScript.getName() + " executed"));
+                    EventUtils.post(environment, "UPDATE", "SQL script " + sqlScript.getName() + " executed");
+                    LOGGER.info("SQL script " + sqlScript.getName() + " executed");
+                }
+            } catch (Exception e) {
+                // SQL script execution failed, delete the SQL script from the cache
+                try {
+                    fileManipulator.delete(sqlScriptRuntime);
+                } catch (FileManipulatorException fileManipulatorException) {
+                    LOGGER.warn("Can't delete {}/sql/{}", new Object[]{applicationCacheDir, sqlScript.getName()}, fileManipulatorException);
+                }
+                LOGGER.error("SQL script {} execution failed", sqlScript.getName(), e);
+                throw new UpdateException("SQL script " + sqlScript.getName() + " execution failed", e);
+            }
+        }
+
+        // change mappings in the SQL scripts
+        for (Iterator mappingIterator = sqlScript.getMappings().iterator(); mappingIterator.hasNext(); ) {
+            Mapping mapping = (Mapping) mappingIterator.next();
+            FileManipulator.searchAndReplace(mapping.getKey(), VariableUtils.replace(mapping.getValue(), environment.getVariables()), sqlScriptCache);
+        }
+
+        // compare the SQL script with the target one
+        try {
+            if (sqlScript.isForce() || (!fileManipulator.contentEquals(sqlScriptCache, sqlScriptRuntime))) {
+                // the SQL script needs to be updated and executed
+                // copy the SQL script to the target
+                fileManipulator.copy(sqlScriptCache, sqlScriptRuntime);
+                if (database.getSqlCommand() != null && database.getSqlCommand().trim().length() > 0) {
+                    // execute SQL script using system command
+                    String command = VariableUtils.replace(database.getSqlCommand(), environment.getVariables());
+                    String output = SqlScriptUtils.executeUsingCommand(applicationCacheDir + "/sql/" + sqlScript.getName(), command);
+                    updateLog.addUpdateMessage(new UpdateMessage("info", "SQL script " + sqlScript.getName() + " executed: " + output));
+                    EventUtils.post(environment, "UPDATE", "SQL script " + sqlScript.getName() + " executed: " + output);
+                    LOGGER.info("SQL script {} executed: {}", sqlScript.getName(), output);
+                } else {
+                    // execute SQL script using JDBC
+                    String user = null;
+                    String password = null;
+                    String driver = null;
+                    String url = null;
+                    if (database.getConnectionPool() != null && database.getConnectionPool().trim().length() > 0) {
+                        // the database is linked to a connection pool
+                        // looking for the connection pool (from the cache)
+                        String connectionPoolName = VariableUtils.replace(database.getConnectionPool(), environment.getVariables());
+                        JDBCConnectionPool connectionPool = server.getJDBCConnectionPool(connectionPoolName);
+                        if (connectionPool == null) {
+                            LOGGER.error("JDBC connection pool {} is not found in J2EE application server {}", database.getConnectionPool(), server.getName());
+                            throw new UpdateException("JDBC connection pool " + database.getConnectionPool() + " is not found in J2EE application server " + server.getName());
+                        }
+                        user = VariableUtils.replace(connectionPool.getUser(), environment.getVariables());
+                        password = VariableUtils.replace(connectionPool.getPassword(), environment.getVariables());
+                        driver = VariableUtils.replace(connectionPool.getDriver(), environment.getVariables());
+                        url = VariableUtils.replace(connectionPool.getUrl(), environment.getVariables());
+                    } else {
+                        // use the database connection data
+                        user = VariableUtils.replace(database.getUser(), environment.getVariables());
+                        password = VariableUtils.replace(database.getPassword(), environment.getVariables());
+                        driver = VariableUtils.replace(database.getDriver(), environment.getVariables());
+                        url = VariableUtils.replace(database.getJdbcurl(), environment.getVariables());
+                    }
+                    // execute SQL script using JDBC
+                    SqlScriptUtils.executeUsingJdbc(sqlScriptRuntime, driver, user, password, url);
+                }
+                // add message
+                updateLog.setStatus("Update performed");
+                updateLog.setUpdated(true);
+                updateLog.addUpdateMessage(new UpdateMessage("info", "SQL script " + sqlScript.getName() + " executed"));
+                EventUtils.post(environment, "UPDATE", "SQL script " + sqlScript.getName() + " executed");
+                LOGGER.info("SQL script {} executed", sqlScript.getName());
+            }
+        } catch (Exception e) {
+            // SQL script execution failed, delete the SQL script from the cache
+            try {
+                fileManipulator.delete(sqlScriptRuntime);
+            } catch (FileManipulatorException fileManipulatorException) {
+                LOGGER.warn("Can't delete {}/sql/{}", new Object[]{applicationCacheDir, sqlScript.getName()}, fileManipulatorException);
+            }
+            LOGGER.error("SQL script {} execution failed", sqlScript.getName(), e);
+            throw new UpdateException("SQL script " + sqlScript.getName() + " execution failed", e);
+        }
+    }
+
+    /**
+     * Wrapper method to execute a SQL script via WS.
+     *
+     * @param environmentName the target environment name.
+     * @param serverName      the target J2EE application server name.
+     * @param applicationName the target J2EE application name.
+     * @param databaseName    the target database name.
+     * @param sqlScriptName   the target SQL script name.
+     * @throws KalumetException in case of execution failure.
+     */
+    public static void execute(String environmentName, String serverName, String applicationName, String databaseName, String sqlScriptName) throws KalumetException {
+        LOGGER.info("SQL script {} execution requested by WS", sqlScriptName);
+
+        // load configuration
+        LOGGER.debug("Loading configuration");
+        Kalumet kalumet = Kalumet.digeste(Configuration.CONFIG_LOCATION);
+
+        // looking for component objects
+        LOGGER.debug("Looking for component objects");
+        Environment environment = kalumet.getEnvironment(environmentName);
+        if (environment == null) {
+            LOGGER.error("Environment {} is not found in the configuration", environmentName);
+            throw new KalumetException("Environment " + environmentName + " is not found in the configuration");
+        }
+        J2EEApplicationServer applicationServer = environment.getJ2EEApplicationServers().getJ2EEApplicationServer(serverName);
+        if (applicationServer == null) {
+            LOGGER.error("J2EE application server {} is not found in environment {}", serverName, environment.getName());
+            throw new KalumetException("J2EE application server " + serverName + " is not found in environment " + environment.getName());
+        }
+        J2EEApplication application = applicationServer.getJ2EEApplication(applicationName);
+        if (application == null) {
+            LOGGER.error("J2EE application {} is not found in J2EE application server {}", applicationName, applicationServer.getName());
+            throw new KalumetException("J2EE application " + applicationName + " is not found in J2EE application server " + applicationServer.getName());
+        }
+        Database database = application.getDatabase(databaseName);
+        if (database == null) {
+            LOGGER.error("Database {} is not found in J2EE application {}", databaseName, application.getName());
+            throw new KalumetException("Database " + databaseName + " is not found in J2EE application " + application.getName());
+        }
+        SqlScript sqlScript = database.getSqlScript(sqlScriptName);
+        if (sqlScript == null) {
+            LOGGER.error("SQL script {} is not found in database {}", sqlScriptName, database.getName());
+            throw new KalumetException("SQL script " + sqlScriptName + " is not found in database " + database.getName());
+        }
+
+        // post an event and create the update log.
+        LOGGER.debug("Post an event and create the update log");
+        EventUtils.post(environment, "UPDATE", "SQL script " + sqlScript.getName() + " execution request by WS");
+        UpdateLog updateLog = new UpdateLog("SQL script " + sqlScript.getName() + " execution in progress ...", sqlScript.getName(), environment);
+
+        // send a notification and waiting for the count down.
+        LOGGER.info("Send a notification and waiting for the count down");
+        NotifierUtils.waitAndNotify(environment);
+
+        try {
+            // call execution
+            LOGGER.debug("Call SQL script updater");
+            SqlScriptUpdater.execute(environment, applicationServer, application, database, sqlScript, updateLog);
+        } catch (Exception e) {
+            LOGGER.error("SQL script {} execution failed", sqlScript.getName(), e);
+            EventUtils.post(environment, "ERROR", "SQL script " + sqlScript.getName() + " execution failed: " + e.getMessage());
+            updateLog.setStatus("SQL script " + sqlScript.getName() + " execution error");
+            updateLog.addUpdateMessage(new UpdateMessage("error", "SQL script " + sqlScript.getName() + " execution failed: " + e.getMessage()));
+            PublisherUtils.publish(environment);
+            throw new UpdateException("SQL script " + sqlScript.getName() + " execution failed", e);
+        }
+
+        // execution completed.
+        LOGGER.info("SQL script {} executed", sqlScript.getName());
+        updateLog.setStatus("SQL script " + sqlScript.getName() + " executed");
+        updateLog.addUpdateMessage(new UpdateMessage("info", "SQL script " + sqlScript.getName() + " executed"));
+        LOGGER.info("Publishing update report");
+        PublisherUtils.publish(environment);
+    }
+
+}