diff --git a/README_webServices.txt b/README_webServices.txt index c5902e4..0d296f0 100644 --- a/README_webServices.txt +++ b/README_webServices.txt @@ -1,11 +1,36 @@ +2018 - Webservices application made by Jonathan Desormais @jdesorm1, Marie Gobran @mariegobran and Martine Chapuis @mchapuis + -------------------------------------------------------- HOW TO OPEN/USE THE PROJECT IN OPENESB -------------------------------------------------------- +-------------------------------------------------------- + +notes: +1-libraries needed for this project is under src/lib ( manually add dom4j-1.6.1.jar and jdom.jar ) +2-Files created are located in ca/concordia/cse/gipsy/ws/soap for SOAP service and ca/concordia/cse/gipsy/ws/rest for REST service + +-------------------------------------------------------- + SOAP service +-------------------------------------------------------- +1- Run Main.java in ca.concordia.cse.gipsy.ws.soap +2- Enter a number to run the service +3- Once the files are created server side, enter the command getFileGenerated to retreive them +4- GeneratorWS.java is the generator wrapper based on the GeneratorGUI.java in de.vs.unikassel.generator.gui + +-------------------------------------------------------- + REST service +-------------------------------------------------------- + +In ca.concordia.cse.gipsy.ws.rest: + +1- RestGenerator.java is the generator wrapper based on the GeneratorGUI.java in de.vs.unikassel.generator.gui +2- All files are created at the same time using different threads +3- Using RestJSClient.html in `Web Pages` folder, the client can request files in the browser + -1-Run Main.java in ca.concordia.cse.gipsy.ws.soap -2-Enter a number to run the service -3-Once the files are created server side, enter the command getFileGenerated to retreive them +------- HOW TO: Javascript REST Client for WS-Gen ------ +1- Client can click `Generate Files` without entering any inputs +2- The files takes a moment to be generated +3- Once the files are generated, buttons will appear. +4- The client can click each `Download` buttons to get the files independantly from the server -Note: -Libraries needed for this project is under src/lib diff --git a/WebContent/RestJSClient.html b/WebContent/RestJSClient.html new file mode 100644 index 0000000..a5b8d1d --- /dev/null +++ b/WebContent/RestJSClient.html @@ -0,0 +1,130 @@ + + + + Rest Client for WS-Gen + + + + + +
+

Javascript REST Client for WS-Gen

+
+
+

Parameters for the Generator

+

+

