From 57775301b6c42eaf1d7275965421ad6627c31ddd Mon Sep 17 00:00:00 2001
From: npedot <nicola.pedot@gmail.com>
Date: Sat, 25 Jan 2020 17:28:53 +0100
Subject: [PATCH] adds transformer xml

---
 README.md                                     | 11 +++-
 .../service/XMLSerializerJacksonAdapter.kt    | 14 +++++
 .../unibz.cs.semint.kprime/domain/Composer.kt |  9 +++
 .../unibz.cs.semint.kprime/domain/Splitter.kt | 15 +++++
 .../unibz.cs.semint.kprime/domain/Template.kt | 11 ++++
 .../domain/Transformer.kt                     | 13 +++++
 .../unibz.cs.semint.kprime/domain/Xmen.kt     |  8 +++
 .../unibz.cs.semint.kprime/domain/Xrule.kt    | 15 +++++
 .../usecase/XMLSerializeUseCase.kt            | 10 ++++
 .../usecase/XPathTransformUseCase.kt          | 11 ++--
 .../usecase/service/IXMLSerializerService.kt  |  7 +--
 .../domain/TransfomerTest.kt                  | 38 +++++++++++++
 .../scenario/PersonTransfomerScenarioTI.kt    | 56 +++++++++++++++++++
 .../scenario/PersonXPathScenarioTI.kt         |  5 +-
 .../transformer/verticalTransfomer.xml        | 23 ++++++++
 15 files changed, 232 insertions(+), 14 deletions(-)
 create mode 100644 src/main/kotlin/unibz.cs.semint.kprime/domain/Composer.kt
 create mode 100644 src/main/kotlin/unibz.cs.semint.kprime/domain/Splitter.kt
 create mode 100644 src/main/kotlin/unibz.cs.semint.kprime/domain/Template.kt
 create mode 100644 src/main/kotlin/unibz.cs.semint.kprime/domain/Transformer.kt
 create mode 100644 src/main/kotlin/unibz.cs.semint.kprime/domain/Xmen.kt
 create mode 100644 src/main/kotlin/unibz.cs.semint.kprime/domain/Xrule.kt
 create mode 100644 src/test/kotlin/unibz.cs.semint.kprime/domain/TransfomerTest.kt
 create mode 100644 src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonTransfomerScenarioTI.kt
 create mode 100644 src/test/resources/transformer/verticalTransfomer.xml

diff --git a/README.md b/README.md
index 03c89f1..cd256ea 100644
--- a/README.md
+++ b/README.md
@@ -68,26 +68,31 @@ technology depenent packages
 * A domain component has to depends on nothing. 
 
 
-## v1.0.0
+## v0.1.0
 
 from object database meta representation as input
 apply kotlin transformer vertical or horizontal
 obtain a second database meta representation as output
 
 
-## v2.0.0
+## v0.2.0
 
 from xml object database meta representation as input
 apply kotlin transformer vertical or horizontal
 obtain a changeset representation as output
 
 
-## v3.0.0
+## v0.3.0
 
 from xml object database meta representation as input
 a generic xpath engine extraction plus freemarker template to generate
 obtain a database meta representation as output
 
+## v0.4.0
+
+from xml object database meta representation as input
+a xml transfomer descriptor
+
 ### to do
 
 * horizontal simple decomposition to remove null columns
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/adapter/service/XMLSerializerJacksonAdapter.kt b/src/main/kotlin/unibz.cs.semint.kprime/adapter/service/XMLSerializerJacksonAdapter.kt
index 5303012..62aadce 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/adapter/service/XMLSerializerJacksonAdapter.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/adapter/service/XMLSerializerJacksonAdapter.kt
@@ -77,4 +77,18 @@ class XMLSerializerJacksonAdapter : IXMLSerializerService {
         return writer.writeValueAsString(table)
     }
 
