I have a web.xml with around 10 servlets defined with some basic configuration such as below:
<servlet>
<servlet-name>dummyServlet</servlet-name>
<servlet-class>com.abc.Servlet</servlet-class>
<init-param>
<param-name>target</param-name>
<param-value>foo.com</param-value>
</init-param>
<init-param>
<param-name>log</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dummyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>dummyServlet2</servlet-name>
<servlet-class>com.abc.Servlet2</servlet-class>
<init-param>
<param-name>target</param-name>
<param-value>foo.com</param-value>
</init-param>
<init-param>
<param-name>log</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dummyServlet2</servlet-name>
<url-pattern>/dummy</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>actualServlet</servlet-name>
<servlet-class>com.abc.ActualServlet</servlet-class>
<init-param>
<param-name>target</param-name>
<param-value>foo.com</param-value>
</init-param>
<init-param>
<param-name>log</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dummyServlet</servlet-name>
<url-pattern>/actual</url-pattern>
</servlet-mapping>
Now, from my ant target, based on some conditions, I need to remove both dummy-servlets along with their mappings but need to retain the actual-servlet and it's mapping. Can someone please suggest what would be the best/easy way to do that?
Should I use ant <replace>
or xmltask or some other feature?
Replacing the entire web.xml is not an option.
I took a liberty, and added a root element to the provided XML to make it well-formed.
Please try the following solution via XSLT.
The XSLT is using so called Identity Transform pattern.
You would need to modify two templates for your real XML: and provide a list of dummy Servlets to be removed.
Everything else outside of the dummy Servlets will be kept intact.
Please remember that XML is case sensitive, including actual values.
Input XML
<root>
<servlet>
<servlet-name>dummyServlet</servlet-name>
<servlet-class>com.abc.Servlet</servlet-class>
<init-param>
<param-name>target</param-name>
<param-value>foo.com</param-value>
</init-param>
<init-param>
<param-name>log</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dummyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>dummyServlet2</servlet-name>
<servlet-class>com.abc.Servlet2</servlet-class>
<init-param>
<param-name>target</param-name>
<param-value>foo.com</param-value>
</init-param>
<init-param>
<param-name>log</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dummyServlet2</servlet-name>
<url-pattern>/dummy</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>actualServlet</servlet-name>
<servlet-class>com.abc.ActualServlet</servlet-class>
<init-param>
<param-name>target</param-name>
<param-value>foo.com</param-value>
</init-param>
<init-param>
<param-name>log</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dummyServlet</servlet-name>
<url-pattern>/actual</url-pattern>
</servlet-mapping>
</root>
XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="servlet[servlet-name=('dummyServlet','dummyServlet2')]">
</xsl:template>
<xsl:template match="servlet-mapping[servlet-name=('dummyServlet','dummyServlet2')]">
</xsl:template>
</xsl:stylesheet>
Output XML
<root>
<servlet>
<servlet-name>actualServlet</servlet-name>
<servlet-class>com.abc.ActualServlet</servlet-class>
<init-param>
<param-name>target</param-name>
<param-value>foo.com</param-value>
</init-param>
<init-param>
<param-name>log</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
</root>