/*
* Copyright (C) 2014 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.errai.forge.facet.resource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import org.jboss.errai.forge.facet.plugin.WarPluginFacet;
import org.jboss.errai.forge.xml.ElementFactory;
import org.jboss.forge.addon.facets.constraints.FacetConstraint;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* This facet configures the ErraiServlet used by the errai-bus project.
*
* @author Max Barkley <mbarkley@redhat.com>
*/
@FacetConstraint({ WebXmlFacet.class })
public class ErraiBusServletConfigFacet extends AbstractXmlResourceFacet {
public static final String webXmlRootExpression = "/web-app";
@Override
protected Map<XPathExpression, Collection<Node>> getElementsToInsert(final XPath xPath, final ElementFactory elemFactory)
throws ParserConfigurationException, XPathExpressionException {
final Element servlet = elemFactory.createElement("servlet");
servlet.appendChild(elemFactory.createElement("servlet-name")).setTextContent("ErraiServlet");
servlet.appendChild(elemFactory.createElement("servlet-class")).setTextContent(
"org.jboss.errai.bus.server.servlet.DefaultBlockingServlet");
final Node initParam = servlet.appendChild(elemFactory.createElement("init-param"));
initParam.appendChild(elemFactory.createElement("param-name")).setTextContent("auto-discover-services");
initParam.appendChild(elemFactory.createElement("param-value")).setTextContent("true");
servlet.appendChild(elemFactory.createElement("load-on-startup")).setTextContent("1");
final Element servletMapping = elemFactory.createElement("servlet-mapping");
servletMapping.appendChild(elemFactory.createElement("servlet-name")).setTextContent("ErraiServlet");
servletMapping.appendChild(elemFactory.createElement("url-pattern")).setTextContent("*.erraiBus");
final Map<XPathExpression, Collection<Node>> retVal = new HashMap<XPathExpression, Collection<Node>>(1);
final Collection<Node> nodes = new ArrayList<Node>(2);
nodes.add(servlet);
nodes.add(servletMapping);
retVal.put(xPath.compile(webXmlRootExpression), nodes);
return retVal;
}
@Override
protected Map<XPathExpression, Collection<Node>> getElementsToVerify(final XPath xPath, final ElementFactory elemFactory)
throws ParserConfigurationException, XPathExpressionException {
final Map<XPathExpression, Collection<Node>> retVal = getElementsToInsert(xPath, elemFactory);
/*
* Remove the param-value for auto-discover-services for the purpose of
* verifying that this facet is installed. This is so that if CdiWebXmlFacet
* has been installed (and thus has overwritten this value with "false",
* this facet will still register as installed.
*/
outer: for (final Node node : retVal.entrySet().iterator().next().getValue()) {
if (node.getNodeName().equals("servlet")) {
final Element servlet = (Element) node;
final NodeList values = servlet.getElementsByTagName("param-value");
for (int i = 0; i < values.getLength(); i++) {
final Node prevSibling = values.item(i).getPreviousSibling();
if (prevSibling != null && prevSibling.getNodeValue() != null) {
values.item(i).getParentNode().removeChild(values.item(i));
break outer;
}
}
}
}
return retVal;
}
@Override
protected Map<XPathExpression, Node> getReplacements(final XPath xPath, final ElementFactory elemFactory) {
return new HashMap<XPathExpression, Node>(0);
}
@Override
protected String getRelPath() {
return WarPluginFacet.getWarSourceDirectory(getProject()) + "/WEB-INF/web.xml";
}
@Override
protected Map<XPathExpression, Node> getRemovalMap(final XPath xPath, final ElementFactory elemFactory)
throws ParserConfigurationException, XPathExpressionException {
return new HashMap<XPathExpression, Node>(0);
}
}