public void configureLaunch(final ILaunch launch) throws CoreException { final IServer server = ServerUtil.getServer(configuration); server.addServerListener( new IServerListener() { IModule[] modules = server.getModules(); private boolean modulesChanged(IModule[] modules, IModule[] modules2) { if (CoreUtil.isNullOrEmpty(modules) && CoreUtil.isNullOrEmpty(modules2)) { return true; } if (CoreUtil.isNullOrEmpty(modules) || CoreUtil.isNullOrEmpty(modules2)) { return true; } if (modules.length != modules2.length) { return true; } for (int i = 0; i < modules.length; i++) { if (!modules[i].equals(modules2[i])) { return true; } } return false; } public synchronized void serverChanged(ServerEvent event) { if ((event.getKind() & ServerEvent.MODULE_CHANGE) > 0) { IModule[] newModules = event.getServer().getModules(); if (modulesChanged(modules, newModules)) { try { final PortalSourceLookupDirector director = (PortalSourceLookupDirector) launch.getSourceLocator(); director.initializeDefaults(configuration); } catch (Exception e) { LiferayServerCore.logError( "Unable to update source containers for server", e); // $NON-NLS-1$ } modules = newModules; } } } }); final ISourcePathComputer sourcePathComputer = getLaunchManager().getSourcePathComputer(this.sourceComputerId); this.setSourcePathComputer(sourcePathComputer); this.initializeDefaults(configuration); launch.setSourceLocator(this); }
@Override public boolean preLaunchCheck( ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException { IServer server = ServerUtil.getServer(configuration); IStatus s = server.canStart(mode); Trace.trace(Trace.STRING_FINEST, "Ensuring Server can start: " + s.getMessage()); // $NON-NLS-1$ if (!s.isOK()) throw new CoreException(s); IControllableServerBehavior jbsBehavior = JBossServerBehaviorUtils.getControllableBehavior(server); if (LaunchCommandPreferences.isIgnoreLaunchCommand(server)) { Trace.trace( Trace.STRING_FINEST, "Server is marked as ignore Launch. Marking as started."); //$NON-NLS-1$ ((ControllableServerBehavior) jbsBehavior).setRunMode(mode); ((ControllableServerBehavior) jbsBehavior).setServerStarting(); boolean attachDebugger = server.getAttribute(RemoteDebugUtils.ATTACH_DEBUGGER, true); if ("debug".equals(mode) && attachDebugger) { // add a listener which will run the debugger once server is started IServerListener listener = createAttachDebuggerListener(); server.addServerListener(listener); } initiatePolling(server); return false; } validateServerStructure(server); Trace.trace( Trace.STRING_FINEST, "Checking if similar server is already up on the same ports."); //$NON-NLS-1$ IStatus startedStatus = isServerStarted(server); boolean started = startedStatus.isOK(); if (started) { Trace.trace( Trace.STRING_FINEST, "A server is already started. Now handling the already started scenario."); //$NON-NLS-1$ return handleAlreadyStartedScenario(server, startedStatus); } Trace.trace(Trace.STRING_FINEST, "A full launch will now proceed."); // $NON-NLS-1$ return true; }
protected void afterVMRunner( ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { IProcess[] processes = launch.getProcesses(); final IServer server = ServerUtil.getServer(configuration); IControllableServerBehavior beh = JBossServerBehaviorUtils.getControllableBehavior(configuration); if (processes != null && processes.length >= 1 && processes[0] != null) { ProcessTerminatedDebugListener debug = new ProcessTerminatedDebugListener(ServerUtil.getServer(configuration), processes[0]) { protected void handleEarlyTermination() { cancelPolling(server); IStatus status = new Status( IStatus.INFO, ASWTPToolsPlugin.PLUGIN_ID, IEventCodes.BEHAVIOR_PROCESS_TERMINATED, Messages.TERMINATED, null); logStatus(server, status); } }; if (beh != null) { final IProcess launched = processes[0]; beh.putSharedData(PROCESS, launched); beh.putSharedData(DEBUG_LISTENER, debug); final IServer ser = beh.getServer(); // During some niche cases, a server may be set to stopped, // but the process may not be shutting down. For example if two // conflicting servers were launched using the same ports. // This is a cleanup thread that waits a significant amount of time // that should be suitable for all genuine shutdowns, and then // force terminates the process. IServerListener list = new IServerListener() { public void serverChanged(ServerEvent event) { final IServerListener list2 = this; int eventKind = event.getKind(); if ((eventKind & ServerEvent.SERVER_CHANGE) != 0) { // server change event if ((eventKind & ServerEvent.STATE_CHANGE) != 0) { if (ser.getServerState() == IServer.STATE_STOPPED) { new Thread() { public void run() { // wait 7 seconds try { Thread.sleep(getProcessTerminationDelay()); } catch (InterruptedException ie) { // do nothing } if (!launched.isTerminated()) { // Alert user Object result = getPrompter() .promptUser(UserPrompter.EVENT_CODE_PROCESS_UNTERMINATED, ser); if (result == null || (result instanceof Boolean && ((Boolean) result).booleanValue())) { // force terminate this process try { launched.terminate(); } catch (DebugException de) { ASWTPToolsPlugin.log(de); } } } ser.removeServerListener(list2); } }.start(); } } } } }; ser.addServerListener(list); } DebugPlugin.getDefault().addDebugEventListener(debug); } initiatePolling(server); }