diff --git a/Homepage/Dockerfile b/Homepage/Dockerfile index 489b45b..8bcb48e 100644 --- a/Homepage/Dockerfile +++ b/Homepage/Dockerfile @@ -5,4 +5,6 @@ COPY ./index.html /usr/share/nginx/html COPY ./logo.png /usr/share/nginx/html COPY ./styles.css /usr/share/nginx/html COPY ./common.css /usr/share/nginx/html -COPY ./favicon.ico /usr/share/nginx/html \ No newline at end of file +COPY ./favicon.ico /usr/share/nginx/html + +EXPOSE 80 diff --git a/Homepage/Frontend/scripts.js b/Homepage/Frontend/scripts.js index 981ae40..b8c05be 100644 --- a/Homepage/Frontend/scripts.js +++ b/Homepage/Frontend/scripts.js @@ -105,8 +105,8 @@ function performRequest(text, checkXML, checkTransform){ //Form REST request, send, receive and display in resultArea async function restRequest(text) { const escapeChar = "specialEscapeChar"; - // const addr = "http://localhost:8081/" + text; - const addr = "http://gordon.zipper.release11.com:8081/" + text; + const addr = "http://localhost:8081/" + text; + // const addr = "http://gordon.zipper.release11.com:8081/" + text; var xmlData = document.getElementById("xmlArea").value.trim(); var transformData = document.getElementById("transformArea").value.trim(); @@ -153,4 +153,4 @@ async function restRequest(text) { }); }); -} \ No newline at end of file +} diff --git a/REST_XSLT/.gitignore b/REST_XSLT/.gitignore new file mode 100644 index 0000000..da016ff --- /dev/null +++ b/REST_XSLT/.gitignore @@ -0,0 +1,9 @@ +target/ +nbactions.xml +.idea/ +.settings/ +.classpath +.settings +.project +*.iml +.vscode diff --git a/REST_XSLT/pom.xml b/REST_XSLT/pom.xml index a76fe68..5d3fdca 100644 --- a/REST_XSLT/pom.xml +++ b/REST_XSLT/pom.xml @@ -12,6 +12,8 @@ 11 11 UTF-8 + 2.14.1 + 2.0.6 @@ -24,7 +26,7 @@ - + @@ -48,7 +50,7 @@ true lib/ - Main + r11.mltx.restxslt.Main @@ -72,32 +74,30 @@ - - com.fasterxml.jackson.core - jackson-core - 2.11.0 - - - com.fasterxml.jackson.core - jackson-databind - 2.11.0 - + com.sparkjava spark-core 2.9.3 + + - org.slf4j - slf4j-simple - 1.6.2 - test + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + net.sf.saxon Saxon-HE - 10.3 + 11.4 xalan @@ -105,30 +105,38 @@ 2.7.2 + + + org.slf4j + slf4j-simple + ${slf4j.version} + test + org.slf4j jcl-over-slf4j - 1.7.0 + ${slf4j.version} runtime org.slf4j slf4j-api - 1.7.0 + ${slf4j.version} runtime org.slf4j slf4j-log4j12 - 1.7.0 + ${slf4j.version} runtime + - log4j - log4j - 1.2.14 + org.apache.logging.log4j + log4j-core + 2.19.0 - + \ No newline at end of file diff --git a/REST_XSLT/src/main/java/r11/mltx/restxslt/Main.java b/REST_XSLT/src/main/java/r11/mltx/restxslt/Main.java new file mode 100644 index 0000000..42e540d --- /dev/null +++ b/REST_XSLT/src/main/java/r11/mltx/restxslt/Main.java @@ -0,0 +1,15 @@ +package r11.mltx.restxslt; + +/** + * Application initializer + * @author Wojciech Czop + */ +public class Main { + /** + * Initializes the application + * @param args + */ + public static void main(String[] args) { + SparkInitializer.run(); + } +} diff --git a/REST_XSLT/src/main/java/Main.java b/REST_XSLT/src/main/java/r11/mltx/restxslt/SparkInitializer.java similarity index 84% rename from REST_XSLT/src/main/java/Main.java rename to REST_XSLT/src/main/java/r11/mltx/restxslt/SparkInitializer.java index d5b1a22..2cd00c3 100644 --- a/REST_XSLT/src/main/java/Main.java +++ b/REST_XSLT/src/main/java/r11/mltx/restxslt/SparkInitializer.java @@ -1,17 +1,27 @@ +package r11.mltx.restxslt; + import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; -import processors.Saxon; -import processors.Xalan; +import r11.mltx.restxslt.processors.Saxon; +import r11.mltx.restxslt.processors.Xalan; import spark.*; import java.util.HashMap; import java.util.Map; -public class Main { - public static void main(String[] args) { +/** + * Class contains spark configuration and method initializing spark framework + * @author Wojciech Czop + */ +public class SparkInitializer { + /** + * Initializes spark framework + */ + public static void run(){ +// TODO: Port value as property Spark.port(8081); - Spark.after((Filter) (request, response) -> { + Spark.after((request, response) -> { response.header("Access-Control-Allow-Origin", "*"); response.header("access-control-allow-headers", "*"); response.header("access-control-expose-headers", "*"); @@ -25,9 +35,11 @@ public class Main { System.out.println("Server is online"); } - static Route procinfoHandler = (Request req, Response resp) -> { + /** + * Handler that returns processor version + */ + private static Route procinfoHandler = (Request req, Response resp) -> { try { -// req.session().id resp.header("processor", "Saxon " + Saxon.getVersion() + " over s9api"); return Saxon.getVersion(); } catch (Exception ex) { @@ -35,7 +47,11 @@ public class Main { } }; - static Route xsdHandler = (Request req, Response resp) -> { + /** + * Handler that returns info if document is valid + * Also provides info about request time and processor + */ + private static Route xsdHandler = (Request req, Response resp) -> { String body = req.body(); System.out.println("Request: " + body); ObjectMapper mapper = new ObjectMapper(); @@ -54,7 +70,7 @@ public class Main { resp.header("processor", Xalan.getVersion()); long timeStart = System.currentTimeMillis(); - String tmp = ""; + String tmp; try { tmp = Xalan.validate(data, xsd).trim(); responseMap.put("result", tmp); @@ -72,7 +88,10 @@ public class Main { return resp; }; - static Route xpathHandler = (Request req, Response resp) -> { + /** + * Handler that returns output of xpath query and processor data + */ + private static Route xpathHandler = (Request req, Response resp) -> { String body = req.body(); System.out.println("Request: " + body); @@ -91,8 +110,8 @@ public class Main { String version = requestMap.get("version"); String tmp = ""; - long timeStart = 0; - long duration = 0; + long timeStart; + long duration; if (processor == null) { return "saxon, xalan"; @@ -134,7 +153,7 @@ public class Main { duration = System.currentTimeMillis() - timeStart; responseMap.put("processor", Xalan.getVersion()); responseMap.put("result", tmp); - responseMap.put("time", "" + duration); + responseMap.put("time", Long.toString(duration)); resp.body(mapper.writeValueAsString(responseMap)); return resp; @@ -148,7 +167,10 @@ public class Main { } }; - static Route xsltHandler = (Request req, Response resp) -> { + /** + * Handler that returns outcome of xslt transformation and processor data + */ + private static Route xsltHandler = (Request req, Response resp) -> { String body = req.body(); ObjectMapper mapper = new ObjectMapper(); Map jsonMap = null; @@ -168,12 +190,11 @@ public class Main { return "saxon, xalan"; } try { - String tmp = ""; - long timeStart = 0; - long duration = 0; + String tmp; + long timeStart; + long duration; switch (processor) { case "saxon": -// resp.header("processor", "Saxon " + Saxon.getVersion()); timeStart = System.currentTimeMillis(); try { tmp = Saxon.processXSLT(data, query); @@ -188,7 +209,7 @@ public class Main { duration = System.currentTimeMillis() - timeStart; responseMap.put("processor", "Saxon " + Saxon.getVersion() + " " + version); - responseMap.put("time", "" + duration); + responseMap.put("time", Long.toString(duration)); resp.body(mapper.writeValueAsString(responseMap)); return resp; @@ -205,7 +226,7 @@ public class Main { } duration = System.currentTimeMillis() - timeStart; responseMap.put("processor", Xalan.getVersion()); - responseMap.put("time", "" + duration); + responseMap.put("time", Long.toString(duration)); resp.body(mapper.writeValueAsString(responseMap)); return resp; @@ -215,6 +236,5 @@ public class Main { } catch (Exception ex) { return ex.getMessage(); } - }; } diff --git a/REST_XSLT/src/main/java/processors/NewNamespaceResolver.java b/REST_XSLT/src/main/java/r11/mltx/restxslt/processors/NewNamespaceResolver.java similarity index 68% rename from REST_XSLT/src/main/java/processors/NewNamespaceResolver.java rename to REST_XSLT/src/main/java/r11/mltx/restxslt/processors/NewNamespaceResolver.java index 83f80cf..c6fb17c 100644 --- a/REST_XSLT/src/main/java/processors/NewNamespaceResolver.java +++ b/REST_XSLT/src/main/java/r11/mltx/restxslt/processors/NewNamespaceResolver.java @@ -1,4 +1,4 @@ -package processors; +package r11.mltx.restxslt.processors; import net.sf.saxon.om.NamespaceBinding; import net.sf.saxon.om.NamespaceMap; @@ -7,29 +7,50 @@ import net.sf.saxon.s9api.XdmNode; import java.util.Iterator; +/** + * Handler for saxon namespace scan engine. + * All found namespaces are stored within {@link #namespaceMap} + * @author Wojciech Czop + */ public class NewNamespaceResolver { private NamespaceMap namespaceMap; + /** + * Initializes {@link #namespaceMap} with namespace values + * @param doc dom structure object + * @return map of namespaces + */ public NamespaceMap process(XdmNode doc) { namespaceMap = NamespaceMap.emptyMap(); Iterator it = doc.children().iterator(); - +// TODO: remove while (it.hasNext()) { XdmNode tmp = it.next(); extractNamespace(tmp); } +// end return namespaceMap; } + /** + * Iterates through {@link #namespaceMap} and declares namespaces in {@link XPathCompiler} + * @param compiler compiler used to compile xpath statements + */ public void exportNamespaces(XPathCompiler compiler){ Iterator it = namespaceMap.iterator(); +// TODO: remove while(it.hasNext()){ System.out.println(it.next()); } +// end namespaceMap.forEach(namespaceBinding -> compiler.declareNamespace(namespaceBinding.getPrefix(), namespaceBinding.getURI())); } + /** + * Uses recurrency to dive deep dom structure and appends {@link #namespaceMap} with every found namespace + * @param node dom structure object + */ private void extractNamespace(XdmNode node) { NamespaceMap tmp; if ((tmp = node.getUnderlyingNode().getAllNamespaces()) != null) { @@ -40,13 +61,14 @@ public class NewNamespaceResolver { Iterator it = node.children().iterator(); while (it.hasNext()) { XdmNode rNode = it.next(); +// TODO: remove if(rNode.getUnderlyingNode().getPrefix().isEmpty() && !rNode.getParent().getUnderlyingNode().getPrefix().isEmpty()){ System.out.println("prefix missing, parent has "+rNode.getParent().getUnderlyingNode().getPrefix() + ", but child has none"); - NamespaceMap nsTMP= rNode.getUnderlyingNode().getAllNamespaces(); System.out.println(); } +// end extractNamespace(rNode); } } diff --git a/REST_XSLT/src/main/java/processors/Saxon.java b/REST_XSLT/src/main/java/r11/mltx/restxslt/processors/Saxon.java similarity index 68% rename from REST_XSLT/src/main/java/processors/Saxon.java rename to REST_XSLT/src/main/java/r11/mltx/restxslt/processors/Saxon.java index 5f2f83e..0aabc97 100644 --- a/REST_XSLT/src/main/java/processors/Saxon.java +++ b/REST_XSLT/src/main/java/r11/mltx/restxslt/processors/Saxon.java @@ -1,12 +1,23 @@ -package processors; +package r11.mltx.restxslt.processors; -import net.sf.saxon.om.NamespaceMap; import net.sf.saxon.s9api.*; import javax.xml.transform.stream.StreamSource; import java.io.StringReader; import java.io.StringWriter; +/** + * Handler for Saxon engine + * @author Wojciech Czop + */ public class Saxon { + + /** + * Transforms string containing xml document via xslt + * @param data xml to be transformed + * @param transform xslt + * @return transformed xml + * @throws SaxonApiException thrown on stylesheet or transformation errors + */ public static String processXSLT(String data, String transform) throws SaxonApiException { Processor processor = new Processor(false); XsltCompiler compiler = processor.newXsltCompiler(); @@ -21,19 +32,25 @@ public class Saxon { return sw.toString(); } + /** + * Process xpath and return either node or wrapped atomic value + * @param data xml to be querried + * @param query xpath queryy + * @param version processor version + * @return string xml representation of the node + * @throws Exception thrown on node building errors or invalid xpath + */ public static String processXPath(String data, String query, String version) throws Exception { Processor p = new Processor(false); XPathCompiler compiler = p.newXPathCompiler(); DocumentBuilder builder = p.newDocumentBuilder(); XdmNode doc = builder.build(new StreamSource(new StringReader(data))); -// System.out.println(version); - compiler.setLanguageVersion(version); NewNamespaceResolver resolver = new NewNamespaceResolver(); - NamespaceMap nsMa = resolver.process(doc); + resolver.process(doc); resolver.exportNamespaces(compiler); @@ -47,6 +64,10 @@ public class Saxon { } + /** + * Returns version of the processor + * @return version of the processor + */ public static String getVersion() { return new Processor(false).getSaxonProductVersion(); } diff --git a/REST_XSLT/src/main/java/processors/Xalan.java b/REST_XSLT/src/main/java/r11/mltx/restxslt/processors/Xalan.java similarity index 63% rename from REST_XSLT/src/main/java/processors/Xalan.java rename to REST_XSLT/src/main/java/r11/mltx/restxslt/processors/Xalan.java index 0a56e5c..5f68156 100644 --- a/REST_XSLT/src/main/java/processors/Xalan.java +++ b/REST_XSLT/src/main/java/r11/mltx/restxslt/processors/Xalan.java @@ -1,10 +1,9 @@ -package processors; +package r11.mltx.restxslt.processors; -import org.apache.xpath.domapi.XPathEvaluatorImpl; import org.w3c.dom.Document; +import org.xml.sax.InputSource; import javax.xml.XMLConstants; -import javax.xml.namespace.NamespaceContext; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.*; @@ -18,29 +17,31 @@ import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; -import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; +/** + * Handler for Xalan engine + * @author Wojciech Czop + */ public class Xalan { - + /** + * Transforms string containing xml document via xslt + * @param data xml to be transformed + * @param transform xslt + * @return transformed xml + * @throws Exception thrown on stylesheet or transformation errors + */ public static String processXSLT(String data, String transform) throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new InputSource(new StringReader(data))); - - StreamSource stylesource = new StreamSource(new StringReader(transform)); - - - Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesource); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + Source source = new DOMSource(document); StringWriter sw = new StringWriter(); Result outputTarget = new StreamResult(sw); @@ -49,6 +50,15 @@ public class Xalan { return sw.toString(); } + /** + * Process xpath and return either node or wrapped atomic value + * @deprecated + * Xalan needs assumption of the outcome, which is not implemented. Therefore method is deprecated + * @param data xml + * @param transform xpath + * @return xml processed using given xpath + * @throws Exception thrown on node building errors or invalid xpath + */ public static String processXPath(String data, String transform) throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); @@ -57,35 +67,33 @@ public class Xalan { xpath.setNamespaceContext(new XalanNamespaceResolver(builder.parse(new InputSource(new StringReader(data))), true)); XPathExpression exp = xpath.compile(transform); - NodeList nodeList = (NodeList) exp.evaluate(new InputSource(new StringReader(data)), XPathConstants.NODESET); - String result = exp.evaluate(new InputSource(new StringReader(data))); - return result; + exp.evaluate(new InputSource(new StringReader(data)), XPathConstants.NODESET); + return exp.evaluate(new InputSource(new StringReader(data))); } - + /** + * Returns version of the processor + * @return version of the processor + */ public static String getVersion(){ return org.apache.xalan.Version.getVersion(); } + /** + * Validates string representation of the xml document against xsd schema + * @param data xml document + * @param xsd xsd schema + * @return statement of validity + * @throws Exception thrown on invalid xsd schema or xml + */ public static String validate(String data, String xsd) throws Exception{ - - Source dataSource = new StreamSource(new StringReader(data)); Source xsdSource = new StreamSource(new StringReader(xsd)); SchemaFactory schemaFactory = SchemaFactory .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); -// try { - Schema schema = schemaFactory.newSchema(xsdSource); - Validator validator = schema.newValidator(); - validator.validate(dataSource); -// System.out.println(dataSource.getSystemId() + " is valid"); - return "XML file is valid"; -// } catch (SAXException e) { -// System.out.println("Invalid: "+e.getMessage()); -// return "XML file is NOT valid: " + e.getMessage(); -//// System.out.println(dataSource.getSystemId() + " is NOT valid reason:" + e); -// } catch (IOException e) { -// return "IO error: "+e.getMessage(); -// } + Schema schema = schemaFactory.newSchema(xsdSource); + Validator validator = schema.newValidator(); + validator.validate(dataSource); + return "XML file is valid"; } } diff --git a/REST_XSLT/src/main/java/processors/XalanNamespaceResolver.java b/REST_XSLT/src/main/java/r11/mltx/restxslt/processors/XalanNamespaceResolver.java similarity index 91% rename from REST_XSLT/src/main/java/processors/XalanNamespaceResolver.java rename to REST_XSLT/src/main/java/r11/mltx/restxslt/processors/XalanNamespaceResolver.java index 4418087..5fb932c 100644 --- a/REST_XSLT/src/main/java/processors/XalanNamespaceResolver.java +++ b/REST_XSLT/src/main/java/r11/mltx/restxslt/processors/XalanNamespaceResolver.java @@ -1,4 +1,4 @@ -package processors; +package r11.mltx.restxslt.processors; import org.w3c.dom.*; @@ -8,6 +8,12 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +/** + * Contains methods that scan document for namespaces and store them in map objects. + * @deprecated + * Class no longer in use. It has been replaced by {@link NewNamespaceResolver} + * @author Wojciech Czop + */ public class XalanNamespaceResolver implements NamespaceContext { private static final String DEFAULT_NS = "DEFAULT"; private Map prefix2Uri = new HashMap(); @@ -84,6 +90,11 @@ public class XalanNamespaceResolver implements NamespaceContext { } + /** + * Stores namespace prefix ass well as its uri in map + * @param prefix + * @param uri + */ private void putInCache(String prefix, String uri) { prefix2Uri.put(prefix, uri); uri2Prefix.put(uri, prefix);