+    override fun serializeTransfomer(transformer: Transformer): String {
+        val mapper = XmlMapper().registerModule(KotlinModule())
+        val writer = mapper.writerWithDefaultPrettyPrinter()
+        return writer.writeValueAsString(transformer)
+
+    }
+
+    override fun deserializeTransformer(transformerXml: String): Transformer {
+        println(transformerXml)
+        val mapper = XmlMapper()
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
+        return mapper.readValue(transformerXml,Transformer::class.java)
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/domain/Composer.kt b/src/main/kotlin/unibz.cs.semint.kprime/domain/Composer.kt
new file mode 100644
index 0000000..7bbbde9
--- /dev/null
+++ b/src/main/kotlin/unibz.cs.semint.kprime/domain/Composer.kt
@@ -0,0 +1,9 @@
+package unibz.cs.semint.kprime.domain
+
+
+
+class Composer {
+    var xman = Xmen()
+    var template = Template()
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/domain/Splitter.kt b/src/main/kotlin/unibz.cs.semint.kprime/domain/Splitter.kt
new file mode 100644
index 0000000..49c55b2
--- /dev/null
+++ b/src/main/kotlin/unibz.cs.semint.kprime/domain/Splitter.kt
@@ -0,0 +1,15 @@
+package unibz.cs.semint.kprime.domain
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText
+import java.util.*
+
+
+@JacksonXmlRootElement(localName = "splitter")
+class Splitter {
+
+    var xman = Xmen()
+    var template = Template()
+}
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/domain/Template.kt b/src/main/kotlin/unibz.cs.semint.kprime/domain/Template.kt
new file mode 100644
index 0000000..4f83a58
--- /dev/null
+++ b/src/main/kotlin/unibz.cs.semint.kprime/domain/Template.kt
@@ -0,0 +1,11 @@
+package unibz.cs.semint.kprime.domain
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
+import java.util.*
+
+@JacksonXmlRootElement(localName = "template")
+class Template {
+    @JacksonXmlProperty(isAttribute = true)
+    var filename=""
+}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/domain/Transformer.kt b/src/main/kotlin/unibz.cs.semint.kprime/domain/Transformer.kt
new file mode 100644
index 0000000..6230b33
--- /dev/null
+++ b/src/main/kotlin/unibz.cs.semint.kprime/domain/Transformer.kt
@@ -0,0 +1,13 @@
+package unibz.cs.semint.kprime.domain
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
+
+@JacksonXmlRootElement(localName = "transformer")
+class Transformer {
+    @JacksonXmlProperty(isAttribute = true)
+    var name: String =""
+
+    var composer = Composer()
+    var splitter = Splitter()
+}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/domain/Xmen.kt b/src/main/kotlin/unibz.cs.semint.kprime/domain/Xmen.kt
new file mode 100644
index 0000000..c06e042
--- /dev/null
+++ b/src/main/kotlin/unibz.cs.semint.kprime/domain/Xmen.kt
@@ -0,0 +1,8 @@
+package unibz.cs.semint.kprime.domain
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
+
+@JacksonXmlRootElement(localName = "xmen")
+class Xmen {
+    var xrules = ArrayList<Xrule>()
+}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/domain/Xrule.kt b/src/main/kotlin/unibz.cs.semint.kprime/domain/Xrule.kt
new file mode 100644
index 0000000..6829a7a
--- /dev/null
+++ b/src/main/kotlin/unibz.cs.semint.kprime/domain/Xrule.kt
@@ -0,0 +1,15 @@
+package unibz.cs.semint.kprime.domain
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText
+
+@JacksonXmlRootElement(localName = "xrule")
+class Xrule() {
+
+    @JacksonXmlProperty(isAttribute = true)
+    var name = ""
+    @JacksonXmlText
+    var rule = ""
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/XMLSerializeUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/XMLSerializeUseCase.kt
index 36475d2..7f3ff5e 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/XMLSerializeUseCase.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/XMLSerializeUseCase.kt
@@ -58,4 +58,14 @@ class XMLSerializeUseCase(val xmlSerializerService: IXMLSerializerService) {
         return UseCaseResult("done",xmlSerializerService.prettyChangeSet(changeset))
     }
 
+    // trasnfomer
+
+    fun serializeTransformer(transformer: Transformer): UseCaseResult<String> {
+        return UseCaseResult("done",xmlSerializerService.serializeTransfomer(transformer))
+    }
+
+    fun deserializeTransformer(transformerXml: String): UseCaseResult<Transformer> {
+        return UseCaseResult("done",xmlSerializerService.deserializeTransformer(transformerXml))
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/XPathTransformUseCase.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/XPathTransformUseCase.kt
index b26cfd0..23de0c5 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/XPathTransformUseCase.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/XPathTransformUseCase.kt
@@ -13,15 +13,16 @@ import javax.xml.xpath.XPathFactory
 
 class XPathTransformUseCase {
 
-    fun transform(dbFilePath: String, trasformerName: String, trasformerDirection: String, trasformerVersion: String, tranformerParmeters: MutableMap<String, Any>) {
-
+    fun transform(dbFilePath: String, trasformerName: String, trasformerDirection: String, trasformerVersion: String, tranformerParmeters: MutableMap<String, Any>,outWriter:OutputStreamWriter) {
         val vdecomposeFilePath = "/transformer/${trasformerName}/${trasformerDirection}/${trasformerName}_${trasformerDirection}_${trasformerVersion}.paths"
         val vdecomposeTemplatePath = "transformer/${trasformerName}/${trasformerDirection}/${trasformerName}_${trasformerDirection}_${trasformerVersion}.template"
-
         val personProperties = XPathTransformUseCase::class.java.getResourceAsStream(vdecomposeFilePath)
         val xPaths = Properties()
         xPaths.load(personProperties)
+        return transform(dbFilePath,vdecomposeTemplatePath,xPaths, tranformerParmeters,outWriter)
+    }
 
+    fun transform(dbFilePath: String, templateFilePath: String, xPaths: Properties, tranformerParmeters: MutableMap<String, Any>,outWriter:OutputStreamWriter) {
         var dbStream : InputStream
         if (dbFilePath.startsWith("/"))
                 dbStream = FileInputStream(dbFilePath)
@@ -77,8 +78,8 @@ class XPathTransformUseCase {
         // = = 0 xpath
 
         val templ = //Template.getPlainTextTemplate("templ1",personTemplate,templConfig)
-                templConfig.getTemplate(vdecomposeTemplatePath)
-        templ.process(templModel, OutputStreamWriter(System.out))
+                templConfig.getTemplate(templateFilePath)
+        templ.process(templModel, outWriter)
     }
 
     private fun parametrized(line: String, tranformerParmeters: MutableMap<String, Any>): String {
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/usecase/service/IXMLSerializerService.kt b/src/main/kotlin/unibz.cs.semint.kprime/usecase/service/IXMLSerializerService.kt
index f8dd2d7..faf0edc 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/usecase/service/IXMLSerializerService.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/usecase/service/IXMLSerializerService.kt
@@ -1,9 +1,6 @@
 package unibz.cs.semint.kprime.usecase.service
 
-import unibz.cs.semint.kprime.domain.ChangeSet
-import unibz.cs.semint.kprime.domain.Constraint
-import unibz.cs.semint.kprime.domain.Database
-import unibz.cs.semint.kprime.domain.Table
+import unibz.cs.semint.kprime.domain.*
 
 interface IXMLSerializerService {
     fun serializeTable(table: Table): String
@@ -17,4 +14,6 @@ interface IXMLSerializerService {
     fun serializeChangeSet(changeset: ChangeSet): String
     fun deserializeChangeSet(changeset: String): ChangeSet
     fun prettyChangeSet(table: ChangeSet): String
+    fun serializeTransfomer(transformer: Transformer): String
+    fun deserializeTransformer(transformer: String): Transformer
 }
\ No newline at end of file
diff --git a/src/test/kotlin/unibz.cs.semint.kprime/domain/TransfomerTest.kt b/src/test/kotlin/unibz.cs.semint.kprime/domain/TransfomerTest.kt
new file mode 100644
index 0000000..0751281
--- /dev/null
+++ b/src/test/kotlin/unibz.cs.semint.kprime/domain/TransfomerTest.kt
@@ -0,0 +1,38 @@
+package unibz.cs.semint.kprime.domain
+
+import org.junit.Test
+import unibz.cs.semint.kprime.adapter.service.XMLSerializerJacksonAdapter
+import unibz.cs.semint.kprime.usecase.XMLSerializeUseCase
+
+class TransfomerTest {
+
+    @Test
+    fun test_empty_trasfomer_xml(){
+
+        // given
+        val transformer = Transformer()
+        // when
+        val serializedTransformer = XMLSerializeUseCase(XMLSerializerJacksonAdapter()).serializeTransformer(transformer)
+        // then
+        println(serializedTransformer)
+
+    }
+
+
+    @Test
+    fun test_vsplit_trasfomer_xml(){
+
+        // given
+        val transformer = Transformer()
+        val xrule = Xrule()
+        xrule.name="all"
+        xrule.rule="/database/schema/tables/tables[@name='%%table%%']/columns/columns/@name = 4"
+        transformer.splitter.xman.xrules.add(xrule)
+        // when
+        val serializedTransformer = XMLSerializeUseCase(XMLSerializerJacksonAdapter()).serializeTransformer(transformer)
+        // then
+        println(serializedTransformer)
+
+    }
+
+}
\ No newline at end of file
diff --git a/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonTransfomerScenarioTI.kt b/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonTransfomerScenarioTI.kt
new file mode 100644
index 0000000..004db18
--- /dev/null
+++ b/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonTransfomerScenarioTI.kt
@@ -0,0 +1,56 @@
+package unibz.cs.semint.kprime.scenario
+
+import org.junit.Test
+import unibz.cs.semint.kprime.adapter.service.XMLSerializerJacksonAdapter
+import unibz.cs.semint.kprime.domain.Xrule
+import unibz.cs.semint.kprime.usecase.XMLSerializeUseCase
+import unibz.cs.semint.kprime.usecase.XPathTransformUseCase
+import java.io.OutputStreamWriter
+import java.util.*
+
+class PersonTransfomerScenarioTI {
+
+    @Test
+    fun test_xpath_vertical_decomposition_on_person_db() {
+        // given
+        val dbFilePath = "db/person.xml"
+        val transfomerXml = PersonTransfomerScenarioTI::class.java.getResource("/transformer/verticalTransfomer.xml").readText()
+        val vTransfomer = XMLSerializeUseCase(XMLSerializerJacksonAdapter()).deserializeTransformer(transfomerXml).ok
+        val templateFilePath = vTransfomer!!.splitter.template.filename
+        val xrules = toProperties(vTransfomer!!.splitter.xman.xrules)
+        val tranformerParmeters = mutableMapOf<String,Any>()
+        tranformerParmeters["table"]="person"
+        println(templateFilePath)
+        // when
+        XPathTransformUseCase().transform(dbFilePath, templateFilePath, xrules,tranformerParmeters, OutputStreamWriter(System.out))
+        // then
+        // print to console output
+    }
+
+    private fun toProperties(xrules: ArrayList<Xrule>): Properties {
+        var pros = Properties()
+        for (xrule in xrules) {
+            pros[xrule.name]=xrule.rule
+        }
+        return pros
+    }
+
+    @Test
+    fun test_xpath_horizontal_decomposition_on_person_db() {
+        /*
+        // given
+        val dbFilePath = "db/person.xml"
+        val trasformerName = "horizontal"
+        val trasformerDirection = "decompose"
+        val trasformerVersion = "1"
+        val tranformerParmeters = mutableMapOf<String,Any>()
+        tranformerParmeters["table"]="person"
+        // when
+        XPathTransformUseCase().transform(dbFilePath, trasformerName, trasformerDirection, trasformerVersion,tranformerParmeters,OutputStreamWriter(System.out))
+        // then
+        // print to console output
+         */
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonXPathScenarioTI.kt b/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonXPathScenarioTI.kt
index cf29a81..aba5675 100644
--- a/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonXPathScenarioTI.kt
+++ b/src/test/kotlin/unibz.cs.semint.kprime/scenario/PersonXPathScenarioTI.kt
@@ -2,6 +2,7 @@ package unibz.cs.semint.kprime.scenario
 
 import org.junit.Test
 import unibz.cs.semint.kprime.usecase.XPathTransformUseCase
+import java.io.OutputStreamWriter
 
 class PersonXPathScenarioTI {
 
@@ -15,7 +16,7 @@ class PersonXPathScenarioTI {
         val tranformerParmeters = mutableMapOf<String,Any>()
         tranformerParmeters["table"]="person"
         // when
-        XPathTransformUseCase().transform(dbFilePath, trasformerName, trasformerDirection, trasformerVersion,tranformerParmeters)
+        XPathTransformUseCase().transform(dbFilePath, trasformerName, trasformerDirection, trasformerVersion,tranformerParmeters, OutputStreamWriter(System.out))
         // then
         // print to console output
     }
@@ -30,7 +31,7 @@ class PersonXPathScenarioTI {
         val tranformerParmeters = mutableMapOf<String,Any>()
         tranformerParmeters["table"]="person"
         // when
-        XPathTransformUseCase().transform(dbFilePath, trasformerName, trasformerDirection, trasformerVersion,tranformerParmeters)
+        XPathTransformUseCase().transform(dbFilePath, trasformerName, trasformerDirection, trasformerVersion,tranformerParmeters,OutputStreamWriter(System.out))
         // then
         // print to console output
     }
diff --git a/src/test/resources/transformer/verticalTransfomer.xml b/src/test/resources/transformer/verticalTransfomer.xml
new file mode 100644
index 0000000..229dbfa
--- /dev/null
+++ b/src/test/resources/transformer/verticalTransfomer.xml
@@ -0,0 +1,23 @@
+<transformer name="">
+    <composer>
+        <xman>
+            <xrules>
+                <xrules name="all">/database/schema/tables/tables[@name='%%table%%']/columns/columns/@name = 4</xrules>
+            </xrules>
+        </xman>
+        <template filename=""/>
+    </composer>
+    <splitter>
+        <xman>
+            <xrules>
+                <xrules name="all">/database/schema/tables/tables[@name='%%table%%']/columns/columns/@name = 4</xrules>
+                <xrules name="keys">/database/schema/constraints/constraints[@type='PRIMARY_KEY']/source[@table='%%table%%']/columns/columns/@name > 0</xrules>
+                <xrules name="lhss">/database/schema/constraints/constraints[@type='FUNCTIONAL']/source[@table='%%table%%']/columns/columns/@name</xrules>
+                <xrules name="rhss">/database/schema/constraints/constraints[@type='FUNCTIONAL']/target[@table='%%table%%']/columns/columns/@name</xrules>
+                <xrules name="rests">- all keys lhss rhss</xrules>
+                <xrules name="table">/database/schema/tables/tables[@name='%%table%%']/@name = 1</xrules>
+            </xrules>
+        </xman>
+        <template filename="transformer/vertical/decompose/vertical_decompose_1.template"/>
+    </splitter>
+</transformer>
\ No newline at end of file
-- 
GitLab