1 19 20 package org.apache.geronimo.mavenplugins.geronimo.server; 21 22 import java.io.File ; 23 24 import java.util.Timer ; 25 import java.util.TimerTask ; 26 import java.util.Map ; 27 import java.util.HashMap ; 28 import java.util.Properties ; 29 import java.util.Iterator ; 30 import java.util.StringTokenizer ; 31 import java.util.List ; 32 import java.util.ArrayList ; 33 34 import org.apache.maven.plugin.MojoExecutionException; 35 36 import org.apache.tools.ant.taskdefs.Java; 37 38 import org.apache.geronimo.genesis.util.ObjectHolder; 39 import org.apache.geronimo.mavenplugins.geronimo.ServerProxy; 40 41 import org.codehaus.plexus.util.FileUtils; 42 43 50 public class StartServerMojo 51 extends InstallerMojoSupport 52 { 53 58 private boolean background = false; 59 60 65 private String maximumMemory = null; 66 67 72 private boolean quiet = false; 73 74 79 private boolean verbose = false; 80 81 86 private boolean veryverbose = false; 87 88 93 private int timeout = -1; 94 95 100 private int verifyTimeout = -1; 101 102 107 private OptionSet[] optionSets = null; 108 109 114 private String options = null; 115 116 121 private String [] startModules = null; 122 123 private Timer timer = new Timer (true); 124 125 protected void doExecute() throws Exception { 126 installAssembly(); 127 128 log.info("Starting Geronimo server..."); 129 130 final Java java = (Java)createTask("java"); 132 java.setJar(new File (geronimoHome, "bin/server.jar")); 133 java.setDir(geronimoHome); 134 java.setFailonerror(true); 135 java.setFork(true); 136 137 if (timeout > 0) { 138 java.setTimeout(new Long (timeout * 1000)); 139 } 140 141 if (maximumMemory != null) { 142 java.setMaxmemory(maximumMemory); 143 } 144 145 if (options != null && (optionSets == null || optionSets.length == 0)) { 147 throw new MojoExecutionException("At least one optionSet must be defined to select one using options"); 148 } 149 else if (options == null) { 150 options = "default"; 151 } 152 153 if (optionSets != null && optionSets.length != 0) { 154 OptionSet[] sets = selectOptionSets(); 155 156 for (int i=0; i < sets.length; i++) { 157 if (log.isDebugEnabled()) { 158 log.debug("Selected option set: " + sets[i]); 159 } 160 else { 161 log.info("Selected option set: " + sets[i].getId()); 162 } 163 164 String [] options = sets[i].getOptions(); 165 if (options != null) { 166 for (int j=0; j < options.length; j++) { 167 java.createJvmarg().setValue(options[j]); 168 } 169 } 170 171 Properties props = sets[i].getProperties(); 172 if (props != null) { 173 Iterator iter = props.keySet().iterator(); 174 while (iter.hasNext()) { 175 String name = (String )iter.next(); 176 String value = props.getProperty(name); 177 178 setSystemProperty(java, name, value); 179 } 180 } 181 } 182 } 183 184 setSystemProperty(java, "org.apache.geronimo.base.dir", geronimoHome); 186 setSystemProperty(java, "java.io.tmpdir", new File (geronimoHome, "var/temp")); 187 setSystemProperty(java, "java.endorsed.dirs", appendSystemPath("java.endorsed.dirs", new File (geronimoHome, "lib/endorsed"))); 188 setSystemProperty(java, "java.ext.dirs", appendSystemPath("java.ext.dirs", new File (geronimoHome, "lib/ext"))); 189 190 if (quiet) { 191 java.createArg().setValue("--quiet"); 192 } 193 else { 194 java.createArg().setValue("--long"); 195 } 196 197 if (verbose) { 198 java.createArg().setValue("--verbose"); 199 } 200 201 if (veryverbose) { 202 java.createArg().setValue("--veryverbose"); 203 } 204 205 if (startModules != null) { 206 if (startModules.length == 0) { 207 throw new MojoExecutionException("At least one module name must be configured with startModule"); 208 } 209 210 log.info("Overriding the set of modules to be started"); 211 212 java.createArg().setValue("--override"); 213 214 for (int i=0; i < startModules.length; i++) { 215 java.createArg().setValue(startModules[i]); 216 } 217 } 218 219 223 if (logOutput) { 224 File file = getLogFile(); 225 FileUtils.forceMkdir(file.getParentFile()); 226 227 log.info("Redirecting output to: " + file); 228 229 java.setOutput(file); 230 } 231 232 final ObjectHolder errorHolder = new ObjectHolder(); 234 235 Thread t = new Thread ("Geronimo Server Runner") { 237 public void run() { 238 try { 239 java.execute(); 240 } 241 catch (Exception e) { 242 errorHolder.set(e); 243 244 } 249 } 250 }; 251 t.start(); 252 253 log.debug("Waiting for Geronimo server..."); 254 255 final ObjectHolder verifyTimedOut = new ObjectHolder(); 257 258 TimerTask timeoutTask = new TimerTask () { 259 public void run() { 260 verifyTimedOut.set(Boolean.TRUE); 261 } 262 }; 263 264 if (verifyTimeout > 0) { 265 log.debug("Starting verify timeout task; triggers in: " + verifyTimeout + "s"); 266 timer.schedule(timeoutTask, verifyTimeout * 1000); 267 } 268 269 ServerProxy server = new ServerProxy(hostname, port, username, password); 271 boolean started = false; 272 while (!started) { 273 if (verifyTimedOut.isSet()) { 274 throw new MojoExecutionException("Unable to verify if the server was started in the given time"); 275 } 276 277 if (errorHolder.isSet()) { 278 throw new MojoExecutionException("Failed to start Geronimo server", (Throwable )errorHolder.get()); 279 } 280 281 started = server.isFullyStarted(); 282 283 if (!started) { 284 Throwable error = server.getLastError(); 285 if (error != null) { 286 log.debug("Server query failed; ignoring", error); 287 } 288 289 Thread.sleep(1000); 290 } 291 } 292 293 timeoutTask.cancel(); 295 296 log.info("Geronimo server started"); 297 298 if (!background) { 299 log.info("Waiting for Geronimo server to shutdown..."); 300 301 t.join(); 302 } 303 } 304 305 private String appendSystemPath(final String name, final File file) { 306 assert name != null; 307 assert file != null; 308 309 return System.getProperty(name) + File.pathSeparator + file.getPath(); 310 } 311 312 private OptionSet[] selectOptionSets() throws MojoExecutionException { 313 Map map = new HashMap (); 315 for (int i=0; i<optionSets.length; i++) { 316 if (log.isDebugEnabled()) { 317 log.debug("Checking option set: " + optionSets[i]); 318 } 319 320 String id = optionSets[i].getId(); 321 322 if (id == null && optionSets.length > 1) { 323 throw new MojoExecutionException("Must specify id for optionSet when more than one optionSet is configured"); 324 } 325 else if (id == null && optionSets.length == 1) { 326 id = "default"; 327 optionSets[i].setId(id); 328 } 329 330 assert id != null; 331 id = id.trim(); 332 333 if (map.containsKey(id)) { 334 throw new MojoExecutionException("Must specify unique id for optionSet: " + id); 335 } 336 map.put(id, optionSets[i]); 337 } 338 339 StringTokenizer stok = new StringTokenizer (options, ","); 340 341 List selected = new ArrayList (); 342 while (stok.hasMoreTokens()) { 343 String id = stok.nextToken(); 344 OptionSet set = (OptionSet)map.get(id); 345 346 if (set == null) { 347 if ("default".equals(id)) { 348 log.debug("Default optionSet selected, but no optionSet defined with that id; ignoring"); 349 } 350 else { 351 log.warn("Missing optionSet for id: " + id); 352 } 353 } 354 else { 355 selected.add(set); 356 } 357 } 358 359 return (OptionSet[]) selected.toArray(new OptionSet[selected.size()]); 360 } 361 362 protected String getFullClassName() { 363 return this.getClass().getName(); 364 } 365 } 366 | Popular Tags |