diff --git a/keywords/java/step-library-commons/pom.xml b/keywords/java/step-library-commons/pom.xml new file mode 100644 index 0000000..dcedd15 --- /dev/null +++ b/keywords/java/step-library-commons/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + step-library-commons + + + ch.exense.step.library + step-library-parent + 0.0.0-SNAPSHOT + ../../../step-library-parent + + + + + diff --git a/keywords/java/step-library-kw-http/src/main/java/ch/exense/step/examples/common/helper/AbstractEnhancedKeyword.java b/keywords/java/step-library-commons/src/main/java/ch/exense/step/library/commons/AbstractEnhancedKeyword.java similarity index 84% rename from keywords/java/step-library-kw-http/src/main/java/ch/exense/step/examples/common/helper/AbstractEnhancedKeyword.java rename to keywords/java/step-library-commons/src/main/java/ch/exense/step/library/commons/AbstractEnhancedKeyword.java index b5269f3..d6d6732 100644 --- a/keywords/java/step-library-kw-http/src/main/java/ch/exense/step/examples/common/helper/AbstractEnhancedKeyword.java +++ b/keywords/java/step-library-commons/src/main/java/ch/exense/step/library/commons/AbstractEnhancedKeyword.java @@ -1,20 +1,20 @@ -package ch.exense.step.examples.common.helper; - -import step.handlers.javahandler.AbstractKeyword; - -/** - * @author Jonathan Rubiero - */ -public class AbstractEnhancedKeyword extends AbstractKeyword { - - @Override - public boolean onError(Exception e) { - if(e instanceof BusinessException) { - output.setBusinessError(e.getMessage()); - return false; - } else { - return super.onError(e); - } - } - -} +package ch.exense.step.library.commons; + +import step.handlers.javahandler.AbstractKeyword; + +/** + * @author Jonathan Rubiero + */ +public class AbstractEnhancedKeyword extends AbstractKeyword { + + @Override + public boolean onError(Exception e) { + if(e instanceof BusinessException) { + output.setBusinessError(e.getMessage()); + return false; + } else { + return super.onError(e); + } + } + +} diff --git a/keywords/java/step-library-commons/src/main/java/ch/exense/step/library/commons/AbstractProcessKeyword.java b/keywords/java/step-library-commons/src/main/java/ch/exense/step/library/commons/AbstractProcessKeyword.java new file mode 100644 index 0000000..47dceee --- /dev/null +++ b/keywords/java/step-library-commons/src/main/java/ch/exense/step/library/commons/AbstractProcessKeyword.java @@ -0,0 +1,155 @@ +/******************************************************************************* + * Copyright (C) 2020, exense GmbH + * + * This file is part of STEP + * + * STEP is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * STEP is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with STEP. If not, see . + ******************************************************************************/ +package ch.exense.step.library.commons; + +import ch.exense.commons.processes.ManagedProcess; +import ch.exense.commons.processes.ManagedProcess.ManagedProcessException; +import step.grid.io.Attachment; +import step.grid.io.AttachmentHelper; +import step.handlers.javahandler.AbstractKeyword; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.util.List; +import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; + +public abstract class AbstractProcessKeyword extends AbstractKeyword { + + protected static final int PROCESS_TIMEOUT = 60000; + + public AbstractProcessKeyword() { + super(); + } + + public static class OutputConfiguration { + + private final boolean alwaysAttachOutput; + private final int maxOutputPayloadSize; + private final int maxOutputAttachmentSize; + private final boolean printExitCode; + private final boolean checkExitCode; + + public OutputConfiguration() { + this(true, 1000, 1000000, true, true); + } + + public OutputConfiguration(boolean alwaysAttachOutput, int maxOutputPayloadSize, int maxOutputAttachmentSize, + boolean printExitCode, boolean checkExitCode) { + super(); + this.alwaysAttachOutput = alwaysAttachOutput; + this.maxOutputPayloadSize = maxOutputPayloadSize; + this.maxOutputAttachmentSize = maxOutputAttachmentSize; + this.printExitCode = printExitCode; + this.checkExitCode = checkExitCode; + } + + protected boolean isAlwaysAttachOutput() { + return alwaysAttachOutput; + } + + protected int getMaxOutputPayloadSize() { + return maxOutputPayloadSize; + } + + protected int getMaxOutputAttachmentSize() { + return maxOutputAttachmentSize; + } + + protected boolean isCheckExitCode() { + return checkExitCode; + } + } + + protected void executeManagedCommand(String cmd, int timeoutMs) throws Exception { + executeManagedCommand(cmd, timeoutMs, new OutputConfiguration(), null); + } + + protected void executeManagedCommand(String cmd, int timeoutMs, OutputConfiguration outputConfiguration) throws Exception { + executeManagedCommand(cmd, timeoutMs, outputConfiguration, null); + } + + protected void executeManagedCommand(List cmd, int timeoutMs, OutputConfiguration outputConfiguration, Consumer postProcess) throws Exception { + ManagedProcess process = new ManagedProcess(cmd); + executeManagedCommand(timeoutMs, outputConfiguration, postProcess, process); + } + + protected void executeManagedCommand(String cmd, int timeoutMs, OutputConfiguration outputConfiguration, Consumer postProcess) throws Exception { + ManagedProcess process = new ManagedProcess(cmd); + executeManagedCommand(timeoutMs, outputConfiguration, postProcess, process); + } + + protected void executeManagedCommand(int timeoutMs, OutputConfiguration outputConfiguration, + Consumer postProcess, ManagedProcess process) + throws ManagedProcessException, InterruptedException, IOException { + try { + boolean hasError = false; + process.start(); + try { + int exitCode = process.waitFor(timeoutMs); + if (outputConfiguration.isCheckExitCode() && exitCode != 0) { + output.setBusinessError("Process exited with code " + exitCode); + hasError = true; + } + if(outputConfiguration.printExitCode) { + output.add("Exit_code", Integer.toString(exitCode)); + } + if(postProcess != null) { + postProcess.accept(process); + } + } catch (TimeoutException e) { + output.setBusinessError("Process didn't exit within the defined timeout of "+timeoutMs+"ms"); + hasError = true; + } + + if(hasError || outputConfiguration.isAlwaysAttachOutput()) { + attachOutputs(process, outputConfiguration); + } + } finally { + process.close(); + } + } + + protected void attachOutputs(ManagedProcess process, OutputConfiguration outputConfiguration) throws IOException { + attachOutput("stdout", process.getProcessOutputLog(), outputConfiguration); + attachOutput("stderr", process.getProcessErrorLog(), outputConfiguration); + } + + protected void attachOutput(String outputName, File file, OutputConfiguration outputConfiguration) throws IOException { + StringBuilder processOutputBuilder = new StringBuilder(); + Files.readAllLines(file.toPath(), Charset.defaultCharset()).forEach(l -> processOutputBuilder.append(l).append("\n")); + + String processOutput = processOutputBuilder.toString(); + + output.add(outputName, processOutput.substring(0, Math.min(processOutput.length(), outputConfiguration.maxOutputPayloadSize))); + + if(processOutput.length() > outputConfiguration.maxOutputPayloadSize) { + Attachment attachment = AttachmentHelper.generateAttachmentFromByteArray( + processOutput.substring(0, Math.min(processOutput.length(), outputConfiguration.maxOutputAttachmentSize)).getBytes(), outputName + ".log"); + output.addAttachment(attachment); + + if (file.length() > outputConfiguration.maxOutputAttachmentSize) { + output.add("technicalWarning", + outputName + " size exceeded. " + outputName + " has been attached and truncated."); + } + } + } +} diff --git a/keywords/java/step-library-kw-http/src/main/java/ch/exense/step/examples/common/helper/BusinessException.java b/keywords/java/step-library-commons/src/main/java/ch/exense/step/library/commons/BusinessException.java similarity index 69% rename from keywords/java/step-library-kw-http/src/main/java/ch/exense/step/examples/common/helper/BusinessException.java rename to keywords/java/step-library-commons/src/main/java/ch/exense/step/library/commons/BusinessException.java index e1b404a..e26ede6 100644 --- a/keywords/java/step-library-kw-http/src/main/java/ch/exense/step/examples/common/helper/BusinessException.java +++ b/keywords/java/step-library-commons/src/main/java/ch/exense/step/library/commons/BusinessException.java @@ -1,9 +1,9 @@ -package ch.exense.step.examples.common.helper; - -public class BusinessException extends RuntimeException { - - public BusinessException(String message) { - super(message); - } - -} +package ch.exense.step.library.commons; + +public class BusinessException extends RuntimeException { + + public BusinessException(String message) { + super(message); + } + +} diff --git a/keywords/java/step-library-kw-http/pom.xml b/keywords/java/step-library-kw-http/pom.xml index 23a20d2..413ad87 100644 --- a/keywords/java/step-library-kw-http/pom.xml +++ b/keywords/java/step-library-kw-http/pom.xml @@ -12,6 +12,11 @@ + + ch.exense.step.library + step-library-commons + ${project.version} + org.apache.httpcomponents httpclient diff --git a/keywords/java/step-library-kw-http/src/main/java/ch/exense/step/examples/http/keywords/HttpClientKeyword.java b/keywords/java/step-library-kw-http/src/main/java/ch/exense/step/examples/http/keywords/HttpClientKeyword.java index ad370ba..8600f82 100644 --- a/keywords/java/step-library-kw-http/src/main/java/ch/exense/step/examples/http/keywords/HttpClientKeyword.java +++ b/keywords/java/step-library-kw-http/src/main/java/ch/exense/step/examples/http/keywords/HttpClientKeyword.java @@ -13,11 +13,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import ch.exense.step.library.commons.AbstractEnhancedKeyword; +import ch.exense.step.library.commons.BusinessException; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; -import ch.exense.step.examples.common.helper.AbstractEnhancedKeyword; -import ch.exense.step.examples.common.helper.BusinessException; import ch.exense.step.examples.http.HttpClient; import ch.exense.step.examples.http.HttpRequest; import ch.exense.step.examples.http.HttpResponse; diff --git a/keywords/java/step-library-kw-monitoring-system/pom.xml b/keywords/java/step-library-kw-monitoring-system/pom.xml index 8cb467a..2af8a95 100644 --- a/keywords/java/step-library-kw-monitoring-system/pom.xml +++ b/keywords/java/step-library-kw-monitoring-system/pom.xml @@ -30,16 +30,16 @@ - - ch.exense.step.library - step-library-kw-system - ${project.version} - ch.exense.step - step-functions-base-functions + step-core ${step.version} + + ch.exense.step.library + step-library-commons + ${project.version} + org.codehaus.groovy groovy-jsr223 diff --git a/keywords/java/step-library-kw-monitoring-system/src/main/java/ch/exense/step/library/kw/monitoring/TypePerfKeywords.java b/keywords/java/step-library-kw-monitoring-system/src/main/java/ch/exense/step/library/kw/monitoring/TypePerfKeywords.java index cf33aa3..41219e2 100644 --- a/keywords/java/step-library-kw-monitoring-system/src/main/java/ch/exense/step/library/kw/monitoring/TypePerfKeywords.java +++ b/keywords/java/step-library-kw-monitoring-system/src/main/java/ch/exense/step/library/kw/monitoring/TypePerfKeywords.java @@ -35,7 +35,7 @@ import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; -import ch.exense.step.library.kw.system.AbstractProcessKeyword; +import ch.exense.step.library.commons.AbstractProcessKeyword; import step.handlers.javahandler.Keyword; public class TypePerfKeywords extends AbstractProcessKeyword { diff --git a/keywords/java/step-library-kw-monitoring-system/src/main/java/ch/exense/step/library/kw/monitoring/WindowsServiceStatusKeywords.java b/keywords/java/step-library-kw-monitoring-system/src/main/java/ch/exense/step/library/kw/monitoring/WindowsServiceStatusKeywords.java index b526b00..e45e43c 100644 --- a/keywords/java/step-library-kw-monitoring-system/src/main/java/ch/exense/step/library/kw/monitoring/WindowsServiceStatusKeywords.java +++ b/keywords/java/step-library-kw-monitoring-system/src/main/java/ch/exense/step/library/kw/monitoring/WindowsServiceStatusKeywords.java @@ -21,7 +21,7 @@ import java.io.File; import java.nio.file.Files; -import ch.exense.step.library.kw.system.AbstractProcessKeyword; +import ch.exense.step.library.commons.AbstractProcessKeyword; import step.handlers.javahandler.Keyword; public class WindowsServiceStatusKeywords extends AbstractProcessKeyword { diff --git a/keywords/java/step-library-kw-step-client/src/main/java/ch/exense/step/library/kw/step/StepClientKeyword.java b/keywords/java/step-library-kw-step-client/src/main/java/ch/exense/step/library/kw/step/StepClientKeyword.java index 55e826f..df72ddd 100644 --- a/keywords/java/step-library-kw-step-client/src/main/java/ch/exense/step/library/kw/step/StepClientKeyword.java +++ b/keywords/java/step-library-kw-step-client/src/main/java/ch/exense/step/library/kw/step/StepClientKeyword.java @@ -1,5 +1,6 @@ package ch.exense.step.library.kw.step; +import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeoutException; diff --git a/keywords/java/step-library-kw-system/pom.xml b/keywords/java/step-library-kw-system/pom.xml index d0db8f8..59ff7c3 100644 --- a/keywords/java/step-library-kw-system/pom.xml +++ b/keywords/java/step-library-kw-system/pom.xml @@ -31,12 +31,12 @@ - ch.exense.commons - exense-basic-commons - ${exense-commons.version} + ch.exense.step.library + step-library-commons + ${project.version} - org.apache.commons + commons-io commons-io 1.3.2 diff --git a/keywords/java/step-library-kw-system/src/main/java/ch/exense/step/library/kw/system/AbstractProcessKeyword.java b/keywords/java/step-library-kw-system/src/main/java/ch/exense/step/library/kw/system/AbstractProcessKeyword.java deleted file mode 100644 index a090e1e..0000000 --- a/keywords/java/step-library-kw-system/src/main/java/ch/exense/step/library/kw/system/AbstractProcessKeyword.java +++ /dev/null @@ -1,155 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2020, exense GmbH - * - * This file is part of STEP - * - * STEP is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * STEP is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with STEP. If not, see . - ******************************************************************************/ -package ch.exense.step.library.kw.system; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.util.List; -import java.util.concurrent.TimeoutException; -import java.util.function.Consumer; - -import ch.exense.commons.processes.ManagedProcess; -import ch.exense.commons.processes.ManagedProcess.ManagedProcessException; -import step.grid.io.Attachment; -import step.grid.io.AttachmentHelper; -import step.handlers.javahandler.AbstractKeyword; - -public abstract class AbstractProcessKeyword extends AbstractKeyword { - - protected static final int PROCESS_TIMEOUT = 60000; - - public AbstractProcessKeyword() { - super(); - } - - public static class OutputConfiguration { - - private final boolean alwaysAttachOutput; - private final int maxOutputPayloadSize; - private final int maxOutputAttachmentSize; - private final boolean printExitCode; - private final boolean checkExitCode; - - public OutputConfiguration() { - this(true, 1000, 1000000, true, true); - } - - public OutputConfiguration(boolean alwaysAttachOutput, int maxOutputPayloadSize, int maxOutputAttachmentSize, - boolean printExitCode, boolean checkExitCode) { - super(); - this.alwaysAttachOutput = alwaysAttachOutput; - this.maxOutputPayloadSize = maxOutputPayloadSize; - this.maxOutputAttachmentSize = maxOutputAttachmentSize; - this.printExitCode = printExitCode; - this.checkExitCode = checkExitCode; - } - - protected boolean isAlwaysAttachOutput() { - return alwaysAttachOutput; - } - - protected int getMaxOutputPayloadSize() { - return maxOutputPayloadSize; - } - - protected int getMaxOutputAttachmentSize() { - return maxOutputAttachmentSize; - } - - protected boolean isCheckExitCode() { - return checkExitCode; - } - } - - protected void executeManagedCommand(String cmd, int timeoutMs) throws Exception { - executeManagedCommand(cmd, timeoutMs, new OutputConfiguration(), null); - } - - protected void executeManagedCommand(String cmd, int timeoutMs, OutputConfiguration outputConfiguration) throws Exception { - executeManagedCommand(cmd, timeoutMs, outputConfiguration, null); - } - - protected void executeManagedCommand(List cmd, int timeoutMs, OutputConfiguration outputConfiguration, Consumer postProcess) throws Exception { - ManagedProcess process = new ManagedProcess(cmd); - executeManagedCommand(timeoutMs, outputConfiguration, postProcess, process); - } - - protected void executeManagedCommand(String cmd, int timeoutMs, OutputConfiguration outputConfiguration, Consumer postProcess) throws Exception { - ManagedProcess process = new ManagedProcess(cmd); - executeManagedCommand(timeoutMs, outputConfiguration, postProcess, process); - } - - protected void executeManagedCommand(int timeoutMs, OutputConfiguration outputConfiguration, - Consumer postProcess, ManagedProcess process) - throws ManagedProcessException, InterruptedException, IOException { - try { - boolean hasError = false; - process.start(); - try { - int exitCode = process.waitFor(timeoutMs); - if (outputConfiguration.isCheckExitCode() && exitCode != 0) { - output.setBusinessError("Process exited with code " + exitCode); - hasError = true; - } - if(outputConfiguration.printExitCode) { - output.add("Exit_code", Integer.toString(exitCode)); - } - if(postProcess != null) { - postProcess.accept(process); - } - } catch (TimeoutException e) { - output.setBusinessError("Process didn't exit within the defined timeout of "+timeoutMs+"ms"); - hasError = true; - } - - if(hasError || outputConfiguration.isAlwaysAttachOutput()) { - attachOutputs(process, outputConfiguration); - } - } finally { - process.close(); - } - } - - protected void attachOutputs(ManagedProcess process, OutputConfiguration outputConfiguration) throws IOException { - attachOutput("stdout", process.getProcessOutputLog(), outputConfiguration); - attachOutput("stderr", process.getProcessErrorLog(), outputConfiguration); - } - - protected void attachOutput(String outputName, File file, OutputConfiguration outputConfiguration) throws IOException { - StringBuilder processOutputBuilder = new StringBuilder(); - Files.readAllLines(file.toPath(), Charset.defaultCharset()).forEach(l -> processOutputBuilder.append(l).append("\n")); - - String processOutput = processOutputBuilder.toString(); - - output.add(outputName, processOutput.substring(0, Math.min(processOutput.length(), outputConfiguration.maxOutputPayloadSize))); - - if(processOutput.length() > outputConfiguration.maxOutputPayloadSize) { - Attachment attachment = AttachmentHelper.generateAttachmentFromByteArray( - processOutput.substring(0, Math.min(processOutput.length(), outputConfiguration.maxOutputAttachmentSize)).getBytes(), outputName + ".log"); - output.addAttachment(attachment); - - if (file.length() > outputConfiguration.maxOutputAttachmentSize) { - output.add("technicalWarning", - outputName + " size exceeded. " + outputName + " has been attached and truncated."); - } - } - } -} diff --git a/keywords/java/step-library-kw-system/src/main/java/ch/exense/step/library/kw/system/ProcessKeywords.java b/keywords/java/step-library-kw-system/src/main/java/ch/exense/step/library/kw/system/ProcessKeywords.java index 78ad66f..c1b4736 100644 --- a/keywords/java/step-library-kw-system/src/main/java/ch/exense/step/library/kw/system/ProcessKeywords.java +++ b/keywords/java/step-library-kw-system/src/main/java/ch/exense/step/library/kw/system/ProcessKeywords.java @@ -20,6 +20,7 @@ import java.util.ArrayList; +import ch.exense.step.library.commons.AbstractProcessKeyword; import step.handlers.javahandler.Keyword; public class ProcessKeywords extends AbstractProcessKeyword { diff --git a/step-library-parent/pom.xml b/step-library-parent/pom.xml index 1e19b56..91f75bd 100644 --- a/step-library-parent/pom.xml +++ b/step-library-parent/pom.xml @@ -76,6 +76,7 @@ + ../keywords/java/step-library-commons ../keywords/java/step-library-kw-http ../keywords/java/step-library-kw-system ../keywords/java/step-library-kw-monitoring-system @@ -83,6 +84,11 @@ + + ch.exense.commons + exense-basic-commons + ${exense-commons.version} + ch.exense.step step-api-keyword