KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > test > server > appserver > cargo > CargoAppServer


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright
3  * notice. All rights reserved.
4  */

5 package com.tc.test.server.appserver.cargo;
6
7 import org.codehaus.cargo.container.ContainerException;
8 import org.codehaus.cargo.container.ContainerType;
9 import org.codehaus.cargo.container.InstalledLocalContainer;
10 import org.codehaus.cargo.container.State;
11 import org.codehaus.cargo.container.configuration.ConfigurationType;
12 import org.codehaus.cargo.container.configuration.LocalConfiguration;
13 import org.codehaus.cargo.container.deployable.WAR;
14 import org.codehaus.cargo.container.property.GeneralPropertySet;
15 import org.codehaus.cargo.container.property.ServletPropertySet;
16 import org.codehaus.cargo.generic.configuration.ConfigurationFactory;
17 import org.codehaus.cargo.generic.configuration.DefaultConfigurationFactory;
18
19 import com.tc.process.LinkedJavaProcessPollingAgent;
20 import com.tc.test.server.ServerParameters;
21 import com.tc.test.server.ServerResult;
22 import com.tc.test.server.appserver.AbstractAppServer;
23 import com.tc.test.server.appserver.AppServer;
24 import com.tc.test.server.appserver.AppServerInstallation;
25 import com.tc.test.server.appserver.AppServerParameters;
26 import com.tc.test.server.appserver.AppServerResult;
27 import com.tc.test.server.appserver.cargo.CargoJava.Link;
28 import com.tc.test.server.util.AppServerUtil;
29
30 import java.io.File JavaDoc;
31 import java.util.Iterator JavaDoc;
32 import java.util.Map JavaDoc;
33 import java.util.Map.Entry;
34
35 /**
36  * Generic {@link AppServer} implementation which delegates to the Codehaus CARGO package
37  * http://docs.codehaus.org/display/CARGO/Home
38  */

39 public abstract class CargoAppServer extends AbstractAppServer {
40
41   private InstalledLocalContainer container;
42   private int port;
43   private int linkedPort;
44
45   // System property used by cargo. This String is referenced in the CARGO patch, therefore it must not be changed
46
public static final String JavaDoc CARGO_JAVA = "cargo_java";
47   public static final String JavaDoc CARGO_JAVA_CLASS = CargoJava.class.getName();
48
49   static {
50     System.setProperty(CARGO_JAVA, CARGO_JAVA_CLASS);
51   }
52
53   public CargoAppServer(AppServerInstallation installation) {
54     super(installation);
55   }
56
57   public final ServerResult start(ServerParameters rawParams) throws Exception JavaDoc {
58     AppServerParameters params = (AppServerParameters) rawParams;
59     port = AppServerUtil.getPort();
60     File JavaDoc instance = createInstance(params);
61     setProperties(params, port, instance);
62
63     ConfigurationFactory factory = new DefaultConfigurationFactory();
64     LocalConfiguration config = (LocalConfiguration)factory
65         .createConfiguration(cargoServerKey(), ContainerType.INSTALLED, ConfigurationType.STANDALONE, instance.getAbsolutePath());
66     setConfigProperties(config);
67     config.setProperty(ServletPropertySet.PORT, Integer.toString(port));
68     config.setProperty(GeneralPropertySet.JVMARGS, params.jvmArgs());
69     config.setProperty(GeneralPropertySet.LOGGING, "high");
70     addWars(config, params.wars(), params.instanceName());
71
72     container = container(config);
73     container.setTimeout(8 * 60 * 1000);
74     container.setHome(serverInstallDirectory().getAbsolutePath());
75     container.setLogger(new ConsoleLogger(params.instanceName()));
76     setExtraClasspath(params);
77
78     linkJavaProcess(instance);
79
80     // System.err.println("Starting " + ClassUtils.getShortClassName(getClass()) + " on port " + port + "...");
81

82     container.start();
83
84     return new AppServerResult(port, this);
85   }
86
87   public final void stop() {
88     if (container != null) {
89       if (container.getState().equals(State.STARTED) || container.getState().equals(State.STARTING)
90           || container.getState().equals(State.UNKNOWN)) {
91         try {
92           // XXX: clear out the jvmargs so that the VMs spawned for stop() don't try to use DSO
93
// XXX: If you know a better way to do this, go for it
94
String JavaDoc jvmArgs = container.getConfiguration().getPropertyValue(GeneralPropertySet.JVMARGS);
95           try {
96             container.getConfiguration().setProperty(GeneralPropertySet.JVMARGS, null);
97             container.stop(); // NOTE: stop is not guaranteed to work
98
} finally {
99             container.getConfiguration().setProperty(GeneralPropertySet.JVMARGS, jvmArgs);
100           }
101         } catch (ContainerException e) {
102           throw new RuntimeException JavaDoc(e);
103         }
104       }
105     }
106   }
107
108   private void addWars(LocalConfiguration config, Map JavaDoc wars, String JavaDoc instanceName) {
109     WAR warapp = null;
110     for (Iterator JavaDoc it = wars.entrySet().iterator(); it.hasNext();) {
111       Map.Entry JavaDoc entry = (Entry) it.next();
112       String JavaDoc context = (String JavaDoc) entry.getKey();
113       File JavaDoc warFile = (File JavaDoc) entry.getValue();
114       warapp = new WAR(warFile.getPath());
115       warapp.setContext(context);
116       warapp.setLogger(new ConsoleLogger(instanceName));
117       config.addDeployable(warapp);
118     }
119   }
120
121   /**
122    * Create a linked java process {@link LinkedJavaProcessPollingAgent}
123    *
124    * @throws InterruptedException
125    */

126   private void linkJavaProcess(File JavaDoc instance) throws InterruptedException JavaDoc {
127     linkedPort = LinkedJavaProcessPollingAgent.getChildProcessHeartbeatServerPort();
128     Link.put(new CargoJava.Args(linkedPort, instance));
129   }
130
131   protected final InstalledLocalContainer container() {
132     return container;
133   }
134
135   protected abstract String JavaDoc cargoServerKey();
136
137   protected abstract InstalledLocalContainer container(LocalConfiguration config);
138
139   protected void setConfigProperties(LocalConfiguration config) throws Exception JavaDoc {
140     // do nothing
141
}
142
143   protected void setExtraClasspath(AppServerParameters params) {
144     // do nothing
145
}
146
147 }
148
Popular Tags