Найти и добавить дочерний узел внутреннего уровня, если запись отсутствует, используя 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() );
}
Два подхода, которые я попробовал, не дадут желаемого результата. Есть идеи как этого добиться?
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.'**'.Resource.@name.find { it == 'jdbc/testDS' } ) {
root.find { it.name() == 'GlobalNamingResources' }.children() << fragment
String outxml = groovy.xml.XmlUtil.serialize( root )
println outxml
}
}