Compare commits
	
		
			11 Commits
		
	
	
		
			xalan_libx
			...
			b7af1eb33a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b7af1eb33a | |||
| ec49f496da | |||
| 9cb949b485 | |||
| 097af3ed3a | |||
| b9f26f07a8 | |||
| 6a70c3c9c9 | |||
| a0d759f58b | |||
| 9f64b83844 | |||
| 0d469db020 | |||
| 38b3942bde | |||
| e834229cae | 
| @@ -10,6 +10,8 @@ import org.apache.logging.log4j.Logger; | ||||
| import spark.Request; | ||||
| import spark.Response; | ||||
|  | ||||
| import java.io.StringWriter; | ||||
|  | ||||
| /** | ||||
|  * Controller used to handle XML tools: XPath, XSD validation, XQuery and XSLT | ||||
|  * @author Adam Bem | ||||
| @@ -48,9 +50,14 @@ public class XmlController implements RestController { | ||||
|  | ||||
|     @ScopedControllerManifest(method = HandlerType.POST, path = "/xslt") | ||||
|     public void acceptRequestXslt(Request request, Response response) { | ||||
|         System.out.println("received xslt"); | ||||
|         acceptRequest(request, response, XmlJobType.XSLT); | ||||
|     } | ||||
|  | ||||
|     @ScopedControllerManifest(method = HandlerType.POST, path = "/xslt/param") | ||||
|     public void acceptRequestXsltAddParam(Request request, Response response) { | ||||
|         System.out.println("received param"); | ||||
|         acceptRequest(request, response, XmlJobType.XSLT_PARAM); | ||||
|     } | ||||
|     private void acceptRequest(Request request, Response response, XmlJobType xmlJobType) { | ||||
|         XMLRequestBody requestBody; | ||||
|         try { | ||||
| @@ -60,7 +67,12 @@ public class XmlController implements RestController { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         if (requestBody.getProcessor() == null) { | ||||
|         if (requestBody.getProcessor() == null ) { | ||||
|             if(requestBody.getProcessorData() != null){ | ||||
|                 processRequest(new XmlJob(response, requestBody, xmlJobType)); | ||||
|                 return; | ||||
|             } | ||||
|             System.out.println("getProcessor=null"); | ||||
|             invalidEngineSelectedResponse(response); | ||||
|             return; | ||||
|         } | ||||
| @@ -91,10 +103,9 @@ public class XmlController implements RestController { | ||||
|             responseBody.setDuration(duration); | ||||
|  | ||||
|             xmlJob.getResponse().status(200); | ||||
|  | ||||
|             this.logger.info("Request (" + xmlJob.getXmlJobType() + ", " + | ||||
|            /* this.logger.info("Request (" + xmlJob.getXmlJobType() + ", " + | ||||
|                     xmlJob.getEngine().getVersion() + | ||||
|                     ") processed in " + duration + " ms."); | ||||
|                     ") processed in " + duration + " ms.");*/ | ||||
|  | ||||
|         } catch (Exception ex) { | ||||
|             responseBody = processingErrorResponse(ex, xmlJob); | ||||
| @@ -129,6 +140,13 @@ public class XmlController implements RestController { | ||||
|  | ||||
|         String result = null; | ||||
|         switch (xmlJob.getXmlJobType()) { | ||||
|             case XSLT_PARAM: | ||||
|                 System.out.println("xstl_param"); | ||||
|                 System.out.println(requestBody.getProcessorData()); | ||||
|                 System.out.println(requestBody.getParamName()); | ||||
|                 System.out.println(requestBody.getParamValue()); | ||||
|                 result = addParam(requestBody.getProcessorData(), requestBody.getParamName(), requestBody.getParamValue()); | ||||
|                 break; | ||||
|             case XSLT: | ||||
|                 result = engine.processXSLT(requestBody.getData(), requestBody.getProcessorData()); | ||||
|                 break; | ||||
| @@ -141,7 +159,16 @@ public class XmlController implements RestController { | ||||
|                         requestBody.getVersion()); | ||||
|                 break; | ||||
|         } | ||||
|         return new XMLResponseBody(result, "OK", requestBody.getVersion()); | ||||
|         System.out.println("can we get here?"); | ||||
|         return new XMLResponseBody(result, "OK", requestBody.getProcessorData()); | ||||
|     } | ||||
|  | ||||
|     private String addParam(String processorData, String paramName, String paramValue) { | ||||
|         System.out.println("addParamSaxon"); | ||||
|         processorData= processorData.replace("<xsl:template match=\"/\">", "<xsl:param name=\""+paramName+"\" select=\"'"+paramValue+"'\"/>\n\t\t<xsl:template match=\"/\">"); | ||||
|         StringWriter sw = new StringWriter(); | ||||
|         sw.write(processorData); | ||||
|         return sw.toString(); | ||||
|     } | ||||
|  | ||||
|     private XMLResponseBody processingErrorResponse(Exception ex, XmlJob xmlJob) { | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import spark.Response; | ||||
| public class XmlJob { | ||||
|     private final Response response; | ||||
|     private final XMLRequestBody requestBody; | ||||
|     private final XmlEngine engine; | ||||
|     private XmlEngine engine; | ||||
|     private final XmlJobType xmlJobType; | ||||
|  | ||||
|     public XmlJob(Response response, XMLRequestBody requestBody, XmlEngine engine, XmlJobType xmlJobType) { | ||||
| @@ -16,7 +16,11 @@ public class XmlJob { | ||||
|         this.engine = engine; | ||||
|         this.xmlJobType = xmlJobType; | ||||
|     } | ||||
|  | ||||
|     public XmlJob(Response response, XMLRequestBody requestBody, XmlJobType xmlJobType) { | ||||
|         this.response = response; | ||||
|         this.requestBody = requestBody; | ||||
|         this.xmlJobType = xmlJobType; | ||||
|     } | ||||
|     public Response getResponse() { | ||||
|         return response; | ||||
|     } | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package com.r11.tools.controller.internal; | ||||
|  | ||||
| public enum XmlJobType { | ||||
|     XPath("XPath"), XSD("XSD"), XQuery("XQuery"), XSLT("XSLT"); | ||||
|     XPath("XPath"), XSD("XSD"), XQuery("XQuery"), XSLT("XSLT"), XSLT_PARAM("XSLT_PARAM"); | ||||
|  | ||||
|     XmlJobType(String type) { | ||||
|     } | ||||
|   | ||||
| @@ -15,19 +15,20 @@ public class XMLRequestBody { | ||||
|     private String processor; | ||||
|     @SerializedName("version") | ||||
|     private String version; | ||||
|     @SerializedName("paramName") | ||||
|     private String paramName; | ||||
|     @SerializedName("paramValue") | ||||
|     private String paramValue; | ||||
|  | ||||
|     public String getData() { | ||||
|         return data; | ||||
|     } | ||||
|  | ||||
|     public String getProcessorData() { | ||||
|         return processorData; | ||||
|     } | ||||
|  | ||||
|     public String getProcessorData() {return processorData;} | ||||
|     public String getParamName() {return paramName;} | ||||
|     public String getParamValue() {return paramValue;} | ||||
|     public String getProcessor() { | ||||
|         return processor; | ||||
|     } | ||||
|  | ||||
|     public String getVersion() { | ||||
|         return version; | ||||
|     } | ||||
|   | ||||
| @@ -9,9 +9,6 @@ public interface XmlEngine { | ||||
|     XPathQueryResult processXPath(String data, String query, String version) throws Exception; | ||||
|     String processXSLT(String data, String transform) throws Exception; | ||||
|     String validate(String data, String xsd) throws Exception; | ||||
|  | ||||
|     String executeXQuery(String data, String xquery, String version) throws Exception; | ||||
|  | ||||
|     public String getVersion(); | ||||
|  | ||||
| } | ||||
|   | ||||
							
								
								
									
										107
									
								
								Frontend/src/components/XsltParamComponent.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								Frontend/src/components/XsltParamComponent.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| <script setup lang="ts"> | ||||
| import {ref} from 'vue' | ||||
|  | ||||
| const emit = defineEmits<{ | ||||
|   (event: 'update-value', value: string): void; | ||||
| }>(); | ||||
|  | ||||
| const props = defineProps({ | ||||
|   xslt: {type: String, required: true} | ||||
| }) | ||||
|  | ||||
|  | ||||
| const sendToParent = (xslt: string) => { | ||||
|   emit('update-value', xslt); | ||||
| }; | ||||
| const nameInput = ref('') | ||||
| const valueInput = ref('') | ||||
|  | ||||
| const options = ref<{ name: string }[]>([ | ||||
|   { name: "Add Param" }, | ||||
|   { name: "Set Param" }, | ||||
| ]); | ||||
|  | ||||
| const selectedOption = ref(options.value[0].name); | ||||
|  | ||||
|  | ||||
| const selectedFunction = () => { | ||||
|   if(selectedOption.value === "Add Param") { | ||||
|     sendRequest("addParam"); | ||||
|   } | ||||
|   else { | ||||
|     sendRequest("setParam") | ||||
|     } | ||||
| }; | ||||
| const sendRequest = (type:string) => { | ||||
|   console.log(type) | ||||
|   let request: Request = prepareRequest(type) | ||||
|   fetchRequest(request).then((body) => { | ||||
|     const result = (body as any).result; | ||||
|     sendToParent(result); | ||||
|   }); | ||||
| } | ||||
|  | ||||
| function prepareRequest(type :string): Request { | ||||
|   let request = new Request(prepareURL(), { | ||||
|     body: prepareRequestBody(type), | ||||
|     method: "POST" | ||||
|   }); | ||||
|   return request | ||||
| } | ||||
|  | ||||
| function prepareURL(): string { | ||||
|   //const engineEndpoint = engine.value == "libxml" ? "libxml" : "java"; | ||||
|   return document.location.protocol + "//" + document.location.hostname + "/" + "java" + "/xslt/param"; | ||||
|   //return "http://localhost:8081/xslt/param"; | ||||
| } | ||||
|  | ||||
| function prepareRequestBody(type: string): string { | ||||
|   let requestBody = JSON.stringify({ | ||||
|     "processorData": props.xslt, | ||||
|     "paramName": nameInput.value, | ||||
|     "paramValue": valueInput.value, | ||||
|     "type": type | ||||
|   }); | ||||
|   console.log(requestBody); | ||||
|   return requestBody; | ||||
| } | ||||
|  | ||||
| async function fetchRequest(request: Request): Promise<JSON> { | ||||
|   console.log(request) | ||||
|   let responseBody = await fetch(request) | ||||
|   return await responseBody.json() | ||||
|      // .then(response => response.json()) | ||||
|    //   .then((body) => body) | ||||
|   //console.log(responseBody); | ||||
|   //return responseBody | ||||
| } | ||||
|  | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|   <select | ||||
|       v-model="selectedOption" | ||||
|       class="px-3 rounded-full border border-slate-400 bg-white dark:text-slate-100 dark:bg-gray-600 w-1/3" | ||||
|   > | ||||
|     <option v-for="option in options" :value="option.name" :key="option.name"> | ||||
|       {{ option.name }} | ||||
|     </option> | ||||
|   </select> | ||||
|  | ||||
|   <input | ||||
|       id="NameTextInput" | ||||
|       v-model="nameInput" | ||||
|       class="text-input px-3 rounded-full border border-slate-400 bg-white dark:text-slate-100 dark:bg-gray-600 w-1/3" | ||||
|       type="text" | ||||
|       placeholder="Name" | ||||
|   /> | ||||
|   <input | ||||
|       id="ValueTextInput" | ||||
|       v-model="valueInput" | ||||
|       class="text-input px-3 rounded-full border border-slate-400 bg-white dark:text-slate-100 dark:bg-gray-600 w-1/3" | ||||
|       type="text" | ||||
|       placeholder="Value" | ||||
|   /> | ||||
|   <button class="tool-button" @click="selectedFunction">{{selectedOption}}</button> | ||||
| </template> | ||||
|  | ||||
| @@ -2,13 +2,14 @@ | ||||
| import InsertTemplateComponent from '@components/common/InsertTemplateComponent.vue' | ||||
| import XMLButtonFormatterComponent from '@components/formatter/XMLButtonFormatterComponent.vue' | ||||
| import CodeEditor from '@/components/common/CodeEditorComponent.vue' | ||||
| import XsltParamComponent from '@/components/XsltParamComponent.vue' | ||||
|  | ||||
| import { ref } from 'vue' | ||||
| import {ref} from 'vue' | ||||
|  | ||||
| const props = defineProps( | ||||
|     { | ||||
|         stylizedName: {type: String, required: true}, | ||||
|         data: {type: String}, | ||||
|       stylizedName: {type: String, required: true}, | ||||
|       data: {type: String}, | ||||
|     } | ||||
| ) | ||||
| const emit = defineEmits(['update:modelValue']) | ||||
| @@ -17,54 +18,72 @@ const data = ref('') | ||||
| const inputFile = ref() | ||||
|  | ||||
| function sendValue() { | ||||
|     emit('update:modelValue', data.value) | ||||
|   emit('update:modelValue', data.value) | ||||
| } | ||||
|  | ||||
|  | ||||
| function updateData(newData: string, clearFileSelector: boolean = true) { | ||||
|     data.value = newData | ||||
|     if (clearFileSelector) | ||||
|         inputFile.value.value = ''; | ||||
|     sendValue() | ||||
|   data.value = newData | ||||
|   if (clearFileSelector) | ||||
|     inputFile.value.value = ''; | ||||
|   sendValue() | ||||
| } | ||||
|  | ||||
| function clear() { | ||||
|     updateData('') | ||||
|   updateData('') | ||||
| } | ||||
|  | ||||
| function canBeFormatted() { | ||||
|     return props.stylizedName.toLowerCase() == 'xml' ||  | ||||
|            props.stylizedName.toLowerCase() == 'xsd' ||  | ||||
|            props.stylizedName.toLowerCase() == 'xslt' | ||||
|   return props.stylizedName.toLowerCase() == 'xml' || | ||||
|       props.stylizedName.toLowerCase() == 'xsd' || | ||||
|       props.stylizedName.toLowerCase() == 'xslt' | ||||
| } | ||||
|  | ||||
| function readFile(file : any) { | ||||
|      | ||||
|     const reader = new FileReader() | ||||
|     reader.onloadend = () => { | ||||
|         let result = reader.result?.toString() | ||||
|         if (typeof result == "string") | ||||
|             updateData(result, false); | ||||
|              | ||||
|     } | ||||
|     reader.readAsText(file.target.files[0]) | ||||
| function addParameters() { | ||||
|   return props.stylizedName?.toLowerCase() == "xslt" | ||||
| } | ||||
|  | ||||
| function readFile(file: any) { | ||||
|  | ||||
|   const reader = new FileReader() | ||||
|   reader.onloadend = () => { | ||||
|     let result = reader.result?.toString() | ||||
|     if (typeof result == "string") | ||||
|       updateData(result, false) | ||||
|  | ||||
|   } | ||||
|   reader.readAsText(file.target.files[0]) | ||||
| } | ||||
| const handleUpdateValue = (value: string) => {data.value = value}; | ||||
|  | ||||
|  | ||||
| </script> | ||||
|  | ||||
| <template> | ||||
|     <div class="flex flex-col w-full h-1/2 lg:h-1/2 flex-none xl:pr-2 2xl:pr-4 pb-2"> | ||||
|         <div class="flex place-content-between w-full items-center"> | ||||
|             <span class="dark:text-white mr-2">{{ stylizedName }}</span> | ||||
|             <div class="flex space-x-2 pb-2 overflow-x-auto"> | ||||
|                 <div class="flex items-stretch w-64"> | ||||
|                     <input id="fileLoader" ref="inputFile" class="file-selector" type="file" accept=".xml,.xql,.xquery,.xslt,text/xml,text/plain" @change="readFile" /> | ||||
|                 </div> | ||||
|                  | ||||
|                 <InsertTemplateComponent :stylized-name="props.stylizedName" @update:default-data="updateData"></InsertTemplateComponent> | ||||
|                 <XMLButtonFormatterComponent v-if="canBeFormatted()" :xml="data" @update:result="(data:any) => updateData(data.result)"></XMLButtonFormatterComponent> | ||||
|                 <button class="tool-button" @click="clear">Clear</button> | ||||
|             </div> | ||||
|         </div> | ||||
|         <CodeEditor @update:updated-code="updateData" v-model="data" :code="data" :config="{disabled:false, language:stylizedName}"></CodeEditor> | ||||
|   <div class="flex flex-col w-full h-1/2 lg:h-1/2 flex-none xl:pr-2 2xl:pr-4 pb-2"> | ||||
|     <div class="flex justify-between mb-2"></div> | ||||
|  | ||||
|     <div class="flex place-content-between w-full items-center"> | ||||
|  | ||||
|       <span class="dark:text-white mr-2">{{ stylizedName }}</span> | ||||
|  | ||||
|       <div class="flex items-stretch w-64"> | ||||
|         <input id="fileLoader" ref="inputFile" class="file-selector" type="file" accept=".xml,.xql,.xquery,.xslt,text/xml,text/plain" @change="readFile"/> | ||||
|       </div> | ||||
|  | ||||
|       <div class="flex space-x-2 pb-2 overflow-x-auto"> | ||||
|         <InsertTemplateComponent :stylized-name="props.stylizedName" @update:default-data="updateData"></InsertTemplateComponent> | ||||
|         <XMLButtonFormatterComponent v-if="canBeFormatted()" :xml="data" @update:result="(data:any) => updateData(data.result)"></XMLButtonFormatterComponent> | ||||
|         <button class="tool-button" @click="clear">Clear</button> | ||||
|       </div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="flex place-content-between w-full items-center"> | ||||
|       <div v-if="addParameters()" class="flex justify-end space-x-2 pb-2 overflow-x-auto ml-auto"> | ||||
|         <XsltParamComponent @update-value="handleUpdateValue" :xslt="data"/> | ||||
|       </div> | ||||
|     </div> | ||||
|  | ||||
|     <CodeEditor @update:updated-code="updateData" v-model="data" :code="data" :config="{disabled:false, language:stylizedName}"></CodeEditor> | ||||
|   </div> | ||||
| </template> | ||||
		Reference in New Issue
	
	Block a user