+ + + + + + +
+ + \ No newline at end of file diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml index aed7a90..7d53e42 100644 --- a/nbproject/build-impl.xml +++ b/nbproject/build-impl.xml @@ -19,6 +19,7 @@ --> + @@ -998,6 +999,9 @@ exists or setup the property manually. For example like this: + + + @@ -1015,6 +1019,9 @@ exists or setup the property manually. For example like this: + + + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties index 782926d..e364381 100644 --- a/nbproject/genfiles.properties +++ b/nbproject/genfiles.properties @@ -1,9 +1,21 @@ + +build.xml.data.CRC32=7b1a7c2c build.xml.data.CRC32=59c97cea + build.xml.script.CRC32=bcdf5eca build.xml.stylesheet.CRC32=651128d4@1.77.1.1 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. + +nbproject/build-impl.xml.data.CRC32=7b1a7c2c +nbproject/build-impl.xml.script.CRC32=7965e830 +nbproject/build-impl.xml.stylesheet.CRC32=99ea4b56@1.77.1.1 +nbproject/rest-build.xml.data.CRC32=0ab29f81 +nbproject/rest-build.xml.script.CRC32=c9ad12d8 +nbproject/rest-build.xml.stylesheet.CRC32=0cfeebcc@1.31.1 + nbproject/build-impl.xml.data.CRC32=59c97cea nbproject/build-impl.xml.script.CRC32=37407d58 nbproject/build-impl.xml.stylesheet.CRC32=99ea4b56@1.77.1.1 + nbproject/jaxws-build.xml.stylesheet.CRC32=6608c2cf diff --git a/nbproject/project.properties b/nbproject/project.properties index 0175135..6dd4532 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -26,11 +26,15 @@ dist.dir=dist dist.ear.war=${dist.dir}/${war.ear.name} dist.javadoc.dir=${dist.dir}/javadoc dist.war=${dist.dir}/${war.name} +endorsed.classpath= excludes= file.reference.axis.jar=WebContent/WEB-INF/lib/axis.jar file.reference.commons-discovery-0.2.jar=WebContent/WEB-INF/lib/commons-discovery-0.2.jar file.reference.commons-logging.jar=WebContent/WEB-INF/lib/commons-logging.jar file.reference.dom4j-1.6.1.jar=src/lib/dom4j-1.6.1.jar +file.reference.jackson-annotations-2.9.4.jar=src/lib/jackson-annotations-2.9.4.jar +file.reference.jackson-core-2.9.4.jar=src/lib/jackson-core-2.9.4.jar +file.reference.jackson-databind-2.9.4.jar=src/lib/jackson-databind-2.9.4.jar file.reference.jaxrpc.jar=WebContent/WEB-INF/lib/jaxrpc.jar file.reference.jdom.jar=src/lib/jdom.jar file.reference.saaj.jar=WebContent/WEB-INF/lib/saaj.jar @@ -68,7 +72,10 @@ javac.classpath=\ ${file.reference.WebServiceChallengeSources.jar}:\ ${file.reference.xalan-2.7.0.jar}:\ ${file.reference.xercesImpl-2.8.1.jar}:\ - ${file.reference.dom4j-1.6.1.jar} + ${file.reference.dom4j-1.6.1.jar}:\ + ${file.reference.jackson-annotations-2.9.4.jar}:\ + ${file.reference.jackson-core-2.9.4.jar}:\ + ${file.reference.jackson-databind-2.9.4.jar} # Space-separated list of extra javac options javac.compilerargs= javac.debug=true @@ -95,10 +102,10 @@ javadoc.use=true javadoc.version=false javadoc.windowtitle= lib.dir=WebContent/WEB-INF/lib -no.dependencies=false persistence.xml.dir=${conf.dir} platform.active=default_platform resource.dir=setup +rest.config.type=ide run.test.classpath=\ ${javac.test.classpath}:\ ${build.test.classes.dir} diff --git a/nbproject/project.xml b/nbproject/project.xml index 45b7520..bccfa08 100644 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -3,9 +3,11 @@ org.netbeans.modules.web.project + + WSC09Platform @@ -63,6 +65,18 @@ ${file.reference.dom4j-1.6.1.jar} WEB-INF/lib + + ${file.reference.jackson-annotations-2.9.4.jar} + WEB-INF/lib + + + ${file.reference.jackson-core-2.9.4.jar} + WEB-INF/lib + + + ${file.reference.jackson-databind-2.9.4.jar} + WEB-INF/lib + diff --git a/src/ca/concordia/cse/gipsy/ws/rest/ApplicationConfig.java b/src/ca/concordia/cse/gipsy/ws/rest/ApplicationConfig.java new file mode 100644 index 0000000..494822a --- /dev/null +++ b/src/ca/concordia/cse/gipsy/ws/rest/ApplicationConfig.java @@ -0,0 +1,6 @@ +package ca.concordia.cse.gipsy.ws.rest; + +import javax.ws.rs.core.Application; + +@javax.ws.rs.ApplicationPath("resources") +public class ApplicationConfig extends Application {} diff --git a/src/ca/concordia/cse/gipsy/ws/rest/GeneratorConfiguration.java b/src/ca/concordia/cse/gipsy/ws/rest/GeneratorConfiguration.java new file mode 100644 index 0000000..cf13e4c --- /dev/null +++ b/src/ca/concordia/cse/gipsy/ws/rest/GeneratorConfiguration.java @@ -0,0 +1,72 @@ +package ca.concordia.cse.gipsy.ws.rest; + +import java.io.Serializable; +import javax.xml.bind.annotation.XmlRootElement; + +/** + * + * @author Jo + */ +@XmlRootElement +public class GeneratorConfiguration implements Serializable { + public int numberOfConcepts; + public int numberOfServices; + public boolean solvableProblem; + public int[] solutionsList ; + + public GeneratorConfiguration() { + + } + + public void setNumberOfConcepts(String valueInput) { + this.numberOfConcepts = getInt(valueInput, 10000, "Number of concepts"); + } + + public void setNumberOfServices(String valueInput) { + this.numberOfServices = getInt(valueInput, 4000, "Number of services"); + } + + public void setSolvableProblem(boolean solvableProblem) { + this.solvableProblem = solvableProblem; + } + + public void setSolutionsListViaString(String valueInput) { + String[] differentDepths = valueInput.split(","); + + solutionsList = new int[differentDepths.length]; + + for (int i = 0; i < differentDepths.length; i++) { + solutionsList[i] = getInt(differentDepths[i], 10, "Solution list depth"); + } + } + + public void setSolutionsList(int[] valueInput) { + this.solutionsList = valueInput; + } + + public int getNumberOfConcepts() { + return numberOfConcepts; + } + + public int getNumberOfServices() { + return numberOfServices; + } + + public boolean isSolvableProblem() { + return solvableProblem; + } + + public int[] getSolutionsList() { + return solutionsList; + } + + private int getInt(String value, int defaultVal, String paramName) { + try { + return Integer.parseInt(value); + } catch (Exception ex) { + System.out.println("Invalid value for " + paramName + ", taking default value: " + defaultVal); + return defaultVal; + } + } + +} diff --git a/src/ca/concordia/cse/gipsy/ws/rest/MainRestJavaClient.java b/src/ca/concordia/cse/gipsy/ws/rest/MainRestJavaClient.java new file mode 100644 index 0000000..1b66b9d --- /dev/null +++ b/src/ca/concordia/cse/gipsy/ws/rest/MainRestJavaClient.java @@ -0,0 +1,77 @@ +package ca.concordia.cse.gipsy.ws.rest; + +import java.util.Scanner; + +/** + * + * @author Jo + */ +public class MainRestJavaClient { + public static void main(String[] args) { + RestJavaClient client = new RestJavaClient("http://localhost:8080/WSC-Gen/resources/restGenerator"); + + Scanner scan = new Scanner(System.in); + + boolean finished = false; + + while (!finished) { + System.out.println("Choose your option (exit to leave): "); + System.out.println("GENERATE: to generate the files"); + System.out.println("WSDL: to get the wsdl file"); + System.out.println("OWL: to get the owl file"); + System.out.println("BPEL: to get the bpel file"); + System.out.println("WSLA: to get the wsla file"); + System.out.println(""); + + String answer = scan.nextLine(); + + switch (answer.toUpperCase()) { + case "GENERATE": + client.generateFiles(getGenConfiguration(scan)); + break; + case "WSDL": + client.getWSDL(); + break; + case "OWL": + client.getOWL(); + break; + case "WSLA": + client.getWSLA(); + break; + case "BPEL": + client.getBPEL(); + break; + case "EXIT": + finished = true; + break; + default: + System.out.println("Wrong choice. Please try again."); + break; + } + } + + scan.close(); + } + + private static GeneratorConfiguration getGenConfiguration(Scanner scan) { + GeneratorConfiguration config = new GeneratorConfiguration(); + + System.out.println("Value for number of concepts (integer):"); + config.setNumberOfConcepts(scan.nextLine()); + + System.out.println("Value for number of services (integer):"); + config.setNumberOfServices(scan.nextLine()); + + System.out.println("Value for is solvable (true or false):"); + boolean isSolvable = Boolean.parseBoolean(scan.nextLine()); + + config.setSolvableProblem(isSolvable); + + if (isSolvable) { + System.out.println("Value for solutions list (integers separated by ,):"); + config.setSolutionsListViaString(scan.nextLine()); + } + + return config; + } +} \ No newline at end of file diff --git a/src/ca/concordia/cse/gipsy/ws/rest/RestGenerator.java b/src/ca/concordia/cse/gipsy/ws/rest/RestGenerator.java new file mode 100644 index 0000000..df7dc55 --- /dev/null +++ b/src/ca/concordia/cse/gipsy/ws/rest/RestGenerator.java @@ -0,0 +1,154 @@ +package ca.concordia.cse.gipsy.ws.rest; + +import ca.concordia.cse.gipsy.ws.soap.Generator; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.File; +import javax.ejb.Stateless; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.DELETE; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.ResponseBuilder; + +/** + * + * @author Jo + */ +@Stateless +@Path("restGenerator") +public class RestGenerator { + private Generator instance; + + public RestGenerator() { + instance = new Generator(); + + try { + instance.setDefault(); + } catch (Exception ex) { + System.out.println("Problem when setting the defaults of the generator. Error: " + ex.getMessage()); + } + } + + @PUT + @Path("gen") + @Consumes(MediaType.APPLICATION_JSON) + public Response generate(String jsonInput) { + System.out.println("JSON input: " + jsonInput); + + ObjectMapper ob = new ObjectMapper(); + + try { + GeneratorConfiguration config = ob.readValue(jsonInput, GeneratorConfiguration.class); + + instance.setNumberOfConcepts(config.getNumberOfConcepts()); + instance.setNumberOfServices(config.getNumberOfServices()); + instance.setSolvableProblem(config.isSolvableProblem()); + + if (config.isSolvableProblem()) { + instance.setSolutionsList(config.getSolutionsList()); + instance.setCompleteSolutionDepth(); + } + + instance.start(); + + return Response.status(Response.Status.OK).build(); + } catch (Exception ex) { + System.out.println(ex.getMessage()); + return Response.status(Response.Status.BAD_REQUEST).build(); + } + } + + @GET + @Path("gen/{fileType}") + @Produces(MediaType.TEXT_PLAIN) + public Response getFileGenerated(@PathParam("fileType") String fileType) { + String fileName = ""; + + try { + switch(fileType.toLowerCase()) { + case "wsdl": + fileName = instance.getServiceWSDLFileName(); + break; + case "owl": + fileName = instance.getOwlFileName(); + break; + case "wsla": + fileName = instance.getWSLAFileName(); + break; + case "bpel": + fileName = instance.getBpelFileName(); + break; + } + + if (fileName.isEmpty()) { + throw new Exception("Invalid file type to get."); + } + + return this.generateGetResponse(fileName); + } catch (Exception ex) { + System.out.println(ex.getMessage()); + return Response.status(Response.Status.BAD_GATEWAY).build(); + } + } + + private Response generateGetResponse(String fileName) { + File toReturn = instance.getFile(fileName); + + ResponseBuilder response; + + if (toReturn != null) { + response = Response.ok(toReturn, MediaType.TEXT_PLAIN); + response.header("Content-Disposition", "attachment; filename=\"" + fileName + "\""); + } else { + response = Response.status(Response.Status.NOT_FOUND); + } + + return response.build(); + } + + /* + For the methods that aren't allowed + */ + @PUT + @Path("gen/{fileType}") + public Response notImplementedGetFilePUT() { + return Response.status(Response.Status.METHOD_NOT_ALLOWED).build(); + } + + @POST + @Path("gen/{fileType}") + public Response notImplementedGetFilePOST() { + return Response.status(Response.Status.METHOD_NOT_ALLOWED).build(); + } + + @DELETE + @Path("gen/{fileType}") + public Response notImplementedGetFileDELETE() { + return Response.status(Response.Status.METHOD_NOT_ALLOWED).build(); + } + + @GET + @Path("gen") + public Response notImplementedGenFilesGET() { + return Response.status(Response.Status.METHOD_NOT_ALLOWED).build(); + } + + @POST + @Path("gen") + public Response notImplementedGenFilesPOST() { + return Response.status(Response.Status.METHOD_NOT_ALLOWED).build(); + } + + @DELETE + @Path("gen") + public Response notImplementedGenFilesDELETE() { + return Response.status(Response.Status.METHOD_NOT_ALLOWED).build(); + } + +} \ No newline at end of file diff --git a/src/ca/concordia/cse/gipsy/ws/rest/RestJavaClient.java b/src/ca/concordia/cse/gipsy/ws/rest/RestJavaClient.java new file mode 100644 index 0000000..eb64d2d --- /dev/null +++ b/src/ca/concordia/cse/gipsy/ws/rest/RestJavaClient.java @@ -0,0 +1,85 @@ +package ca.concordia.cse.gipsy.ws.rest; + +import java.io.File; +import java.io.InputStream; +import java.nio.file.Files; +import javax.swing.JFileChooser; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +/** + * + * @author Jo + */ +public class RestJavaClient { + private Client restClient; + private String urlRestApi; + + + public RestJavaClient(String urlRestApi) { + restClient = ClientBuilder.newClient(); + this.urlRestApi = urlRestApi; + } + + public void generateFiles(GeneratorConfiguration configs) { + WebTarget resource = restClient.target(this.urlRestApi + "/gen"); + + resource.request(MediaType.APPLICATION_JSON) + .put(Entity.json(configs)); + } + + public void getWSDL() { + getFile("wsdl"); + } + + public void getWSLA() { + getFile("wsla"); + } + + public void getOWL() { + getFile("owl"); + } + + public void getBPEL() { + getFile("bpel"); + } + + private void getFile(String fileType) { + WebTarget resource = restClient.target(this.urlRestApi + "/gen/" + fileType); + + Response answer = resource.request(MediaType.TEXT_PLAIN).get(); + + if (answer.getStatus() == Response.Status.OK.getStatusCode()) { + InputStream is = answer.readEntity(InputStream.class); + + File whereToSave = askWhereToSave(); + + if (whereToSave == null) { + System.out.println("You need to selected a file for where to download the " + fileType + " file. Aborting."); + } else { + try { + Files.copy(is, whereToSave.toPath()); + } catch (Exception ex) { + System.out.println("Error saving the file to the specified path. Error: " + ex.getLocalizedMessage()); + } + } + } else { + System.out.println("Error download the " + fileType + " file. Status code: " + answer.getStatus()); + } + } + + private File askWhereToSave() { + JFileChooser fileChooser = new JFileChooser(); + + if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { + fileChooser.setVisible(false); + return fileChooser.getSelectedFile(); + } + + return null; + } +} \ No newline at end of file diff --git a/src/ca/concordia/cse/gipsy/ws/soap/Generator.java b/src/ca/concordia/cse/gipsy/ws/soap/Generator.java index 8928945..8d37dad 100644 --- a/src/ca/concordia/cse/gipsy/ws/soap/Generator.java +++ b/src/ca/concordia/cse/gipsy/ws/soap/Generator.java @@ -4,10 +4,13 @@ import de.vs.unikassel.generator.gui.listener.GeneratorGUIListener; import java.io.File; import de.vs.unikassel.generator.gui.listener.TaskGenerator; + +/* is this needed? from ws merge/error...to test import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javax.swing.JOptionPane; +*/ /** * Generator based on GeneratorGUIListener.java in de.vs.unikassel.generator.gui.listener @@ -542,7 +545,7 @@ public File getFile(String filePath) { return new File(this.outputFolder + "/" + filePath); } - + /** * Handles the "Info"-button. * Displays some informations about us. @@ -565,4 +568,5 @@ public String infoButton() { return infoFileText.toString(); } + } diff --git a/src/ca/concordia/cse/gipsy/ws/soap/GeneratorWS.java b/src/ca/concordia/cse/gipsy/ws/soap/GeneratorWS.java index 11137f0..b95a708 100644 --- a/src/ca/concordia/cse/gipsy/ws/soap/GeneratorWS.java +++ b/src/ca/concordia/cse/gipsy/ws/soap/GeneratorWS.java @@ -2,7 +2,9 @@ import javax.activation.DataHandler; import javax.activation.FileDataSource; + import javax.jws.Oneway; + import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; @@ -69,8 +71,9 @@ public void setDefault() throws Exception { * @throws Exception */ @WebMethod(operationName="start") - public boolean start() throws Exception { - return instance.start(); + public void start() throws Exception { + instance.start(); + } /** @@ -84,6 +87,8 @@ public void setNumberOfConcepts(@WebParam(name= "numberOfConcepts") int numberOf instance.setNumberOfConcepts(numberOfConcepts); } + + /** * Setter for number of services * @@ -96,6 +101,7 @@ public void setNumberOfServices(@WebParam(name= "numberOfServices")int numberOfS } /** + * Setter for solvableProblem * * If set to false, solutionDepth, completeSolutionDepth and minNumberOfConcepts are not usable @@ -119,6 +125,7 @@ public void setSolutionsList(@WebParam(name="depthNumbers") int[] depthNumbers ) } /** + * Sum the total solutionDepthList indexes to calculate the completeSolutionDepth */ @WebMethod(operationName="setCompleteSolutionDepth") @@ -147,6 +154,7 @@ public void setBpelFileName(@WebParam(name= "bpelFileName")String bpelFileName) } /** + * Setter for OwlFileName * @param owlFileName * @throws Exception if file name is null or empty, also if the user didn't ask to override and the operation will override files @@ -156,7 +164,9 @@ public void setOwlFileName(@WebParam(name="owlFileName") String owlFileName) thr instance.setOwlFileName(owlFileName); } + /** + * Setter for taskWSDLFileName * @param taskWSDLFileName * @throws Exception if file is null or empty, also if the user didn't ask to override and the operation will override files @@ -166,7 +176,9 @@ public void setTaskWSDLFileName(@WebParam(name="taskWSDLFileName") String taskWS instance.setTaskWSDLFileName(taskWSDLFileName); } + /** + * Refactored function from GeneratorGUIListener.java * * Setter for WSLAFileName @@ -180,6 +192,7 @@ public void setWSLAFileName(@WebParam(name="WSLAFileName") String WSLAFileName) /** + * Setter * @param serviceWSDLFileName * @throws Exception if file is null or empty, also if the file will be override and the user didn't ask for it @@ -189,7 +202,9 @@ public void setServiceWSDLFileName(@WebParam(name="serviceWSDLFileName")String s instance.setServiceWSDLFileName(serviceWSDLFileName); } + /** + * User can decide if intermediateFiles need to be created or not * * Setter @@ -200,7 +215,6 @@ public void setGenerateIntermediateFiles(@WebParam(name= "generateIntermediateFi instance.setGenerateIntermediateFiles(generateIntermediateFiles); } - /** * User can decide if it wants to ignore the calculated minimum based on the solutiondepths numbers * @@ -212,6 +226,7 @@ public void setIgnoreMinimum(@WebParam(name= "ignoreMinimum")boolean ignoreMinim } + /** * Calculate the minimum number concepts */ @@ -224,6 +239,7 @@ public void calculateMinNumberConcepts() { public String getErrorMessages(){ return instance.getErrorMessages(); } + /** * @@ -233,4 +249,5 @@ public String getErrorMessages(){ public String infoButton(){ return instance.infoButton(); } + } diff --git a/src/ca/concordia/cse/gipsy/ws/soap/Main.java b/src/ca/concordia/cse/gipsy/ws/soap/Main.java index ddb4649..cfd672d 100644 --- a/src/ca/concordia/cse/gipsy/ws/soap/Main.java +++ b/src/ca/concordia/cse/gipsy/ws/soap/Main.java @@ -1,5 +1,6 @@ package ca.concordia.cse.gipsy.ws.soap; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -9,11 +10,13 @@ import java.util.Scanner; import javax.swing.JFileChooser; + public class Main { public static void main(String[] args) throws Exception { SoapClient client = new SoapClient(); + client.setDefault(); Scanner scan = new Scanner(System.in); @@ -168,6 +171,7 @@ public static void main(String[] args) throws Exception { } scan.close(); + } diff --git a/src/lib/jackson-annotations-2.9.4.jar b/src/lib/jackson-annotations-2.9.4.jar new file mode 100755 index 0000000..5090865 Binary files /dev/null and b/src/lib/jackson-annotations-2.9.4.jar differ diff --git a/src/lib/jackson-core-2.9.4.jar b/src/lib/jackson-core-2.9.4.jar new file mode 100755 index 0000000..5971a55 Binary files /dev/null and b/src/lib/jackson-core-2.9.4.jar differ diff --git a/src/lib/jackson-databind-2.9.4.jar b/src/lib/jackson-databind-2.9.4.jar new file mode 100755 index 0000000..4315925 Binary files /dev/null and b/src/lib/jackson-databind-2.9.4.jar differ