Révision 3478

TXM/trunk/org.txm.groovy.core/src/groovy/org/txm/macro/xml/StructurePropertiesInjectionMacro.groovy (revision 3478)
1
// Copyright © 2022 MY_INSTITUTION
2
// Licensed under the terms of the GNU General Public License version 3 (http://www.gnu.org/licenses/gpl-3.0.html)
3
// @author mdecorde
4

  
5
// STANDARD DECLARATIONS
6
package org.txm.macro
7

  
8
import org.kohsuke.args4j.*
9
import groovy.transform.Field
10
import org.txm.rcp.swt.widget.parameters.*
11

  
12
// BEGINNING OF PARAMETERS
13

  
14
@Field @Option(name="tableFile", usage="Table File (CSV, ODS or XLSX)", widget="FileOpen", required=true, def="table.ods")
15
def tableFile
16

  
17
@Field @Option(name="xmlFilesDirectory", usage="directory of the XML files to patch", widget="Folder", required=false, def="xmlfilesdirectory")
18
def xmlFilesDirectory
19

  
20
@Field @Option(name="debug", usage="an example boolean", widget="Boolean", required=false, def="true")
21
def debug
22

  
23
// Open the parameters input dialog box
24
if (!ParametersDialog.open(this)) return
25

  
26
// END OF PARAMETERS
27

  
28
def reader = new org.txm.utils.TableReader(tableFile);
29

  
30
if (!reader.readHeaders()) {
31
	println "No header."
32
	return false;
33
}
34
def headers = reader.getHeaders()
35
println headers
36
if (!headers.contains("join-element")) {
37
	println "No 'join-element' column"
38
	return false
39
}
40

  
41
if (!headers.contains("join-property")) {
42
	println "No 'join-property' column"
43
	return false
44
}
45

  
46
if (!headers.contains("join-value")) {
47
	println "No 'join-value' column"
48
	return false
49
}
50

  
51
if (!headers.contains("value")) {
52
	println "No 'value' column"
53
	return false
54
}
55

  
56
if (!headers.contains("property")) {
57
	println "No 'property' column"
58
	return false
59
}
60

  
61
def replacements = []
62
while (reader.readRecord()) {
63

  
64
	def record = reader.getRecord()
65
	def joinElement = record["join-element"]
66
	def joinProperty = record["join-property"]
67
	def joinValue = record["join-value"]
68
	def property = record["property"]
69
	def value = record["value"]
70
	
71
	if (joinElement.length() > 0 && joinProperty.length() > 0 && joinValue.length() > 0 && property.length() > 0 && value.length() > 0) {
72
		println "add: "+reader.getRecord()
73
		replacements << reader.getRecord()
74
	}
75
}
76
reader.close()
77

  
78
for (def xmlFile : xmlFilesDirectory.listFiles()) {
79

  
80
	if (!xmlFile.isFile()) continue;
81
	
82
	if (debug) println "text $xmlFile"
83
	
84
	def parser = new groovy.util.XmlParser()
85
	parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)
86
	parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
87
	def doc = parser.parse(xmlFile)
88
	
89
	for (def replacement : replacements) {
90
		if (debug) println " replacement $replacement"
91
		def joinElement = replacement["join-element"]
92
		def joinProperty = replacement["join-property"]
93
		def joinValue = replacement["join-value"]
94
		def property = replacement["property"]
95
		def value = replacement["value"]
96
	
97
		def toPatch = doc.'**'.find { element ->
98
			
99
			if (element instanceof groovy.util.Node 
100
				&& element.name().matches(joinElement) 
101
				&& element["@$joinProperty"] != null
102
				&& element["@$joinProperty"].matches(joinValue)) {
103
				
104
    				if (debug) println "  patch ${element.name()} with $property=$value"
105
    				element["@$property"] = value
106
    		}
107
		}
108
	}
109
	
110
	groovy.xml.XmlUtil.serialize(doc, xmlFile.newWriter())
111
}
112

  

Formats disponibles : Unified diff