blob: 8972637aad9944338cfd6dd6d9ace2a352b632e9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 SAS Institute, Inc. 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:
* Larry Isaacs - Initial API and implementation
*******************************************************************************/
package org.eclipse.jst.server.tomcat.core.internal.xml.server32;
import java.net.URLEncoder;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jst.server.tomcat.core.internal.Messages;
import org.eclipse.jst.server.tomcat.core.internal.TomcatPlugin;
import org.eclipse.osgi.util.NLS;
/**
* This class represents an instance of a Tomcat 3.2, or later, server as
* defined a server.xml configuration file.
*/
public class ServerInstance {
protected Server server;
protected ContextManager contextManager;
protected IStatus status = Status.OK_STATUS;
/**
* Constructs a ServerInstance using the specified Server configuration.
* The ServerInstance provides access to Connectors and Contexts. It does
* not support interacting with Host elements under the ContextManager
* element.
*
* @param server Server configuration on which to base this instance.
*/
public ServerInstance(Server server) {
if (server == null)
throw new IllegalArgumentException("Server argument may not be null.");
this.server = server;
}
/**
* This method is used to get the problem status following
* a method call that returned <b>null</b> due to an error.
* @return Status of last method call.
*/
public IStatus getStatus() {
return status;
}
/**
* Gets the ContextManager element if one exists or will
* create a new one if it does not currently exist.
* @return Returns an existing or new ContextManger.
*/
public ContextManager getContextManager() {
status = Status.OK_STATUS;
if (contextManager == null)
contextManager = server.getContextManager();
return contextManager;
}
/**
* Gets the connector at the specified index. If a Connector
* does not exist at that index a new Connector is appended
* and returned.
*
* @param index Index of the Connector to return.
* @return Returns the Connecter at the specified index or
* a new Connector if one at that index doesn't exist.
*/
public Connector getConnector(int index) {
status = Status.OK_STATUS;
if (contextManager == null && getContextManager() == null)
return null; // Note: Can't currently occur
return contextManager.getConnector(index);
}
/**
* Gets the Connectors found in the ContextManager in the
* server configuration.
*
* @return Array of Connectors found in the ContextManger in the
* server configuration.
*/
public Connector [] getConnectors() {
status = Status.OK_STATUS;
if (contextManager == null && getContextManager() == null)
return null; // Note: Can't currently occur
int size = contextManager.getConnectorCount();
Connector [] connectors = new Connector [size];
for (int i = 0; i < size; i++) {
connectors[i] = contextManager.getConnector(i);
}
return connectors;
}
/**
* Gets the Context that has the specified path within the selected
* Host. This method will return <b>null</b> if the Context with the
* required path is not found in the server configuration.
*
* @param contextPath Path of the Context to be returned. A leading '/' is optional.
* @return Returns the Context whose <b>path</b> attribute matches
* the specified contextPath. Returns <b>null</b> if the Context with
* the required path is not found.
*/
public Context getContext(String contextPath) {
status = Status.OK_STATUS;
if (contextManager == null && getContextManager() == null)
return null; // Note: Can't currently occur
if (contextPath != null && contextPath.length() > 0 && !contextPath.startsWith("/"))
contextPath = "/" + contextPath;
int size = contextManager.getContextCount();
for (int i = 0; i < size; i++) {
Context ctx = contextManager.getContext(i);
if (ctx.getPath().equals(contextPath)) {
return ctx;
}
}
status = new Status(IStatus.ERROR,TomcatPlugin.PLUGIN_ID,
NLS.bind(Messages.errorXMLContextNotFoundPath32, contextPath));
return null;
}
/**
* Gets the Context at the specified index. If a Connector does not
* exist at the specified index, a new Context will be appended and
* returned.
*
* @param index Index of the Context to return.
* @return Returns the Context at the specified index, or
* a new appended Context if the index is beyond any existing
* Contexts.
*/
public Context getContext(int index) {
status = Status.OK_STATUS;
if (contextManager == null && getContextManager() == null)
return null; // Note: Can't currently occur
return contextManager.getContext(index);
}
/**
* Gets the Contexts contained in the ContextManager.
*
* @return Array of Contexts contained in the ContextManager.
*/
public Context [] getContexts() {
status = Status.OK_STATUS;
if (contextManager == null && getContextManager() == null)
return null; // Note: Can't currently occur
int size = contextManager.getContextCount();
Context [] contexts = new Context [size];
for (int i = 0; i < size; i++) {
contexts[i] = contextManager.getContext(i);
}
return contexts;
}
/**
* Creates a new Context and inserts it before the specifed index
* or appends it if the index is beyond any existing Contexts in the
* ContextManager.
*
* @param index Index prior to which to insert the new Contexts.
* @return Returns the created Context.
*/
public Context createContext(int index) {
status = Status.OK_STATUS;
if (contextManager == null && getContextManager() == null)
return null; // Note: Can't currently occur
return (Context)contextManager.createElement(index, "Context");
}
/**
* Removes the Context with the specified path, if it can be found.
*
* @param contextPath Path of the Context to be removed. A leading '/' is optional.
* @return Returns <b>true</b> if the Context was removed. Returns <b>false</b>
* if the Context is not found.
*/
public boolean removeContext(String contextPath) {
status = Status.OK_STATUS;
if (contextManager == null && getContextManager() == null)
return false; // Note: Can't currently occur
if (contextPath != null && contextPath.length() > 0 && !contextPath.startsWith("/"))
contextPath = "/" + contextPath;
int size = contextManager.getContextCount();
for (int i = 0; i < size; i++) {
Context ctx = contextManager.getContext(i);
if (ctx.getPath().equals(contextPath)) {
contextManager.removeElement("Context", i);
return true;
}
}
status = new Status(IStatus.ERROR,TomcatPlugin.PLUGIN_ID,
NLS.bind(Messages.errorXMLContextNotFoundPath32, contextPath));
return false;
}
/**
* @param index Index of the Context to remove.
* @return Returns <b>true</b> if a Context is removed at the specified
* index. Returns <b>false</b> no Context exists at that index.
*/
public boolean removeContext(int index) {
status = Status.OK_STATUS;
if (contextManager == null && getContextManager() == null)
return false; // Note: Can't currently occur
return contextManager.removeElement("Context", index);
}
/**
* Gets the work directory associated with the specified
* Context. If the work directory obtained is relative,
* it is appended to the specified base path. This method does
* not verify if the specified Context currently exists.
*
* @param basePath Path to the base directory for the server.
* @param context Context whose work directory to return.
* @return Returns the path to the work directory for the specifed
* Context.
*/
public IPath getContextWorkDirectory(IPath basePath, Context context) {
if (context == null)
throw new IllegalArgumentException("Context argument may not be null.");
status = Status.OK_STATUS;
if (contextManager == null && getContextManager() == null)
return null; // Note: Can't currently occur
StringBuffer sb=new StringBuffer();
String workDir = contextManager.getWorkDir();
if (workDir == null)
workDir = "work";
sb.append(workDir);
sb.append("/");
String hostName = contextManager.getAttributeValue("hostName");
if (hostName == null)
hostName = "localhost";
sb.append(hostName);
sb.append("_");
String legacyPort = contextManager.getAttributeValue("port");
if (legacyPort == null)
legacyPort = "8080";
sb.append(legacyPort);
// Duplicate URLEncoder.encode() used in Tomcat 3.2
sb.append(URLEncoder.encode(context.getPath()));
IPath workPath = new Path(sb.toString());
if (!workPath.isAbsolute()) {
if (basePath == null)
basePath = new Path("");
workPath = basePath.append(workPath);
}
return workPath;
}
/**
* Gets the work directory associated with the server.
* If the work directory obtained is relative,
* it is appended to the specified base path.
*
* @param basePath Path to the base directory for the server.
* @return Returns the path to the work directory for the server.
*/
public IPath getServerWorkDirectory(IPath basePath) {
status = Status.OK_STATUS;
if (contextManager == null && getContextManager() == null)
return null; // Note: Can't currently occur
String workDir = contextManager.getWorkDir();
if (workDir == null)
workDir = "work";
IPath workPath = new Path(workDir);
if (!workPath.isAbsolute()) {
if (basePath == null)
basePath = new Path("");
workPath = basePath.append(workPath);
}
return workPath;
}
}