package com.sap.runlet.tomcat;
import java.io.File;
import java.util.Collection;
import java.util.LinkedList;
import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Embedded;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.ui.IStartup;
import org.osgi.framework.BundleContext;
import com.sap.mi.fwk.ConnectionManager;
import com.sap.runlet.abstractinterpreter.repository.Repository;
import com.sap.tc.moin.repository.Connection;
import data.classes.Association;
import data.classes.AssociationEnd;
import data.classes.ClassTypeDefinition;
import data.classes.SapClass;
import data.classes.TypeDefinition;
/**
* The activator class controls the plug-in life cycle
*/
public class Activator extends Plugin implements IStartup {
// The plug-in ID
public static final String PLUGIN_ID = "com.sap.runlet.tomcat";
/**
* The name of the top-level directory in a (target) workspace project that
* contains a web application for deployment in Tomcat
*/
private static final String WEBAPP_DIR_NAME = "war";
// The shared instance
private static Activator plugin;
/**
* The constructor
*/
public Activator() {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
*/
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
startTomcat();
}
private void startTomcat() throws LifecycleException {
final String SERVER_AND_ENGINE_NAME = "Runlet";
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
IProject tomcatRoot = workspaceRoot.getProject("com.sap.runlet.tomcat");
if (!tomcatRoot.getFolder("apache-tomcat-6.0.20").exists()) {
return; // Tomcat not installed. Do nothing.
}
File CATALINAHOME = tomcatRoot.getFolder("apache-tomcat-6.0.20").getLocation().toFile();
Embedded server = new Embedded();
server.setName(SERVER_AND_ENGINE_NAME);
server.setCatalinaHome(CATALINAHOME.getAbsolutePath());
Engine engine = server.createEngine();
engine.setName(SERVER_AND_ENGINE_NAME);
engine.setDefaultHost("localhost");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
for (IFolder webappFolder : getWebappsInWorkspace()) {
File WEBAPPS = webappFolder.getLocation().toFile();
Host host = server.createHost("localhost", WEBAPPS.getAbsolutePath());
Context context = server.createContext("/runlet", WEBAPPS.getAbsolutePath()); //FIXME: context names must be unique!
context.setReloadable(true);
context.setParentClassLoader(Thread.currentThread().getContextClassLoader());
host.addChild(context);
engine.addChild(host);
}
server.addEngine(engine);
Connector http = server.createConnector("localhost", 8282, false);
server.addConnector(http);
server.start();
}
private Collection<IFolder> getWebappsInWorkspace() {
Collection<IFolder> result = new LinkedList<IFolder>();
IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
for (IProject project : workspaceRoot.getProjects()) {
IFolder webappFolder = project.getFolder(WEBAPP_DIR_NAME);
if (webappFolder.exists()) {
result.add(webappFolder);
}
}
return result;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
*/
@Override
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
}
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static Activator getDefault() {
return plugin;
}
@Override
public void earlyStartup() {
// doesn't have to do anything; OSGi bundle will be started because this
// class has to be loaded in order to do nothing here; this will then
// pull
// up Tomcat.
}
public Repository<Association, AssociationEnd, SapClass, TypeDefinition, ClassTypeDefinition> getRunletDataStore() {
return com.sap.runlet.interpreter.Activator.getDefault().getRunletDataStore();
}
public static IProject getStdlibProject() {
return getProject("ngpm.stdlib");
}
public static IProject getProject(String projectName) {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
return project;
}
public static Connection createConnection(final IProject project) {
return ConnectionManager.getInstance().getOrCreateDefaultConnection(project);
}
public static Connection createConnection(String projectName) {
return createConnection(getProject(projectName));
}
}