aboutsummaryrefslogtreecommitdiff
path: root/pdf-as-web-status/src
diff options
context:
space:
mode:
authorAndreas Fitzek <andreas.fitzek@iaik.tugraz.at>2014-12-01 12:23:47 +0100
committerAndreas Fitzek <andreas.fitzek@iaik.tugraz.at>2014-12-02 10:09:35 +0100
commite929b5f4c6d9351b29150e6c1843f06806ee7b00 (patch)
treec6ecc4e5f6c3da6ef381a3d852c0a2211ca060e2 /pdf-as-web-status/src
parent6398c85d80213f316dd0f9e4be10e34b54b1f5f9 (diff)
downloadpdf-as-4-e929b5f4c6d9351b29150e6c1843f06806ee7b00.tar.gz
pdf-as-4-e929b5f4c6d9351b29150e6c1843f06806ee7b00.tar.bz2
pdf-as-4-e929b5f4c6d9351b29150e6c1843f06806ee7b00.zip
added status servlet to pdf-as-web
Diffstat (limited to 'pdf-as-web-status/src')
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/Test.java28
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/TestFactory.java16
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/TestResult.java23
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/TestStatus.java16
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/content/ContentGenerator.java25
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/content/HtmlGenerator.java92
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/content/JsonGenerator.java87
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/content/ResponseBuilder.java54
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/content/XMLGenerator.java86
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/BaseTestResult.java91
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestManager.java149
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestRunResult.java88
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestStatusString.java29
-rw-r--r--pdf-as-web-status/src/main/java/at/gv/egiz/status/servlet/StatusServlet.java120
14 files changed, 904 insertions, 0 deletions
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/Test.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/Test.java
new file mode 100644
index 00000000..97f5f4d7
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/Test.java
@@ -0,0 +1,28 @@
+package at.gv.egiz.status;
+
+/**
+ * The Interface Test.
+ */
+public interface Test {
+
+ /**
+ * Gets the name.
+ *
+ * @return the name
+ */
+ public String getName();
+
+ /**
+ * Gets the cache delay.
+ *
+ * @return the cache delay
+ */
+ public long getCacheDelay();
+
+ /**
+ * Run test.
+ *
+ * @return the test result
+ */
+ public TestResult runTest();
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/TestFactory.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/TestFactory.java
new file mode 100644
index 00000000..682f809b
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/TestFactory.java
@@ -0,0 +1,16 @@
+package at.gv.egiz.status;
+
+import java.util.List;
+
+/**
+ * A factory for creating Test objects.
+ */
+public interface TestFactory {
+
+ /**
+ * Creates a new Test object.
+ *
+ * @return the list< test>
+ */
+ public List<Test> createTests();
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/TestResult.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/TestResult.java
new file mode 100644
index 00000000..9c57efdf
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/TestResult.java
@@ -0,0 +1,23 @@
+package at.gv.egiz.status;
+
+import java.util.List;
+
+/**
+ * The Interface TestResult.
+ */
+public interface TestResult {
+
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
+ public TestStatus getStatus();
+
+ /**
+ * Gets the details.
+ *
+ * @return the details
+ */
+ public List<String> getDetails();
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/TestStatus.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/TestStatus.java
new file mode 100644
index 00000000..9513a5d5
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/TestStatus.java
@@ -0,0 +1,16 @@
+package at.gv.egiz.status;
+
+/**
+ * The Enum TestStatus.
+ */
+public enum TestStatus {
+
+ /** The ok. */
+ OK,
+
+ /** The failed. */
+ FAILED,
+
+ /** The indeterminate. */
+ INDETERMINATE
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/ContentGenerator.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/ContentGenerator.java
new file mode 100644
index 00000000..6ba85284
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/ContentGenerator.java
@@ -0,0 +1,25 @@
+package at.gv.egiz.status.content;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import at.gv.egiz.status.TestResult;
+
+/**
+ * The Interface ContentGenerator.
+ */
+public interface ContentGenerator {
+
+ /**
+ * Generate.
+ *
+ * @param request the request
+ * @param response the response
+ * @param details the details
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ public void generate(HttpServletRequest request, HttpServletResponse response, Map<String, TestResult> results, boolean details) throws IOException;
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/HtmlGenerator.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/HtmlGenerator.java
new file mode 100644
index 00000000..c94cde22
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/HtmlGenerator.java
@@ -0,0 +1,92 @@
+package at.gv.egiz.status.content;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import at.gv.egiz.status.TestResult;
+import at.gv.egiz.status.TestStatus;
+import at.gv.egiz.status.impl.TestStatusString;
+
+public class HtmlGenerator implements ContentGenerator {
+
+ @Override
+ public void generate(HttpServletRequest request,
+ HttpServletResponse response, Map<String, TestResult> results, boolean details) throws IOException {
+
+ boolean allOk = true;
+
+ Iterator<TestResult> testIterator = results.values().iterator();
+ while(testIterator.hasNext()) {
+ TestResult result = testIterator.next();
+ if(!result.getStatus().equals(TestStatus.OK)){
+ allOk = false;
+ break;
+ }
+ }
+
+ if(!allOk) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ } else {
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+
+ response.setContentType("text/html");
+
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("<html><head></head><body>");
+ sb.append("<table border='1'><thead><tr><th>Name</th><th>Status</th>");
+
+ if(details) {
+ sb.append("<th>Details</th>");
+ }
+
+ sb.append("</tr></thead><tbody>");
+
+ Iterator<Entry<String,TestResult>> testResultIterator = results.entrySet().iterator();
+ while(testResultIterator.hasNext()) {
+ Entry<String,TestResult> entry = testResultIterator.next();
+ TestResult result = entry.getValue();
+ String testName = entry.getKey();
+
+ sb.append("<tr><td>");
+ sb.append(StringEscapeUtils.escapeHtml4(testName));
+ sb.append("</td><td>");
+ sb.append(StringEscapeUtils.escapeHtml4(TestStatusString.getString(result.getStatus())));
+
+
+ if(details) {
+ sb.append("</td><td>");
+
+ StringBuilder detail = new StringBuilder();
+
+ Iterator<String> detailStringIt = result.getDetails().iterator();
+
+ while(detailStringIt.hasNext()) {
+ String detailString = detailStringIt.next();
+ detail.append(StringEscapeUtils.escapeHtml4(detailString));
+ detail.append("</br>");
+ }
+
+ sb.append(detail.toString());
+ }
+
+ sb.append("</td></tr>");
+ }
+
+ sb.append("</tbody></table>");
+
+ sb.append("</body></html>");
+
+ response.getOutputStream().write(sb.toString().getBytes("UTF-8"));
+ response.getOutputStream().close();
+ }
+
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/JsonGenerator.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/JsonGenerator.java
new file mode 100644
index 00000000..f26c0885
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/JsonGenerator.java
@@ -0,0 +1,87 @@
+package at.gv.egiz.status.content;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import at.gv.egiz.status.TestResult;
+import at.gv.egiz.status.TestStatus;
+import at.gv.egiz.status.impl.TestStatusString;
+
+public class JsonGenerator implements ContentGenerator {
+
+ @Override
+ public void generate(HttpServletRequest request,
+ HttpServletResponse response, Map<String, TestResult> results,
+ boolean details) throws IOException {
+ boolean allOk = true;
+
+ Iterator<TestResult> testIterator = results.values().iterator();
+ while(testIterator.hasNext()) {
+ TestResult result = testIterator.next();
+ if(!result.getStatus().equals(TestStatus.OK)){
+ allOk = false;
+ break;
+ }
+ }
+
+ if(!allOk) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ } else {
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+
+ response.setContentType("application/json");
+
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("{");
+
+ Iterator<Entry<String,TestResult>> testResultIterator = results.entrySet().iterator();
+ while(testResultIterator.hasNext()) {
+ Entry<String,TestResult> entry = testResultIterator.next();
+ TestResult result = entry.getValue();
+ String testName = entry.getKey();
+
+ sb.append("\"");
+ sb.append(StringEscapeUtils.escapeJson(testName));
+ sb.append("\": {\"Status\": \"");
+ sb.append(StringEscapeUtils.escapeJson(TestStatusString.getString(result.getStatus())));
+ sb.append("\"");
+
+ if(details) {
+ sb.append(", \"Detail\": \"");
+
+ StringBuilder detail = new StringBuilder();
+
+ Iterator<String> detailStringIt = result.getDetails().iterator();
+
+ while(detailStringIt.hasNext()) {
+ String detailString = detailStringIt.next();
+ detail.append(StringEscapeUtils.escapeJson(detailString));
+ detail.append(" ");
+ }
+
+ sb.append(detail.toString());
+ sb.append("\"");
+ }
+
+ sb.append("}");
+ if(testResultIterator.hasNext()) {
+ sb.append(", ");
+ }
+ }
+
+ sb.append("}");
+
+ response.getOutputStream().write(sb.toString().getBytes("UTF-8"));
+ response.getOutputStream().close();
+ }
+
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/ResponseBuilder.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/ResponseBuilder.java
new file mode 100644
index 00000000..1e248808
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/ResponseBuilder.java
@@ -0,0 +1,54 @@
+package at.gv.egiz.status.content;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import at.gv.egiz.status.TestResult;
+
+public class ResponseBuilder {
+
+ public enum ContentType {
+ HTML("HTML"), JSON("JSON"), XML("XML");
+
+ private final String name;
+
+ private ContentType(String s) {
+ name = s;
+ }
+
+ public boolean equalsName(String otherName){
+ return (otherName == null)? false:name.equals(otherName);
+ }
+
+ public String toString(){
+ return name;
+ }
+ }
+
+ private ContentGenerator defaultGenerator;
+
+ private Map<String, ContentGenerator> contentBuilder = new HashMap<String, ContentGenerator>();
+
+ public ResponseBuilder() {
+ defaultGenerator = new HtmlGenerator();
+ contentBuilder.put(ContentType.HTML.toString(), defaultGenerator);
+ contentBuilder.put(ContentType.JSON.toString(), new JsonGenerator());
+ contentBuilder.put(ContentType.XML.toString(), new XMLGenerator());
+ }
+
+ public void generate(HttpServletRequest request,
+ HttpServletResponse response, Map<String, TestResult> results,
+ boolean details, String content) throws IOException {
+
+ if(contentBuilder.containsKey(content)) {
+ contentBuilder.get(content).generate(request, response, results, details);
+ } else {
+ defaultGenerator.generate(request, response, results, details);
+ }
+
+ }
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/XMLGenerator.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/XMLGenerator.java
new file mode 100644
index 00000000..00b116bb
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/content/XMLGenerator.java
@@ -0,0 +1,86 @@
+package at.gv.egiz.status.content;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import at.gv.egiz.status.TestResult;
+import at.gv.egiz.status.TestStatus;
+import at.gv.egiz.status.impl.TestStatusString;
+
+public class XMLGenerator implements ContentGenerator {
+
+ @Override
+ public void generate(HttpServletRequest request,
+ HttpServletResponse response, Map<String, TestResult> results,
+ boolean details) throws IOException {
+ boolean allOk = true;
+
+ Iterator<TestResult> testIterator = results.values().iterator();
+ while(testIterator.hasNext()) {
+ TestResult result = testIterator.next();
+ if(!result.getStatus().equals(TestStatus.OK)){
+ allOk = false;
+ break;
+ }
+ }
+
+ if(!allOk) {
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ } else {
+ response.setStatus(HttpServletResponse.SC_OK);
+ }
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("application/xml");
+
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>");
+
+ sb.append("<tests>");
+
+ Iterator<Entry<String,TestResult>> testResultIterator = results.entrySet().iterator();
+ while(testResultIterator.hasNext()) {
+ Entry<String,TestResult> entry = testResultIterator.next();
+ TestResult result = entry.getValue();
+ String testName = entry.getKey();
+
+ sb.append("<test><name>");
+ sb.append(StringEscapeUtils.escapeXml10(testName));
+ sb.append("</name><status>");
+ sb.append(StringEscapeUtils.escapeXml10(TestStatusString.getString(result.getStatus())));
+ sb.append("</status>");
+
+ if(details) {
+ sb.append("<detail>");
+
+ StringBuilder detail = new StringBuilder();
+
+ Iterator<String> detailStringIt = result.getDetails().iterator();
+
+ while(detailStringIt.hasNext()) {
+ String detailString = detailStringIt.next();
+ detail.append(StringEscapeUtils.escapeXml10(detailString));
+ detail.append(" ");
+ }
+
+ sb.append(detail.toString());
+ sb.append("</detail>");
+ }
+
+ sb.append("</test>");
+ }
+
+ sb.append("</tests>");
+
+ response.getOutputStream().write(sb.toString().getBytes("UTF-8"));
+ response.getOutputStream().close();
+ }
+
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/BaseTestResult.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/BaseTestResult.java
new file mode 100644
index 00000000..da77f424
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/BaseTestResult.java
@@ -0,0 +1,91 @@
+package at.gv.egiz.status.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import at.gv.egiz.status.TestResult;
+import at.gv.egiz.status.TestStatus;
+
+/**
+ * The Class BaseTestResult.
+ */
+public class BaseTestResult implements TestResult {
+
+ /** The status. */
+ private TestStatus status;
+
+ /** The details. */
+ private List<String> details;
+
+ /**
+ * Instantiates a new base test result.
+ */
+ public BaseTestResult() {
+ this.init(TestStatus.INDETERMINATE, new ArrayList<String>());
+ }
+
+ /**
+ * Instantiates a new base test result.
+ *
+ * @param status the status
+ */
+ public BaseTestResult(TestStatus status) {
+ this.init(status, new ArrayList<String>());
+ }
+
+ /**
+ * Instantiates a new base test result.
+ *
+ * @param status the status
+ * @param details the details
+ */
+ public BaseTestResult(TestStatus status, List<String> details) {
+ this.init(status, details);
+ }
+
+ /**
+ * Inits the.
+ *
+ * @param status the status
+ * @param details the details
+ */
+ private void init(TestStatus status, List<String> details) {
+ this.status = status;
+ this.details = details;
+ }
+
+ /**
+ * Sets the status.
+ *
+ * @param status the new status
+ */
+ public void setStatus(TestStatus status) {
+ this.status = status;
+ }
+
+ /**
+ * Sets the details.
+ *
+ * @param details the new details
+ */
+ public void setDetails(List<String> details) {
+ this.details = details;
+ }
+
+ /* (non-Javadoc)
+ * @see at.gv.egiz.status.TestResult#getStatus()
+ */
+ @Override
+ public TestStatus getStatus() {
+ return status;
+ }
+
+ /* (non-Javadoc)
+ * @see at.gv.egiz.status.TestResult#getDetails()
+ */
+ @Override
+ public List<String> getDetails() {
+ return details;
+ }
+
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestManager.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestManager.java
new file mode 100644
index 00000000..db40f96c
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestManager.java
@@ -0,0 +1,149 @@
+package at.gv.egiz.status.impl;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.ServiceLoader;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.gv.egiz.status.Test;
+import at.gv.egiz.status.TestFactory;
+import at.gv.egiz.status.TestResult;
+
+/**
+ * The Class TestManager.
+ */
+public class TestManager {
+
+ /** The log. */
+ private final Logger log = LoggerFactory.getLogger(TestManager.class);
+
+ /** The tests. */
+ private Map<String, Test> tests = new HashMap<String, Test>();
+
+ /** The test result cache. */
+ private Map<String, TestRunResult> testResultCache = new HashMap<String, TestRunResult>();
+
+ /** The loader. */
+ private static ServiceLoader<TestFactory> loader = ServiceLoader
+ .load(TestFactory.class);
+
+ /**
+ * Instantiates a new test manager.
+ */
+ public TestManager() {
+ Iterator<TestFactory> factoryIterator = loader.iterator();
+
+ while (factoryIterator.hasNext()) {
+ TestFactory factory = factoryIterator.next();
+
+ log.debug("Running Factory: " + factory.getClass().getName());
+
+ List<Test> testList = factory.createTests();
+ if (testList != null && !testList.isEmpty()) {
+ log.debug("Factory: " + factory.getClass().getName()
+ + " produced " + testList.size() + " tests!");
+ Iterator<Test> testIterator = testList.iterator();
+ while (testIterator.hasNext()) {
+ Test test = testIterator.next();
+ log.debug("adding Test: " + test.getName() + " ["
+ + test.getClass().getName() + "]");
+ tests.put(test.getName(), test);
+ }
+ } else {
+ log.debug("Factory: " + factory.getClass().getName()
+ + " produced no tests!");
+ }
+ }
+ }
+
+ /**
+ * Store test result.
+ *
+ * @param testName the test name
+ * @param testResult the test result
+ * @return the test result
+ */
+ private TestResult storeTestResult(String testName, TestResult testResult) {
+ if(testResult != null) {
+ TestRunResult runResult = new TestRunResult();
+ runResult.setExecutionTimestamp(new Date().getTime());
+ runResult.setTestResult(testResult);
+ testResultCache.put(testName, runResult);
+ }
+ return testResult;
+ }
+
+ /**
+ * Run test.
+ *
+ * @param testName the test name
+ * @return the test result
+ */
+ public TestResult runTest(String testName) {
+ if(tests.containsKey(testName)) {
+ return storeTestResult(testName, tests.get(testName).runTest());
+ }
+ log.debug("Not test \"" + testName + "\" available");
+ return null;
+ }
+
+ /**
+ * Run test.
+ *
+ * @param testName the test name
+ * @param forceExecution the force execution
+ * @return the test result
+ */
+ public TestResult runTest(String testName, boolean forceExecution) {
+ if(!tests.containsKey(testName)) {
+ log.debug("Not test \"" + testName + "\" available");
+ return null;
+ }
+
+ if (forceExecution) {
+ return runTest(testName);
+ }
+
+ Test test = tests.get(testName);
+
+ if (testResultCache.containsKey(testName)) {
+ //
+ Date now = new Date();
+
+ TestRunResult result = testResultCache.get(testName);
+ long lastTest = result.getExecutionTimestamp();
+ long delay = test.getCacheDelay();
+
+ if (lastTest < now.getTime() - delay) {
+ // Too old
+ return runTest(testName);
+ } else {
+ // Cache is fine!
+ return result.getTestResult();
+ }
+ }
+ return runTest(testName);
+ }
+
+ /**
+ * Run all tests.
+ *
+ * @param forceExecution the force execution
+ * @return the map
+ */
+ public Map<String, TestResult> runAllTests(boolean forceExecution) {
+ Map<String, TestResult> results = new HashMap<String, TestResult>();
+ Iterator<Test> testIterator = tests.values().iterator();
+ while(testIterator.hasNext()) {
+ Test test = testIterator.next();
+ String testName = test.getName();
+ results.put(testName, runTest(testName, forceExecution));
+ }
+ return results;
+ }
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestRunResult.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestRunResult.java
new file mode 100644
index 00000000..9385392c
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestRunResult.java
@@ -0,0 +1,88 @@
+package at.gv.egiz.status.impl;
+
+import at.gv.egiz.status.TestResult;
+
+/**
+ * The Class TestRunResult.
+ */
+public class TestRunResult {
+
+ /** The test result. */
+ private TestResult testResult;
+
+ /** The execution timestamp. */
+ private long executionTimestamp;
+
+ /**
+ * Instantiates a new test run result.
+ */
+ public TestRunResult() {
+ this.init(null, 0);
+ }
+
+ /**
+ * Instantiates a new test run result.
+ *
+ * @param testResult the test result
+ */
+ public TestRunResult(TestResult testResult) {
+ this.init(testResult, 0);
+ }
+
+ /**
+ * Instantiates a new test run result.
+ *
+ * @param testResult the test result
+ * @param executionTimestamp the execution timestamp
+ */
+ public TestRunResult(TestResult testResult, long executionTimestamp) {
+ this.init(testResult, executionTimestamp);
+ }
+
+ /**
+ * Inits the.
+ *
+ * @param testResult the test result
+ * @param executionTimestamp the execution timestamp
+ */
+ private void init(TestResult testResult, long executionTimestamp) {
+ this.testResult = testResult;
+ this.executionTimestamp = executionTimestamp;
+ }
+
+ /**
+ * Gets the test result.
+ *
+ * @return the test result
+ */
+ public TestResult getTestResult() {
+ return testResult;
+ }
+
+ /**
+ * Sets the test result.
+ *
+ * @param testResult the new test result
+ */
+ public void setTestResult(TestResult testResult) {
+ this.testResult = testResult;
+ }
+
+ /**
+ * Gets the execution timestamp.
+ *
+ * @return the execution timestamp
+ */
+ public long getExecutionTimestamp() {
+ return executionTimestamp;
+ }
+
+ /**
+ * Sets the execution timestamp.
+ *
+ * @param executionTimestamp the new execution timestamp
+ */
+ public void setExecutionTimestamp(long executionTimestamp) {
+ this.executionTimestamp = executionTimestamp;
+ }
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestStatusString.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestStatusString.java
new file mode 100644
index 00000000..50605cf5
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/impl/TestStatusString.java
@@ -0,0 +1,29 @@
+package at.gv.egiz.status.impl;
+
+import at.gv.egiz.status.TestStatus;
+
+// TODO: Auto-generated Javadoc
+/**
+ * The Class TestStatusString.
+ */
+public class TestStatusString {
+
+ /**
+ * Gets the string.
+ *
+ * @param status the status
+ * @return the string
+ */
+ public static String getString(TestStatus status) {
+ switch (status) {
+ case OK:
+ return "OK";
+ case FAILED:
+ return "FAILED";
+ case INDETERMINATE:
+ return "INDETERMINATE";
+ default:
+ return "UNKNOWN";
+ }
+ }
+}
diff --git a/pdf-as-web-status/src/main/java/at/gv/egiz/status/servlet/StatusServlet.java b/pdf-as-web-status/src/main/java/at/gv/egiz/status/servlet/StatusServlet.java
new file mode 100644
index 00000000..6790fccc
--- /dev/null
+++ b/pdf-as-web-status/src/main/java/at/gv/egiz/status/servlet/StatusServlet.java
@@ -0,0 +1,120 @@
+package at.gv.egiz.status.servlet;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.gv.egiz.status.TestResult;
+import at.gv.egiz.status.content.ResponseBuilder;
+import at.gv.egiz.status.content.ResponseBuilder.ContentType;
+import at.gv.egiz.status.impl.TestManager;
+
+/**
+ * Servlet implementation class StatusServlet
+ */
+@WebServlet(name="statusServlet", urlPatterns={"/status"})
+public class StatusServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1201254769913428186L;
+
+ public static final String PARAM_CONTENT_TYPE = "content";
+ public static final String PARAM_FORCE = "force";
+ public static final String PARAM_DETAILS = "details";
+ public static final String PARAM_DETAILS_TRUE = "true";
+ public static final String PARAM_TEST = "test";
+
+ private final Logger log = LoggerFactory.getLogger(StatusServlet.class);
+
+ private TestManager manager;
+
+ private ResponseBuilder builder;
+
+ private boolean showDetails = false;
+
+ /**
+ * @see HttpServlet#HttpServlet()
+ */
+ public StatusServlet() {
+ super();
+
+ manager = new TestManager();
+ builder = new ResponseBuilder();
+ }
+
+ /**
+ * @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig)
+ */
+ @Override
+ public void init(ServletConfig config) throws ServletException {
+ super.init(config);
+
+ // TODO: Environment Parameter to show details -> showDetails
+ }
+
+ /**
+ * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ this.doProcess(request, response);
+ }
+
+ /**
+ * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+ */
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ this.doProcess(request, response);
+ }
+
+ protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ String content = request.getParameter(PARAM_CONTENT_TYPE);
+
+ if(content == null) {
+ content = ContentType.HTML.toString();
+ }
+
+ log.debug("Producing Content: " + content);
+
+ // Parameter to force execution
+ boolean force = true;
+
+ String forceExec = request.getParameter(PARAM_FORCE);
+
+ if(forceExec != null) {
+ if(forceExec.equalsIgnoreCase("false")) {
+ force = false;
+ }
+ }
+ boolean showingDetails = showDetails;
+ String detail = request.getParameter(PARAM_DETAILS);
+ if(detail != null) {
+ showingDetails = detail.equalsIgnoreCase(PARAM_DETAILS_TRUE);
+ }
+
+ // Parameter for specific test
+ String test = request.getParameter(PARAM_TEST);
+
+ Map<String, TestResult> results = null;
+
+ if(test != null) {
+ results = new HashMap<String, TestResult>();
+ TestResult result = this.manager.runTest(test, force);
+ if(result != null) {
+ results.put(test, result);
+ }
+ } else {
+ results = this.manager.runAllTests(force);
+ }
+
+ this.builder.generate(request, response, results, showingDetails, content);
+ }
+}