0

Have such a requirement:

Insert the following servelet into web.xml if not already there:

  <servlet>
   <description>My Servlet</description>
   <servlet-name>myServlet</servlet-name>
   <servlet-class>com.tom.servlet.MyServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/servlet/myServlet/*</url-pattern>
  </servlet-mapping>

I am using XMLTask in my ant script

Tried the following script,but failed:

<xmltask source="${env.My_HOME}/WEB-INF/web.xml" dest="${env.My_HOME}/WEB-INF/web.xml" report="false">
        <copy property="servletfound" path="/web-app/servlet[servlet-name='myServlet']/text()" />
        <insert unless="servletfound" path="/web-app/servlet[last()]" position="after">
            <![CDATA[
            <servlet>
   <description>My Servlet</description>
   <servlet-name>myServlet</servlet-name>
   <servlet-class>com.tom.servlet.MyServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/servlet/myServlet/*</url-pattern>
  </servlet-mapping>
        ]]>
        </insert>
    </xmltask>

My question is how to detect that servlet is there or not, because I should avoid to insert twice. Sounds my xpath grammar is not correct. Please help.

Tom
  • 2,857
  • 9
  • 46
  • 59

1 Answers1

0

The Xpath you tried :

/web-app/servlet[servlet-name='myServlet']/text()

...return text nodes that is direct child of <servlet>, which doesn't exist in the XML sample posted. If you meant to return text nodes that is direct child of <servlet-name> instead, the XPath should've been something like this :

/web-app/servlet/servlet-name[.='myServlet']/text()
har07
  • 88,338
  • 12
  • 84
  • 137