Package org.objectstyle.wolips.launching.delegates

Source Code of org.objectstyle.wolips.launching.delegates.RunnableExceptionHandler

/* ====================================================================
*
* The ObjectStyle Group Software License, Version 1.0
*
* Copyright (c) 2002 - 2006 The ObjectStyle Group
* and individual authors of the software.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in
*    the documentation and/or other materials provided with the
*    distribution.
*
* 3. The end-user documentation included with the redistribution, if
*    any, must include the following acknowlegement:
*       "This product includes software developed by the
*        ObjectStyle Group (http://objectstyle.org/)."
*    Alternately, this acknowlegement may appear in the software itself,
*    if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "ObjectStyle Group" and "Cayenne"
*    must not be used to endorse or promote products derived
*    from this software without prior written permission. For written
*    permission, please contact andrus@objectstyle.org.
*
* 5. Products derived from this software may not be called "ObjectStyle"
*    nor may "ObjectStyle" appear in their names without prior written
*    permission of the ObjectStyle Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED.  IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the ObjectStyle Group.  For more
* information on the ObjectStyle Group, please see
* <http://objectstyle.org/>.
*
*/

package org.objectstyle.wolips.launching.delegates;

import java.io.File;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.JavaLaunchDelegate;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.swt.widgets.Display;
import org.objectstyle.woenvironment.util.FileStringScanner;
import org.objectstyle.wolips.baseforplugins.util.StringUtilities;
import org.objectstyle.wolips.baseforuiplugins.utils.WorkbenchUtilities;
import org.objectstyle.wolips.core.resources.types.project.ProjectAdapter;
import org.objectstyle.wolips.launching.LaunchingPlugin;
import org.objectstyle.wolips.launching.classpath.WORuntimeClasspathProvider;
import org.objectstyle.wolips.preferences.ILaunchInfo;
import org.objectstyle.wolips.preferences.Preferences;
import org.objectstyle.wolips.variables.VariablesPlugin;

/**
* @author ulrich Launches a local VM.
*/
public class WOJavaLocalApplicationLaunchConfigurationDelegate extends JavaLaunchDelegate {
  /**
   * Comment for <code>WOJavaLocalApplicationID</code>
   */
  public static final String WOJavaLocalApplicationID = "org.objectstyle.wolips.launching.WOLocalJavaApplication";

  /** The launch configuration attribute for stack trace depth */
  public static final String ATTR_WOLIPS_LAUNCH_WOARGUMENTS = "org.objectstyle.wolips.launchinfo";

  /**
   * Comment for <code>ATTR_WOLIPS_LAUNCH_DEBUG_GROUPS</code>
   */
  public static final String ATTR_WOLIPS_LAUNCH_DEBUG_GROUPS = "WOJavaLocalApplicationLaunchConfigurationDelegate.NSDebugGroups";

  public static final String ATTR_WOLIPS_LAUNCH_OPEN_IN_BROWSER = "WOJavaLocalApplicationLaunchConfigurationDelegate.OpenInBrowser";

  public static final String ATTR_WOLIPS_LAUNCH_WEBSERVER_CONNECT = "WOJavaLocalApplicationLaunchConfigurationDelegate.WebServerConnect";

