This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository echobase. See http://git.codelutin.com/echobase.git commit 9daf16e1e5de051961443830690f9b55c1ce8914 Author: Tony CHEMIT <chemit@codelutin.com> Date: Tue Jan 20 18:12:44 2015 +0100 fixes #6460: Afficher les logs d'excution des script R --- .../fr/ifremer/echobase/io/CommandLineUtils.java | 52 +++++++++++----------- .../exportCoser/ExportCoserConfiguration.java | 10 +++++ .../service/exportCoser/ExportCoserService.java | 7 ++- .../exportCoser/GenerateCoserMapException.java | 25 +++++++++++ .../ui/actions/AbstractWaitAndExecAction.java | 2 +- .../echobase/ui/actions/exportCoser/Export.java | 19 +++++++- 6 files changed, 87 insertions(+), 28 deletions(-) diff --git a/echobase-domain/src/main/java/fr/ifremer/echobase/io/CommandLineUtils.java b/echobase-domain/src/main/java/fr/ifremer/echobase/io/CommandLineUtils.java index f85c9b1..0de9782 100644 --- a/echobase-domain/src/main/java/fr/ifremer/echobase/io/CommandLineUtils.java +++ b/echobase-domain/src/main/java/fr/ifremer/echobase/io/CommandLineUtils.java @@ -21,14 +21,15 @@ package fr.ifremer.echobase.io; * #L% */ -import fr.ifremer.echobase.EchoBaseTechnicalException; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; +import org.apache.commons.exec.ExecuteException; import org.apache.commons.exec.LogOutputStream; import org.apache.commons.exec.PumpStreamHandler; import org.apache.commons.logging.Log; import java.io.File; +import java.io.IOException; /** * Utils method around a command line execution. @@ -59,52 +60,53 @@ public class CommandLineUtils { return result; } - public static void invokeCommandeLine(Log logger, - CommandLine commandLine, - String errorMsg, - File workDir) { - DefaultExecutor executor = new DefaultExecutor(); + public static void invokeCommandeLine(Log logger, CommandLine commandLine, File workDir) throws IOException { - ExecutorLog executorLog = new ExecutorLog(); + DefaultExecutor executor = new DefaultExecutor(); + ExecutorLog executorLog = new ExecutorLog(logger); executor.setStreamHandler(new PumpStreamHandler(executorLog)); // set resource directory executor.setWorkingDirectory(workDir); // invoke - int exitValue; - String log = executorLog.getLog(); - try { - if (logger.isInfoEnabled()) { - logger.info("Command line '" + commandLine.toString() + "' will be execute"); - } - exitValue = executor.execute(commandLine); - } catch (Exception eee) { - throw new EchoBaseTechnicalException(errorMsg + "\n" + log, eee); - } - if (logger.isInfoEnabled()) { - logger.info("Command line end with exit with value : " + exitValue); + logger.info("Command line '" + commandLine.toString() + "' will be execute"); } - if (exitValue != 0) { - if (logger.isErrorEnabled()) { - logger.error("Command failed:\n" + log); - } - throw new EchoBaseTechnicalException(errorMsg + "\n" + log.replaceAll("\\n", "<br/>\n")); + + try { + executor.execute(commandLine); + } catch (ExecuteException eee) { + + int exitValue = eee.getExitValue(); + String message = "Command line '" + commandLine.toString() + "' failed with exit code " + exitValue + "\nError Log:\n" + executorLog.getLog(); + throw new IOException(message, eee); + } + } protected static class ExecutorLog extends LogOutputStream { + final Log logger; + protected StringBuilder executorLog = new StringBuilder(); + public ExecutorLog(Log logger) { + this.logger = logger; + } + @Override protected void processLine(String line, int level) { - executorLog.append(line); + executorLog.append("\n").append(line); + if (logger.isDebugEnabled()) { + logger.debug(line); + } } public String getLog() { return executorLog.toString(); } + } } diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/ExportCoserConfiguration.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/ExportCoserConfiguration.java index 6e505b8..13d97e6 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/ExportCoserConfiguration.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/ExportCoserConfiguration.java @@ -116,6 +116,8 @@ public class ExportCoserConfiguration extends AbstractEchobaseActionConfiguratio */ private JdbcConfiguration dbConfiguration; + private String scriptErrorLog; + public ExportCoserConfiguration() { } @@ -243,6 +245,14 @@ public class ExportCoserConfiguration extends AbstractEchobaseActionConfiguratio this.comment = comment; } + public String getScriptErrorLog() { + return scriptErrorLog; + } + + public void setScriptErrorLog(String scriptErrorLog) { + this.scriptErrorLog = scriptErrorLog; + } + @Override public void destroy() throws IOException { if (workingDirectory != null) { diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/ExportCoserService.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/ExportCoserService.java index 602062e..21b53fc 100644 --- a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/ExportCoserService.java +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/ExportCoserService.java @@ -416,7 +416,12 @@ public class ExportCoserService extends EchoBaseServiceSupport { dbConfiguration.getLogin(), dbConfiguration.getPassword()); - CommandLineUtils.invokeCommandeLine(log, commandLine, "Failed to launch R script: " + scriptFile, workingDirectory); + try { + CommandLineUtils.invokeCommandeLine(log, commandLine, workingDirectory); + } catch (IOException e) { + + throw new GenerateCoserMapException("Impossible de générer les cartes en utilisant EchoR", e.getMessage()); + } File result = new File(scriptPrefixPath + "meanMaps"); return result; diff --git a/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/GenerateCoserMapException.java b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/GenerateCoserMapException.java new file mode 100644 index 0000000..32b5c9c --- /dev/null +++ b/echobase-services/src/main/java/fr/ifremer/echobase/services/service/exportCoser/GenerateCoserMapException.java @@ -0,0 +1,25 @@ +package fr.ifremer.echobase.services.service.exportCoser; + +import java.io.IOException; + +/** + * Created on 1/20/15. + * + * @author Tony Chemit - chemit@codelutin.com + * @since 2.8 + */ +public class GenerateCoserMapException extends IOException { + + private static final long serialVersionUID = 1L; + + private final String log; + + public GenerateCoserMapException(String message, String log) { + super(message); + this.log = log; + } + + public String getLog() { + return log; + } +} diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/AbstractWaitAndExecAction.java b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/AbstractWaitAndExecAction.java index 1089d08..5426c89 100644 --- a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/AbstractWaitAndExecAction.java +++ b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/AbstractWaitAndExecAction.java @@ -71,7 +71,7 @@ public abstract class AbstractWaitAndExecAction<M extends AbstractEchobaseAction return model.getError(); } - public final String getErrorStack() { + public String getErrorStack() { String errorStack = null; if (model.hasError()) { diff --git a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/exportCoser/Export.java b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/exportCoser/Export.java index 5a42d70..79e56f8 100644 --- a/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/exportCoser/Export.java +++ b/echobase-ui/src/main/java/fr/ifremer/echobase/ui/actions/exportCoser/Export.java @@ -23,6 +23,7 @@ package fr.ifremer.echobase.ui.actions.exportCoser; import fr.ifremer.echobase.services.service.exportCoser.ExportCoserConfiguration; import fr.ifremer.echobase.services.service.exportCoser.ExportCoserService; +import fr.ifremer.echobase.services.service.exportCoser.GenerateCoserMapException; import fr.ifremer.echobase.ui.actions.AbstractWaitAndExecAction; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -50,7 +51,14 @@ public class Export extends AbstractWaitAndExecAction<ExportCoserConfiguration, if (log.isInfoEnabled()) { log.info("Start Coser export for mission" + model.getMissionId()); } - service.doExport(model); + try { + service.doExport(model); + } catch (GenerateCoserMapException e) { + + model.setScriptErrorLog(e.getLog()); + throw e; + } + } @Override @@ -80,4 +88,13 @@ public class Export extends AbstractWaitAndExecAction<ExportCoserConfiguration, return result; } + @Override + public String getErrorStack() { + String errorStack = super.getErrorStack(); + String scriptErrorLog = getModel().getScriptErrorLog(); + if (scriptErrorLog != null) { + errorStack += "\n" + scriptErrorLog; + } + return errorStack; + } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.