コード例 #1
0
  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);
  }