  /**
   * @param config
   */
  public static void initConfiguration(ILaunchConfigurationWorkingCopy config) {
    try {
      IJavaProject javaProject = JavaRuntime.getJavaProject(config);
      if (javaProject != null) {
        config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, "${working_dir_loc_WOLips:" + javaProject.getProject().getName() + "}");
      }
    } catch (CoreException ce) {
      LaunchingPlugin.getDefault().log(ce);
    }
    config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, WORuntimeClasspathProvider.ID);
    config.setAttribute(WOJavaLocalApplicationLaunchConfigurationDelegate.ATTR_WOLIPS_LAUNCH_OPEN_IN_BROWSER, "false");
  }

  public String[] getClasspath(ILaunchConfiguration configuration) throws CoreException {
    return super.getClasspath(configuration);
  }

  public boolean preLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
    String notFound = "notFound";
    if (configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, notFound).equals(notFound)) {
      ILaunchConfigurationWorkingCopy workingCopy = configuration.getWorkingCopy();
      workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, WORuntimeClasspathProvider.ID);
      workingCopy.doSave();
      this.informUser("LaunchConfiguration update. The message should occur only once. Please launch your app again.");
      return false;
    }
    if (configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, notFound).equals(WORuntimeClasspathProvider.OLD_ID)) {
      ILaunchConfigurationWorkingCopy workingCopy = configuration.getWorkingCopy();
      workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, WORuntimeClasspathProvider.ID);
      workingCopy.doSave();
      this.informUser("LaunchConfiguration update. The message should occur only once. Please launch your app again.");
      return false;
    }
    if (configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, notFound).equals(WORuntimeClasspathProvider.VERY_OLD_ID)) {
      ILaunchConfigurationWorkingCopy workingCopy = configuration.getWorkingCopy();
      workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, WORuntimeClasspathProvider.ID);
      workingCopy.doSave();
      this.informUser("LaunchConfiguration update. The message should occur only once. Please launch your app again.");
      return false;
    }
    return super.preLaunchCheck(configuration, mode, monitor);
  }

  private final void informUser(final String message) {
    class RunnableExceptionHandler implements Runnable {

      public void run() {
        Status status = new Status(IStatus.ERROR, "org.objectstyle.wolips.launching", IStatus.ERROR, "Classpath Provider missing or invalid", null);
        WorkbenchUtilities.errorDialog(Display.getCurrent().getActiveShell(), "WOLips", message, status);
      }
    }
    RunnableExceptionHandler runnable = new RunnableExceptionHandler();
    Display.getDefault().asyncExec(runnable);
  }

  /**
   * @see org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#verifyWorkingDirectory(org.eclipse.debug.core.ILaunchConfiguration)
   */
  public File verifyWorkingDirectory(ILaunchConfiguration configuration) throws CoreException {
    IProject theProject = this.getJavaProject(configuration).getProject();

    // IPath wd = getWorkingDirectoryPath(configuration);
    ProjectAdapter projectAdaptor = (ProjectAdapter) theProject.getAdapter(ProjectAdapter.class);

    IContainer workingDirectoryFolder = projectAdaptor.getWorkingDirFolder();
    File workingDirectoryFile;
    if (workingDirectoryFolder == null) {
      workingDirectoryFile = super.verifyWorkingDirectory(configuration);
    } else {
      workingDirectoryFile = workingDirectoryFolder.getLocation().toFile();
    }
    /*
     * if (null == wdFile) { IPath path =
     * VariablesPlugin.getDefault().getProjectVariables
     * (theProject).getExternalBuildRoot(); if(path != null) { path =
     * path.append(theProject.getName() + ".woa"); wdFile = path.toFile();
     * if (!wdFile.exists()) { wdFile = null; } } else { wdFile = null; } }
     * if (null == wdFile) { wdFile =
     * super.verifyWorkingDirectory(configuration); } if (((wdFile == null)
     * || (wdFile.toString().indexOf(".woa") < 0))) {
     * abort(MessageFormat.format(LaunchingMessages.getString(
     * "WOJavaLocalApplicationLaunchConfigurationDelegate.Working_directory_is_not_a_woa__{0}_12"
     * ), new Object[] { wdFile.toString() }), null,
     * IJavaLaunchConfigurationConstants
     * .ERR_WORKING_DIRECTORY_DOES_NOT_EXIST); //$NON-NLS-1$ }
     */

    return workingDirectoryFile;
  }

  @SuppressWarnings("unused")
  public boolean isValidProjectPath(IProject project) {
    try {
      return true;//project.getLocation().toOSString().indexOf("-") == -1;
    } catch (Exception anException) {
      LaunchingPlugin.getDefault().log(anException);
      return false;
    }
  }

  protected void addProjectsToSearchPath(IProject buildProject, IProject project, StringBuffer searchPathBuffer, Set<IProject> visitedProjects, Set<IProject> invalidProjects) throws JavaModelException {
    if (!visitedProjects.contains(project)) {
      visitedProjects.add(project);
      if (project.equals(buildProject)) {
        searchPathBuffer.append("\"..\",\"../..\"");
      }
      if (isValidProjectPath(project)) {
        ProjectAdapter projectAdapter = (ProjectAdapter) project.getAdapter(ProjectAdapter.class);
        if (projectAdapter != null && projectAdapter.isFramework()) {
          searchPathBuffer.append(",\"");
          searchPathBuffer.append(project.getLocation().toOSString());
          searchPathBuffer.append("\"");
        }
      } else {
        invalidProjects.add(project);
      }
      IJavaProject javaProject = JavaCore.create(project);
      if (javaProject != null) {
        String[] requiredProjectNames = javaProject.getRequiredProjectNames();
        for (int requiredProjectNameNum = 0; requiredProjectNameNum < requiredProjectNames.length; requiredProjectNameNum++) {
          String requiredProjectName = requiredProjectNames[requiredProjectNameNum];
          IProject requiredProject = ResourcesPlugin.getWorkspace().getRoot().getProject(requiredProjectName);
          addProjectsToSearchPath(buildProject, requiredProject, searchPathBuffer, visitedProjects, invalidProjects);
        }
      }
    }
  }

  /**
   * Method addPreferencesValue.
   *
   * @param value
   * @param projectSearchPathPreferences
   * @return String
   */
  private String addPreferencesValue(String aString, String projectSearchPathPreferences) {
    String value = aString;
    if (value == null) {
      return value;
    }
    String nsProjectSarchPath = projectSearchPathPreferences;
    if (nsProjectSarchPath == null || nsProjectSarchPath.length() == 0) {
      return value;
    }
    if (value.length() > 0) {
      value = value + ",";
    }
    return value + nsProjectSarchPath;
  }

  /**
   * Method getGeneratedByWOLips.
   *
   * @param projectSearchPathPreferences
   *
   * @return String
   * @throws JavaModelException
   */
  public String getGeneratedByWOLips(IProject project, String projectSearchPathPreferences) throws JavaModelException {
    StringBuffer searchPathBuffer = new StringBuffer();
    final HashSet<IProject> invalidProjects = new HashSet<IProject>();
    addProjectsToSearchPath(project, project, searchPathBuffer, new HashSet<IProject>(), invalidProjects);
    String returnValue = FileStringScanner.replace(searchPathBuffer.toString(), "\\", "/");
    returnValue = this.addPreferencesValue(returnValue, projectSearchPathPreferences);
    if ("".equals(returnValue)) {
      returnValue = "\"" + ".." + "\"";
    }
    returnValue = "(" + returnValue + ")";
//    if (!invalidProjects.isEmpty()) {
//      Display.getDefault().asyncExec(new Runnable() {
//        public void run() {
//          WorkbenchUtilities.errorDialog(WorkbenchUtilities.getActiveWorkbenchShell(), "NSProjectSearchPath", "The projects " + invalidProjects + " contain dashes in their paths.  This breaks NSProjectSearchPath. Rapid turnaround will be disabled.", (Throwable) null);
//        }
//      });
//    }
    return returnValue;
  }

  public String getProgramArguments(ILaunchConfiguration configuration) throws CoreException {
    return getProgramArguments(configuration, true, true, false);
  }
 
  public String getProgramArguments(ILaunchConfiguration configuration, boolean includeDash, boolean includeDashD, boolean equalSeparator) throws CoreException {
    IProject theProject = this.getJavaProject(configuration).getProject();

    StringBuffer launchArgument = new StringBuffer();
    if (includeDash) {
      launchArgument.append(super.getProgramArguments(configuration));
    }
    launchArgument.append(" ");

    String mainTypeName = verifyMainTypeName(configuration);

    File workingDir = verifyWorkingDirectory(configuration);
    String launchArguments = configuration.getAttribute(WOJavaLocalApplicationLaunchConfigurationDelegate.ATTR_WOLIPS_LAUNCH_WOARGUMENTS, Preferences.getLaunchGlobal());
    if (launchArguments != null && launchArguments.indexOf("<>-EOAdaptorDebugEnabled=<>") != -1) {
      launchArguments = launchArguments.replaceAll("\\Q<>-EOAdaptorDebugEnabled=<>\\E", "<>-EOAdaptorDebugEnabled<>");
    }
    ILaunchInfo[] launchInfo = Preferences.getLaunchInfoFrom(launchArguments);
    String automatic = "Automatic";
    boolean isMacOSX = System.getProperty("os.name", "Unknown").contains("Mac");
    boolean nsProjectBundleEnabledExists = false;
    for (int i = 0; i < launchInfo.length; i++) {
      if (launchInfo[i].isEnabled()) {
        // -WOApplicationClassName
        String parameter = launchInfo[i].getParameter();
        String argument = launchInfo[i].getArgument();
        boolean includeParam = true;
        if (parameter.startsWith("-D")) {
          includeParam = includeDashD;
        }
        else {
          includeParam = includeDash;
        }
        if (includeParam) {
          if (automatic.equals(argument)) {
            if ("-WOApplicationClassName".equals(parameter))
              argument = mainTypeName;
            if ("-DWORoot=".equals(parameter)) {
              IPath systemRoot = VariablesPlugin.getDefault().getProjectVariables(theProject).getSystemRoot();
              if (isMacOSX || systemRoot == null) {
                parameter = "";
                argument = "";
              } else {
                argument = systemRoot.toOSString();
              }
            }
            if ("-DWORootDirectory=".equals(parameter)) {
              IPath systemRoot = VariablesPlugin.getDefault().getProjectVariables(theProject).getSystemRoot();
              if (isMacOSX || systemRoot == null) {
                parameter = "";
                argument = "";
              } else {
                argument = systemRoot.toOSString();
              }
            }
            if ("-DWOUserDirectory=".equals(parameter)) {
              argument = workingDir.getAbsolutePath();
            }
            if ("-NSProjectSearchPath".equals(parameter) || "-DNSProjectSearchPath".equals(parameter)) {
              argument = getGeneratedByWOLips(theProject, Preferences.getNSProjectSearchPath());
            }
 
          }
 
          if (parameter != null && parameter.length() > 0) {
            launchArgument.append(StringUtilities.toCommandlineParameterFormat(parameter, argument, true, equalSeparator));
            launchArgument.append(" ");
          }
        }
      }
     
      if (launchInfo[i].getParameter() != null && launchInfo[i].getParameter().contains("NSProjectBundleEnabled")) {
        nsProjectBundleEnabledExists = true;
      }
    }
   
    if (!nsProjectBundleEnabledExists && !Preferences.mockBundleEnabled()) {
      launchArgument.append(" -DNSProjectBundleEnabled=true");
    }
   
    String debugGroups = configuration.getAttribute(WOJavaLocalApplicationLaunchConfigurationDelegate.ATTR_WOLIPS_LAUNCH_DEBUG_GROUPS, "");
    if (debugGroups != null && debugGroups.length() > 0 && includeDashD) {
      launchArgument.append(" -DNSDebugGroups=\"(");
      launchArgument.append(debugGroups);
      launchArgument.append(")\"");
    }
    return launchArgument.toString();
  }

  public String getVMArguments(ILaunchConfiguration configuration) throws CoreException {
    String vmArguments = super.getVMArguments(configuration);
    StringBuffer vmArgumentsBuffer = new StringBuffer();
    if (vmArguments != null) {
      vmArgumentsBuffer.append(vmArguments);
    }
    vmArgumentsBuffer.append(getProgramArguments(configuration, false, true, true));
    return vmArgumentsBuffer.toString();
  }
 
  /**
   * for the profiling plugin
   *
   * @param configuration
   * @param launch
   * @return
   * @throws CoreException
   */
  public String getVMArguments(ILaunchConfiguration configuration, ILaunch launch) throws CoreException {
    return getVMArguments(configuration);
  }

}
TOP

Related Classes of org.objectstyle.wolips.launching.delegates.RunnableExceptionHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.