package org.jboss.webservice;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.jboss.deployment.DeploymentException;
import org.jboss.deployment.DeploymentInfo;
import org.jboss.logging.Logger;
import org.jboss.webservice.metadata.PortComponentMetaData;
import org.jboss.webservice.metadata.WebserviceDescriptionMetaData;
import org.jboss.webservice.metadata.WebservicesMetaData;
import org.jboss.webservice.server.ServiceEndpointServletJSE;
import org.jboss.util.xml.JBossEntityResolver;
import javax.management.ObjectName;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
public class ServiceDeployerJSE extends ServiceDeployer implements ServiceDeployerJSEMBean
{
private final Logger log = Logger.getLogger(ServiceDeployer.class);
private ObjectName warDeployer;
public void setWARDeployer(ObjectName deployerName)
{
this.warDeployer = deployerName;
}
protected void startService() throws Exception
{
super.startService();
registerNotificationListener(warDeployer);
}
protected void stopService() throws Exception
{
unregisterNotificationListener(warDeployer);
super.stopService();
}
protected URL getWebservicesDescriptor(DeploymentInfo di)
{
return di.localCl.findResource("WEB-INF/webservices.xml");
}
protected void createWebservice(DeploymentInfo di) throws DeploymentException
{
super.createWebservice(di);
WebservicesMetaData webservices = (WebservicesMetaData)webservicesMap.get(di.url);
modifyWebXML(di, webservices);
}
private void modifyWebXML(DeploymentInfo di, WebservicesMetaData webservices)
throws DeploymentException
{
if (webservices == null)
throw new DeploymentException("webservices.xml not registerd");
File warFile = new File(di.localUrl.getFile());
if (warFile.isDirectory() == false)
throw new DeploymentException("Expected a war directory: " + di.localUrl);
File webXML = new File(di.localUrl.getFile() + "/WEB-INF/web.xml");
if (webXML.isFile() == false)
throw new DeploymentException("Cannot find web.xml: " + webXML);
FileOutputStream fos = null;
try
{
SAXReader saxReader = new SAXReader();
saxReader.setEntityResolver(new JBossEntityResolver());
Document doc = saxReader.read(webXML);
if (modifyWebXMLDocument(doc, di, webservices))
{
File orgWebXML = new File(webXML.getCanonicalPath() + ".org");
orgWebXML.delete();
if (webXML.renameTo(orgWebXML) == false)
throw new DeploymentException("Cannot rename web.xml: " + orgWebXML);
OutputFormat format = OutputFormat.createPrettyPrint();
fos = new FileOutputStream(webXML);
XMLWriter writer = new XMLWriter(fos, format);
writer.write(doc);
}
}
catch (DeploymentException e)
{
throw e;
}
catch (Exception e)
{
throw new DeploymentException(e);
}
finally
{
if (fos != null)
{
try
{
fos.close();
}
catch (IOException e)
{
log.warn("Unexpected IOException on file close", e);
}
}
}
}
private boolean modifyWebXMLDocument(Document doc, DeploymentInfo di, WebservicesMetaData webservices) throws DeploymentException
{
boolean modified = false;
WebserviceDescriptionMetaData[] wsDescriptions = webservices.getWebserviceDescriptions();
for (int i = 0; i < wsDescriptions.length; i++)
{
WebserviceDescriptionMetaData wsDescription = wsDescriptions[i];
PortComponentMetaData[] portComponents = wsDescription.getPortComponents();
for (int j = 0; j < portComponents.length; j++)
{
PortComponentMetaData pcMetaData = portComponents[j];
PortComponentInfo pcInfo = new PortComponentInfo(di, pcMetaData);
String servletLink = pcMetaData.getServletLink();
if (servletLink == null)
throw new DeploymentException("Cannot find servlet-link in port-component: " + pcMetaData.getPortComponentName());
if (modifyServletConfig(doc, servletLink, pcInfo))
modified = true;
}
}
return modified;
}
protected String getServiceEndpointServletName()
{
return ServiceEndpointServletJSE.class.getName();
}
}