2016-07-15 6 views
1

Ich bin relativ neu zu groovy und verwende es im Zusammenhang mit einem Gradle Build. Also seien Sie bitte nicht hart, wenn es eine einfache Out-of-the-Box-Lösung dafür gibt.Erstellen Sie eine verschachtelte Karte aus dem Schlüssel in groovy

Grundsätzlich versuche ich die umgekehrte Return Nested Key in Groovy zu erreichen. Das heißt, ich habe einige Schlüssel aus der System.properties Karte zum Beispiel user.home und entsprechenden Werten wie C:\User\dpr gelesen. Jetzt möchte ich eine Karte erstellen, die diese Struktur reflektiert, es zu benutzen in einem groovy.text.SimpleTemplateEngine als Bindungen:

[user : [home : 'C:\Users\dpr']] 

Die Tasten können eine beliebige tiefe Hierarchie definieren. Zum Beispiel sollte java.vm.specification.vendor=Oracle Corporation werden:

[java : [vm : [spec : [vendor : 'Oracle Corporation']]]] 

Zusätzlich gibt es Eigenschaften mit den gleichen Eltern wie user.name=dpr und user.country=US:

[ 
    user: [ 
    name: 'dpr', 
    country: 'US' 
    ] 
] 

bearbeiten: Während ConfigSlurper wirklich schön ist, ist es etwas zu defensiv beim Erstellen der verschachtelten Karten, da die Verschachtelung bei der Mindesttiefe eines bestimmten Schlüssels beendet wird.

ich derzeit

def bindings = [:] 
System.properties.sort().each { 
    def map = bindings 
    def split = it.key.split("\\.") 
    for (int i = 0; i < split.length; i++) { 
    def part = split[i]; 

    // There is already a property value with the same parent 
    if (!(map instanceof Map)) { 
     println "Skipping property ${it.key}" 
     break; 
    } 

    if (!map.containsKey(part)) { 
     map[part] = [:] 
    } 

    if (i == split.length - 1) { 
     map[part] = it.value 
    } else { 
     map = map[part] 
    } 
    } 
    map = it.value 
} 

Mit dieser Lösung die Eigenschaften file.encoding.pkg mit dieser endete, java.vendor.url und java.vendor.url.bug verworfen, die ich mit nicht schön, aber etwas ist fertig.

Allerdings ist der obige Code nicht sehr groovyish.

Antwort

3

können Sie verwenden ein ConfigSlurper:

def conf = new ConfigSlurper().parse(System.properties) 
println conf.java.specification.version 
+0

Dies ist zum Teil nur zu funktionieren scheint für einige Eigenschaften die richtige Struktur für andere nicht erstellt wird: '[java: [runtime.name:Java (TM) SE Runtime Environment , runtime.version: 1.8.0_92-b14, ... ' – dpr

+0

Ich denke, dass dies mit der minimalen Tiefe eines bestimmten Eigenschaftspfades zusammenhängen kann. Es gibt 'java.home' und somit werden alle' java. * 'Einträge direkt unter dem' java' Schlüssel ohne weitere Verschachtelung erzeugt. – dpr

+1

Ja, wenn a.b einen Wert hat, kann es nicht als Map implementiert werden und es kann keinen verschachtelten Wert haben. In diesem Fall erstellt der ConfigSlurper einen verschachtelten Wert mit einem Schlüssel mit einem. Innerhalb. Zum Beispiel 'java.vendor' ist ein String, also müssen Sie mit' java ['vendor.url'] 'auf den verschachtelten Wert zugreifen.' –

Verwandte Themen