найти и добавить дочерний узел внутреннего уровня, если запись отсутствует, используя groovy

Используя groovy, я пытаюсь прочитать файл tomcat server.xml и вставить новый тег ресурса узла, если узел <Resource name="jdbc/testDS" auth="Container" ..... > отсутствует.

Server.xml имеет иерархию как Сервер -> GlobalNamingResources -> Ресурс

Пробовал 2 способами:- 1) Чтение server.xml

  groovy.util.XmlParser parser = new groovy.util.XmlParser();
  println "tomcat.directory.path for server.xml >> " + "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml"

  def root = parser.parse( "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml" )
  datasourceToAdd = parser.parseText("<Resource name=\"jdbc/testDS\" auth=\"Container\" type=\"javax.sql.DataSource\" driverClassName=\"oracle.jdbc.OracleDriver\" url=\"jdbc:oracle:thin:@localhost:1521:ORA\" username=\"ORA_TEST\" password=\"*****\" factory=\"org.apache.commons.dbcp.BasicDataSourceFactory\" defaultAutoCommit=\"false\" maxActive=\"10\" maxIdle=\"5\" maxWait=\"30000\" whenExhaustedAction=\"1\" driver=\"oracle.jdbc.OracleDriver\"/>");

  def nodeName = root.'**'.findAll { it.name()== 'jdbc/testDS' };
  println "nodeName >>>>>>> " + nodeName;
  if(!root.'**'.findAll { it.name()== 'jdbc/testDS' })  
  {
    root.find { it.name() == 'GlobalNamingResources' }.children().add( 0, fragmentToAdd )

    String outxml = groovy.xml.XmlUtil.serialize( root )
    println outxml
  }

Проблема здесь в том, что запись данных обратно в server.xml невозможна, и условие также неверно. Если условие сделано правильно, то запись xml обратно в файл нужно сделать, не нашел как это сделать.

2) Чтение server.xml построчно и начать запись в файл, а затем вставить тег, если запись не найдена. Здесь также проблематично поставить условие.

  String cr = System.getProperty( "line.separator" );
  File webXML = new File(  "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server2.xml"  )

  try
  {
    FileInputStream fstream = new FileInputStream( "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml" );
    DataInputStream dataInputStream = new DataInputStream( fstream );
    BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( dataInputStream ) );
    String strLine;

    //Read File Line By Line
    while ( ( strLine = bufferedReader.readLine() ) != null )
    {
    println ">>>>>" + strLine;
    if(!strLine.contains("jdbc/testDS"))
    {
      webXML.append( strLine + cr );
    }
  }
  dataInputStream.close();
  AntBuilder ant = new AntBuilder()
  ant.move(file:  "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server2.xml" , tofile:  "C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml" );
  }
  catch ( Exception e )
  {//Catch exception if any
    println( "Error: " + e.getMessage() );
  }

Два подхода, которые я пробовал, не дадут желаемого результата. Есть идеи, как этого добиться?


person Ashish    schedule 12.11.2012    source источник


Ответы (1)


Разве findAll не должно быть:

root.'**'.findAll { it.name() == 'Resource' && it.@name == 'jdbc/testDS' }

Итак, чтобы сделать ваш первый фрагмент немного более «заводным», вы получите:

new XmlParser().with { parser ->
  def root = parser.parse( 'C:/Program Files/Apache Software Foundation/Tomcat 5.5/conf/server.xml' )
  String frag = '''<Resource name="jdbc/testDS"
                  |          auth="Container"
                  |          type="javax.sql.DataSource"
                  |          driverClassName="oracle.jdbc.OracleDriver"
                  |          url="jdbc:oracle:thin:@localhost:1521:ORA"
                  |          username="ORA_TEST"
                  |          password="*****"
                  |          factory="org.apache.commons.dbcp.BasicDataSourceFactory"
                  |          defaultAutoCommit="false"
                  |          maxActive="10"
                  |          maxIdle="5"
                  |          maxWait="30000"
                  |          whenExhaustedAction="1"
                  |          driver="oracle.jdbc.OracleDriver"/>'''.stripMargin()
  def fragment = parser.parseText( frag );

  if( !root.'**'[email protected] { it == 'jdbc/testDS' } ) {
    root.find { it.name() == 'GlobalNamingResources' }.children() << fragment
    String outxml = groovy.xml.XmlUtil.serialize( root )
    println outxml
  }
}
person tim_yates    schedule 12.11.2012
comment
Спасибо, Тим, это работает. Но как я могу записать новую запись обратно в server.xml, приведенный выше код используется для отображения вставленной записи. Следует ли заменить содержимое server.xml содержимым переменной outxml. Или вставить одну строчку в server.xml. - person Ashish; 15.11.2012