blob: d45d865d97c4c5bec38f465cfab754f96e30a56b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.ws.internal.axis.creation.ui.command;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jst.j2ee.web.componentcore.util.WebArtifactEdit;
import org.eclipse.jst.j2ee.webapplication.Servlet;
import org.eclipse.jst.j2ee.webapplication.ServletMapping;
import org.eclipse.jst.j2ee.webapplication.ServletType;
import org.eclipse.jst.j2ee.webapplication.WebApp;
import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
import org.eclipse.jst.ws.internal.axis.creation.ui.AxisCreationUIMessages;
import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.environment.IEnvironment;
import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.ws.internal.wsrt.WebServiceInfo;
public class UpdateWEBXMLCommand extends AbstractDataModelOperation {
private IProject serverProject;
private WebServiceInfo wsInfo;
public UpdateWEBXMLCommand( )
{
}
public UpdateWEBXMLCommand(WebServiceInfo wsInfo)
{
this.wsInfo = wsInfo;
}
public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable )
{
IEnvironment environment = getEnvironment();
if (serverProject != null) {
IStatus status = null;
status = addServlet(serverProject, getAxisServletDescriptor(), monitor, false);
if (status.getSeverity() == Status.ERROR) {
environment.getStatusHandler().reportError(status);
return status;
}
if (status.getSeverity() == Status.ERROR) {
environment.getStatusHandler().reportError(status);
return status;
}
addServlet(serverProject, getAdmintServletDescriptor(), monitor, true);
if (status.getSeverity() == Status.ERROR) {
environment.getStatusHandler().reportError(status);
return status;
}
}
return Status.OK_STATUS;
}
private ServletDescriptor getAxisServletDescriptor() {
ServletDescriptor sd = new ServletDescriptor();
sd._name = "AxisServlet"; //$NON-NLS-1$
sd._displayName = "Apache-Axis Servlet"; //$NON-NLS-1$
sd._className = "org.apache.axis.transport.http.AxisServlet"; //$NON-NLS-1$
sd._mappings = new String[] { "/servlet/AxisServlet", //$NON-NLS-1$
"*.jws", //$NON-NLS-1$
"/services/*" }; //$NON-NLS-1$
return sd;
}
private ServletDescriptor getAdmintServletDescriptor() {
ServletDescriptor sd = new ServletDescriptor();
sd._name = "AdminServlet"; //$NON-NLS-1$
sd._displayName = "Axis Admin Servlet"; //$NON-NLS-1$
sd._className = "org.apache.axis.transport.http.AdminServlet"; //$NON-NLS-1$
sd._mappings = new String[] { "/servlet/AdminServlet" }; //$NON-NLS-1$
sd._loadOnStartup = new Integer(100);
return sd;
}
public IStatus addServlet(
IProject webProject,
ServletDescriptor servletDescriptor) {
return addServlet(webProject, servletDescriptor, new NullProgressMonitor(), false);
}
private IStatus addServlet(
IProject webProject,
ServletDescriptor servletDescriptor,
IProgressMonitor monitor,
boolean restart) {
WebArtifactEdit webEdit = null;
try {
//
WebApp webapp = null;
IVirtualComponent vc = ComponentCore.createComponent(webProject);
webEdit = WebArtifactEdit.getWebArtifactEditForWrite(vc);
if (webEdit != null)
{
webapp = (WebApp) webEdit.getDeploymentDescriptorRoot();
boolean foundServlet = false;
List theServlets = webapp.getServlets();
for (int i = 0; i < theServlets.size(); i++) {
Servlet aServlet = (Servlet) theServlets.get(i);
if (aServlet.getServletName().equals(servletDescriptor._name)) {
foundServlet = true;
}
}
if (foundServlet) {
return Status.OK_STATUS;
}
WebapplicationFactory factory = WebapplicationFactory.eINSTANCE;
Servlet servlet = factory.createServlet();
ServletType servletType = factory.createServletType();
servlet.setWebType(servletType);
servlet.setServletName(servletDescriptor._name);
servletType.setClassName(servletDescriptor._className);
if(servletDescriptor._displayName != null){
servlet.setDisplayName(servletDescriptor._displayName);
}
if(servletDescriptor._loadOnStartup != null){
servlet.setLoadOnStartup(servletDescriptor._loadOnStartup);
}
if(servletDescriptor._params != null){
Properties properties = servlet.getParamsAsProperties();
properties.putAll(servletDescriptor._params);
}
webapp.getServlets().add(servlet);
if(servletDescriptor._mappings != null){
for(int i=0; i<servletDescriptor._mappings.length; i++){
ServletMapping servletMapping = factory.createServletMapping();
servletMapping.setServlet(servlet);
servletMapping.setUrlPattern(servletDescriptor._mappings[i]);
webapp.getServletMappings().add(servletMapping);
}
}
webEdit.save(new NullProgressMonitor());
}
// TODO: The following snippet of code is to restart the server
// after web.xml gets updated with the Axis Admin servlet.
// Ideally, we do NOT need this because the base framework should
// handle the restart for us. However, we found that the Tomcat
// server is over reporting whether it needs to be restarted or not.
// For example, if you put a .java file in a Web module, Tomcat
// will say, I need to be restarted. To prevent restarting of
// servers every time we generate a Web service, the base framewrok
// made the restart condition to be more restrictive. That is,
// not only does the server has to say it needs to be restarted, it
// also have to say it needs to be re-published. A side effect of the
// more restrictive condition is that, web.xml changes will not
// cause a server restart. The following piece of code is to
// workaround the problem reported in bug 118099. For more information, see comments
// in org.eclipse.jst.ws.internal.consumption.ui.command.StartServerCommand
if (restart && wsInfo != null)
{
String serverInstanceId = wsInfo.getServerInstanceId();
if (serverInstanceId != null)
{
IServer server = ServerCore.findServer(serverInstanceId);
if (server != null && server.getServerState() == IServer.STATE_STARTED && server.getServerRestartState())
{
server.publish(IServer.PUBLISH_INCREMENTAL, monitor);
server.synchronousRestart(ILaunchManager.RUN_MODE, monitor);
}
}
}
return Status.OK_STATUS;
} catch (Exception e) {
return StatusUtils.errorStatus(
AxisCreationUIMessages.MSG_ERROR_UPDATE_WEB_XML,
e);
}
finally{
if (webEdit != null)
webEdit.dispose();
}
}
public void setServerProject(IProject serverProject)
{
this.serverProject = serverProject;
}
public class ServletDescriptor {
String _name;
String _className;
String _displayName;
Map _params;
String[] _mappings;
Integer _loadOnStartup;
}
}