2013-10-04 1 views
0

Groovy를 사용하여 XML 파일을 동적으로 작성하려고합니다. 모든 것이 작동하는 단순함에 만족하지만 클로저와 대리인 뒤에있는 전체 메커니즘을 이해하는 데 어려움을 겪고 있습니다. 고정 된 이름으로 속성과 자식 노드를 추가하는 것은 쉬운 것처럼 보이지만 동적 이름을 가진 노드를 추가하는 것은 특별한 경우 인 것처럼 보입니다.StreamingMarkupBuilder를 사용하여 Groovy에서 노드를 XML에 동적으로 추가하는 방법

본 사례에서는 CQ5에서 사용할 수있는 _rep_policy 파일을 작성하고 있습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" 
      jcr:primaryType="rep:ACL"> 
    <allow 
     jcr:primaryType="rep:GrantACE" 
     rep:principalName="administrators" 
     rep:privileges="{Name}[jcr:all]"/> 
    <allow0 
     jcr:primaryType="rep:GrantACE" 
     rep:principalName="contributor" 
     rep:privileges="{Name}[jcr:read]"/> 
</jcr:root> 

컬렉션을 처리하는 것은 잘 작동하지만 이름을 생성하는 ...

수입 groovy.xml.StreamingMarkupBuilder 수입 groovy.xml.XmlUtil

def _rep_policy_files = [ 
    '/content': [ // the path 
     'deny': [ // permission 
      'jcr:read': [ // action 
       'a1', 'b2']], // groups 
     'allow': [ 
      'jcr:read, jcr:write': [ 
       'c2'] 
     ] 
    ] 
] 

def getNodeName(n, i) { 
    (i == 0) ? n : n + (i - 1) 
} 

_rep_policy_files.each { 
    path, permissions -> 
    def builder = new StreamingMarkupBuilder(); 

    builder.encoding = "UTF-8"; 

    def p = builder.bind { 
     mkp.xmlDeclaration() 

     namespaces << [ 
      jcr: 'http://www.jcp.org/jcr/1.0', 
      rep: 'internal' 
     ] 

     'jcr:root'('jcr:primaryType': 'rep:ACL') { 
     permissions.each { 
      permission, actions -> 
      actions.each { 
       action, groups -> 
       groups.eachWithIndex { 
        group, index -> 
        def nodeName = getNodeName(permission, index) 
        "$nodeName"(
         'jcr:primaryType': 'rep:GrantACE', 
         'rep:principalName': "$group", 
         'rep:privileges': "{Name}[$action]") 
       } 
      } 
     } 
     } 
    } 

    print(XmlUtil.serialize(p)) 
} 
+0

'_rep_policy_files'에있는 내용과 결과 XML이 어떻게 같아야합니까? – dmahapatro

+0

스크립트 위를 보면 xml 예제가 있습니다. –

답변

1

이 뭔가 (또는 유사한인가) 찾고 계십니까? 질문에 표시된

'jcr:root'('jcr:primaryType': 'rep:ACL') { 
    _rep_policy_files['/content'].each {k, v -> 
     if(k == 'allow') 
      "$k"('jcr:primaryType': 'rep:GrantACE', 
       'rep:principalName': 'administrators', 
       'rep:privileges': "$v" ){} 
     if(k == 'deny') 
      "$k"('jcr:primaryType': 'rep:GrantACE', 
       'rep:principalName': 'contributor', 
       'rep:privileges': "$v" ){} 
    } 
} 

생성 된 XML은 사용자가 _rep_policy_files이 무엇인지 제대로 체포 할 수 없습니다.

+0

감사합니다. 해결책을 찾았습니다. XML 파일은 추가 메서드 및 물론 더 많은 루프를 사용하여 생성 할 수 있습니다. –