Files
dots/JetBrains/WebStorm2025.1/extensions/com.intellij.database/data/extractors/XML-Groovy.xml.groovy
Leandro Afonso f0cdef9259 init
2025-09-27 18:39:59 +01:00

93 lines
2.8 KiB
Groovy

/*
* Available context bindings:
* COLUMNS List<DataColumn>
* ROWS Iterable<DataRow>
* OUT { append() }
* FORMATTER { format(row, col); formatValue(Object, col); getTypeName(Object, col); isStringLiteral(Object, col); }
* TRANSPOSED Boolean
* plus ALL_COLUMNS, TABLE, DIALECT
*
* where:
* DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object }
* DataColumn { columnNumber(), name() }
*/
import com.intellij.openapi.util.text.StringUtil
import java.util.regex.Pattern
NEWLINE = System.getProperty("line.separator")
pattern = Pattern.compile("[^\\w\\d]")
def escapeTag(name) {
name = pattern.matcher(name).replaceAll("_")
return name.isEmpty() || !Character.isLetter(name.charAt(0)) ? "_$name" : name
}
def printRow(level, rowTag, values) {
def prefix = "$NEWLINE${StringUtil.repeat(" ", level)}"
OUT.append("$prefix<$rowTag>")
values.each { name, col, valuesName, value ->
switch (value) {
case Map:
def mapValues = new ArrayList<Tuple>()
value.each { key, v -> mapValues.add(new Tuple(escapeTag(key.toString()), col, key.toString(), v)) }
printRow(level + 1, name, mapValues)
break
case Object[]:
case Iterable:
def listItems = new ArrayList<Tuple>()
def itemName = valuesName != null ? escapeTag(StringUtil.unpluralize(valuesName) ?: "item") : "item"
value.collect { v -> listItems.add(new Tuple(itemName, col, null, v)) }
printRow(level + 1, name, listItems)
break
default:
OUT.append("$prefix <$name>")
if (value == null) OUT.append("null")
else {
def formattedValue = FORMATTER.formatValue(value, col)
if (isXmlString(formattedValue)) OUT.append(formattedValue)
else OUT.append(StringUtil.escapeXmlEntities(formattedValue))
}
OUT.append("</$name>")
}
}
OUT.append("$prefix</$rowTag>")
}
def isXmlString(string) {
return string.startsWith("<") && string.endsWith(">") && (string.contains("</") || string.contains("/>"))
}
OUT.append(
"""<?xml version="1.0" encoding="UTF-8"?>
<data>""")
if (!TRANSPOSED) {
ROWS.each { row ->
def values = COLUMNS
.findAll { col -> row.hasValue(col) }
.collect { col ->
new Tuple(escapeTag(col.name()), col, col.name(), row.value(col))
}
printRow(0, "row", values)
}
}
else {
def values = COLUMNS.collect { new ArrayList<Tuple>() }
ROWS.eachWithIndex { row, rowIdx ->
COLUMNS.eachWithIndex { col, colIdx ->
if (row.hasValue(col)) {
def value = row.value(col)
values[colIdx].add(new Tuple("row${rowIdx + 1}", col, col.name(), value))
}
}
}
values.eachWithIndex { it, index ->
printRow(0, escapeTag(COLUMNS[index].name()), it)
}
}
OUT.append("""
</data>
""")