Skip to content
Snippets Groups Projects
Commit e776f26d authored by npedot's avatar npedot
Browse files

splits XPathTransformer to compute and availability

parent 5447d1af
No related branches found
No related tags found
No related merge requests found
......@@ -123,22 +123,61 @@ class XPathTransformUseCase {
xPaths: Properties,
tranformerParmeters: MutableMap<String, Any>)
: ChangeSet {
val dbInputStream : InputStream = FileIOService.inputStreamFromPath(dbFilePath)
val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
val doc = docBuilder.parse(dbInputStream)
val pair = getTemplateModel(dbFilePath, xPaths, tranformerParmeters)
val templModel = pair.first
var violation = pair.second
if (!violation.isEmpty()) {
println("Condition Failure")
return ChangeSet()
}
println("22++++++++++++++++++++++++++++++++++++++++++-------------------------------")
// extract vars as value attributes via xpaths
// use vars in template
val templConfig = Configuration(Configuration.VERSION_2_3_29)
val classTemplLoader = ClassTemplateLoader(XPathTransformUseCase::javaClass.javaClass, "/")
templConfig.templateLoader = classTemplLoader
val templModel = mutableMapOf<String, List<String>>()
lateinit var templ : Template
if (templateFilePath.startsWith("/")||
templateFilePath.startsWith("./")) {
templ = Template.getPlainTextTemplate("template1",
File(templateFilePath).readText(Charsets.UTF_8), templConfig)
val lastSlash = templateFilePath.lastIndexOf("/")
val templateDir = templateFilePath.substring(0,lastSlash)
val templateFileName = templateFilePath.substring(lastSlash)
//templConfig.setDirectoryForTemplateLoading(File("/home/nipe/Temp/kprime/transformers/vertical/decompose/"))
//templ = templConfig.getTemplate("vertical_decompose_1_changeset.xml")
println("${templateDir}:${templateFileName}")
templConfig.setDirectoryForTemplateLoading(File(templateDir))
templ = templConfig.getTemplate(templateFileName)
} else {
templ = templConfig.getTemplate(templateFilePath)
}
val outWriter = StringWriter()
templ.process(templModel, outWriter)
println("33++++++++++++++++++++++++++++++++++++++++++-------------------------------")
val changeSetXml = outWriter.buffer.toString()
println(changeSetXml)
println("44++++++++++++++++++++++++++++++++++++++++++-------------------------------")
val serializer = XMLSerializerJacksonAdapter()
val changeSet = XMLSerializeUseCase(serializer).deserializeChangeSet(changeSetXml).ok ?: ChangeSet()
println("55++++++++++++++++++++++++++++++++++++++++++-------------------------------")
return changeSet
}
fun getTemplateModel(dbFilePath: String, xPaths: Properties, tranformerParmeters: MutableMap<String, Any>): Pair<MutableMap<String, List<String>>, String> {
val templModel = mutableMapOf<String, List<String>>()
// compute xpath lists
val dbInputStream: InputStream = FileIOService.inputStreamFromPath(dbFilePath)
val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
val doc = docBuilder.parse(dbInputStream)
val xpath = XPathFactory.newInstance().newXPath()
var goon = true
var violation = ""
for (entryNameas in xPaths.propertyNames()) {
val name = entryNameas as String
val pathTokens = xPaths.getProperty(name).split(" ")
......@@ -147,22 +186,18 @@ class XPathTransformUseCase {
templModel[name] = asValueList(xpath.compile(value).evaluate(doc, XPathConstants.NODESET) as NodeList)
println(" ${name} = ${value}")
println(" ${name} = ${templModel[name]}")
tranformerParmeters[name]=templModel[name]!![0]
tranformerParmeters[name] = templModel[name]!![0]
if (pathTokens.size == 3) {
println(pathTokens)
val pathCondition = pathTokens[1]
val pathSize = pathTokens[2].toInt()
if (pathCondition == ">")
if ((templModel[name])!!.size <= pathSize) goon = false
if ((templModel[name])!!.size <= pathSize) violation = "violation: ${templModel[name]} size <= ${pathSize}"
if (pathCondition == "=")
if ((templModel[name])!!.size != pathSize) goon = false
if ((templModel[name])!!.size != pathSize) violation = "violation: ${templModel[name]} size != ${pathSize}"
}
}
}
if (!goon) {
println("Condition Failure")
return ChangeSet()
}
// adds all input parameters as template parameters
for (parCouple in tranformerParmeters) {
templModel.put(parCouple.key, listOf(parCouple.value.toString()))
......@@ -176,39 +211,6 @@ class XPathTransformUseCase {
templModel[name] = computeDerivedList(templModel, value)
}
}
// compute list conditions
// = = 3 xpath
// = > 0 xpath
// = = 0 xpath
println("22++++++++++++++++++++++++++++++++++++++++++-------------------------------")
lateinit var templ : Template
if (templateFilePath.startsWith("/")||
templateFilePath.startsWith("./")) {
templ = Template.getPlainTextTemplate("template1",
File(templateFilePath).readText(Charsets.UTF_8), templConfig)
val lastSlash = templateFilePath.lastIndexOf("/")
val templateDir = templateFilePath.substring(0,lastSlash)
val templateFileName = templateFilePath.substring(lastSlash)
//templConfig.setDirectoryForTemplateLoading(File("/home/nipe/Temp/kprime/transformers/vertical/decompose/"))
//templ = templConfig.getTemplate("vertical_decompose_1_changeset.xml")
println("${templateDir}:${templateFileName}")
templConfig.setDirectoryForTemplateLoading(File(templateDir))
templ = templConfig.getTemplate(templateFileName)
} else {
templ = templConfig.getTemplate(templateFilePath)
}
val outWriter = StringWriter()
templ.process(templModel, outWriter)
println("33++++++++++++++++++++++++++++++++++++++++++-------------------------------")
val changeSetXml = outWriter.buffer.toString()
println(changeSetXml)
println("44++++++++++++++++++++++++++++++++++++++++++-------------------------------")
val serializer = XMLSerializerJacksonAdapter()
val changeSet = XMLSerializeUseCase(serializer).deserializeChangeSet(changeSetXml).ok ?: ChangeSet()
println("55++++++++++++++++++++++++++++++++++++++++++-------------------------------")
return changeSet
return Pair(templModel, violation)
}
}
\ No newline at end of file
......@@ -9,6 +9,7 @@ import unibz.cs.semint.kprime.usecase.common.ApplyChangeSetUseCase
import unibz.cs.semint.kprime.usecase.common.XPathTransformUseCase
import unibz.cs.semint.kprime.usecase.service.FileIOService
import unibz.cs.semint.kprime.usecase.service.IXMLSerializerService
import java.io.FileInputStream
import java.io.FileReader
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
......@@ -35,29 +36,36 @@ class TransformerXUseCase(
val decoXPathsFilePath:String,
val coTemplateFilePath:String,
val coXPathsFilePath:String,
val traceName:String,
val name:String)
: TransformerUseCase {
private val xpathTransform = XPathTransformUseCase()
override fun decompose(db: Database, params: Map<String, Any>): Transformation {
lateinit var traceDir :String
if (traceName.endsWith("/")) traceDir = traceName
else traceDir = traceName + "/"
val functionals = db.schema.functionals()
if (functionals.isEmpty()) return errorTransformation(db,"ERROR: TransformerXUseCase no functionals")
val dbFilePath = fileIOAdapter.writeOnWorkingFilePath(serializer.prettyDatabase(db), workingDir + "db_worked.xml")
val dbFilePath = fileIOAdapter.writeOnWorkingFilePath(serializer.prettyDatabase(db), workingDir + traceDir + "db_worked.xml")
println("Updated db file db_worked.xml")
val xPaths = Properties()
xPaths.load(FileReader(decoXPathsFilePath))
//val changeSetFileName = workingDir + "${LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss_nnnnnnnnnn"))}_cs.xml"
val tranformerParmeters = mutableMapOf<String,Any>()
tranformerParmeters.putAll(params)
val changeSet = xpathTransform.compute(dbFilePath, docoTemplateFilePath, xPaths, tranformerParmeters)
println("Computed changeSet : $changeSet")
val changeSetFileName = workingDir + traceDir + "${LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss_nnnnnnnnnn"))}_cs.xml"
fileIOAdapter.writeOnWorkingFilePath(serializer.prettyChangeSet(changeSet), changeSetFileName)
val newdb = ApplyChangeSetUseCase(serializer).apply(db, changeSet)
val newDbFileName = workingDir + "${LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss_nnnnnnnnnn"))}_db.xml"
val newDbFileName = workingDir + traceDir + "${LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss_nnnnnnnnnn"))}_db.xml"
fileIOAdapter.writeOnWorkingFilePath(serializer.prettyDatabase(newdb), newDbFileName)
println("Written new db file : $newDbFileName")
......@@ -69,7 +77,19 @@ class TransformerXUseCase(
}
override fun decomposeApplicable(db: Database, transformationStrategy: TransformationStrategy): Applicability {
return Applicability(true,"decomposeApplicable", mutableMapOf())
val transformerParams = mutableMapOf<String,Any>()
val xPathProperties = Properties()
xPathProperties.load(FileInputStream(decoXPathsFilePath))
if (db.name.isEmpty()) return Applicability(false,"db name empty", transformerParams)
lateinit var traceDir :String
if (traceName.endsWith("/")) traceDir = traceName
else traceDir = traceName + "/"
val dbFilePath = workingDir + traceDir + db.name
val (mutableMap, violation) = xpathTransform.getTemplateModel(dbFilePath, xPathProperties, transformerParams)
return Applicability(violation.isEmpty(),"decomposeApplicable", transformerParams)
}
override fun composeApplicable(db: Database, transformationStrategy: TransformationStrategy): Applicability {
......
......@@ -40,6 +40,7 @@ class TransformerXUseCaseTI {
workingDir + "transformers/"+transformerName+"/decompose/vertical_decompose_1_paths.properties",
"",
"",
"",
transformerName)
.decompose(
db,params
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment