Author: rob.stryker(a)jboss.com
Date: 2009-02-11 04:44:49 -0500 (Wed, 11 Feb 2009)
New Revision: 13577
Added:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/RunJarContainerWrapper.java
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/JBossServerStartupLaunchConfiguration.java
trunk/as/plugins/org.jboss.ide.eclipse.as.core/plugin.xml
Log:
JBIDE-3770 - classpath issues
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/JBossServerStartupLaunchConfiguration.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/JBossServerStartupLaunchConfiguration.java 2009-02-11
00:15:46 UTC (rev 13576)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/JBossServerStartupLaunchConfiguration.java 2009-02-11
09:44:49 UTC (rev 13577)
@@ -22,11 +22,14 @@
package org.jboss.ide.eclipse.as.core.server.internal.launch;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
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.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
@@ -40,8 +43,10 @@
import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.jdt.launching.StandardClasspathProvider;
import org.eclipse.wst.server.core.IRuntime;
import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.server.core.ServerUtil;
import org.jboss.ide.eclipse.as.core.JBossServerCorePlugin;
import org.jboss.ide.eclipse.as.core.server.IJBossServerRuntime;
@@ -51,13 +56,12 @@
public class JBossServerStartupLaunchConfiguration extends AbstractJBossLaunchConfigType
{
- protected static final char[] INVALID_CHARS = new char[] {'\\', '/',
':', '*', '?', '"', '<', '>',
'|', '\0', '@', '&'};
- private static final String LAUNCH_TYPE =
"org.jboss.ide.eclipse.as.core.server.startupConfiguration";
- private static final String DEFAULTS_SET = "jboss.defaults.been.set";
- private static final String START_JAR_LOC = "bin" + Path.SEPARATOR +
"run.jar";
- private static final String START_MAIN_TYPE = "org.jboss.Main";
+ static final char[] INVALID_CHARS = new char[] {'\\', '/', ':',
'*', '?', '"', '<', '>', '|',
'\0', '@', '&'};
+ static final String LAUNCH_TYPE =
"org.jboss.ide.eclipse.as.core.server.startupConfiguration";
+ static final String DEFAULTS_SET = "jboss.defaults.been.set";
+ static final String START_JAR_LOC = "bin" + Path.SEPARATOR +
"run.jar";
+ static final String START_MAIN_TYPE = "org.jboss.Main";
-
public static ILaunchConfigurationWorkingCopy setupLaunchConfiguration(IServer server,
String action) throws CoreException {
ILaunchConfigurationWorkingCopy config = createLaunchConfiguration(server);
setupLaunchConfiguration(config, server);
@@ -75,8 +79,9 @@
if( jbs == null )
throw new CoreException(new Status(IStatus.ERROR, JBossServerCorePlugin.PLUGIN_ID,
"Server " + server.getName() + " is not a proper JBoss Server"));
- if( workingCopy.getAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER,
(String)null) != null ) {
- workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER,
(String)null);
+ String cpProvider =
workingCopy.getAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER,
(String)null);
+ if( !DEFAULT_CP_PROVIDER_ID.equals(cpProvider)) {
+ workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER,
DEFAULT_CP_PROVIDER_ID);
workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,
getClasspath(jbs));
workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH,
false);
}
@@ -103,12 +108,14 @@
if( jbrt == null )
throw new CoreException(new Status(IStatus.ERROR, JBossServerCorePlugin.PLUGIN_ID,
"Runtime not found"));
+ /* Args and vm args */
+
String args = wc.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS,
"");
String vmArgs = wc.getAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS,
"");
- String h = jbs.getServer().getHost();
- String h2 = ArgsUtil.getValue(args, "-b", "--host");
- if( !jbs.getServer().getHost().equals(ArgsUtil.getValue(args, "-b",
"--host")))
- args = ArgsUtil.setArg(args, "-b", "--host",
jbs.getServer().getHost());
+ String host = jbs.getServer().getHost();
+ String host2 = ArgsUtil.getValue(args, "-b", "--host");
+ if( !host.equals(host2))
+ args = ArgsUtil.setArg(args, "-b", "--host", host);
IJBossServerRuntime runtime = (IJBossServerRuntime)
jbs.getServer().getRuntime().loadAdapter(IJBossServerRuntime.class, null);
@@ -122,15 +129,33 @@
vmArgs = ArgsUtil.setArg(vmArgs, null, "-Djava.library.path",
"\"" +
runtime.getRuntime().getLocation().append("bin").append("native") +
"\"", false);
+ /* Claspath */
+ List<String> cp =
wc.getAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH,
(List<String>)null);
+ List<String> newCP = fixCP(cp, jbs);
-
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, serverHome +
Path.SEPARATOR + "bin");
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, args);
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, vmArgs);
- wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, getClasspath(jbs));
+ wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, newCP);
+ wc.setAttribute(SERVER_ID,jbs.getServer().getId());
+
}
- public static void forceDefaultsSet(ILaunchConfigurationWorkingCopy wc, IServer server)
throws CoreException {
+ protected static List<String> fixCP(List<String> list, JBossServer jbs) {
+ try {
+ String[] asString = (String[]) list.toArray(new String[list.size()]);
+ for( int i = 0; i < asString.length; i++ ) {
+ if( asString[i].contains(RunJarContainerWrapper.ID)) {
+ asString[i] = getRunJarRuntimeCPEntry(jbs).getMemento();
+ }
+ }
+ return Arrays.asList(asString);
+ } catch( CoreException ce) {
+ return list;
+ }
+ }
+
+ protected static void forceDefaultsSet(ILaunchConfigurationWorkingCopy wc, IServer
server) throws CoreException {
JBossServer jbs = findJBossServer(server.getId());
if( jbs == null )
throw new CoreException(new Status(IStatus.ERROR, JBossServerCorePlugin.PLUGIN_ID,
"Server " + server.getName() + " is not a proper JBoss Server"));
@@ -160,15 +185,16 @@
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_JRE_CONTAINER_PATH, jrePath);
wc.setAttribute(ILaunchManager.ATTR_ENVIRONMENT_VARIABLES,
jbrt.getDefaultRunEnvVars());
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, getClasspath(jbs));
+ wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER,
DEFAULT_CP_PROVIDER_ID);
wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);
-
+
wc.setAttribute(DEFAULTS_SET, true);
}
- public static ArrayList<String> getClasspath(JBossServer jbs) throws CoreException
{
+ protected static ArrayList<String> getClasspath(JBossServer jbs) throws
CoreException {
IJBossServerRuntime jbrt = findJBossServerRuntime(jbs.getServer());
ArrayList<IRuntimeClasspathEntry> classpath = new
ArrayList<IRuntimeClasspathEntry>();
- addCPEntry(classpath, jbs, START_JAR_LOC);
+ classpath.add(getRunJarRuntimeCPEntry(jbs));
addJREEntry(classpath, jbrt.getVM());
String version = jbs.getServer().getRuntime().getRuntimeType().getVersion();
@@ -180,7 +206,12 @@
}
- public static String getDefaultArgs(JBossServer jbs) throws CoreException {
+ protected static IRuntimeClasspathEntry getRunJarRuntimeCPEntry(JBossServer jbs) throws
CoreException {
+ IPath containerPath = new
Path(RunJarContainerWrapper.ID).append(jbs.getServer().getName());
+ return JavaRuntime.newRuntimeContainerClasspathEntry(containerPath,
IRuntimeClasspathEntry.USER_CLASSES);
+ }
+
+ protected static String getDefaultArgs(JBossServer jbs) throws CoreException {
IJBossServerRuntime rt = findJBossServerRuntime(jbs.getServer());
if (rt != null) {
return rt.getDefaultRunArgs() + " -b " + jbs.getServer().getHost();
@@ -264,4 +295,36 @@
wc.setAttribute(SERVER_ID, server.getId());
return wc;
}
+
+ /* For "restore defaults" functionality */
+ private static final String DEFAULT_CP_PROVIDER_ID =
"org.jboss.ide.eclipse.as.core.server.internal.launch.serverClasspathProvider";
+ public static class JBossServerDefaultClasspathProvider extends
StandardClasspathProvider {
+ public IRuntimeClasspathEntry[] computeUnresolvedClasspath(ILaunchConfiguration
configuration) throws CoreException {
+ boolean useDefault =
configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH,
true);
+ if (useDefault) {
+ return defaultEntries(configuration);
+ }
+ return super.computeUnresolvedClasspath(configuration);
+ }
+
+ protected IRuntimeClasspathEntry[] defaultEntries(ILaunchConfiguration config) {
+ try {
+ String server = config.getAttribute(SERVER_ID, (String)null);
+ IServer s = ServerCore.findServer(server);
+ IJBossServerRuntime ibjsrt =
(IJBossServerRuntime)s.getRuntime().loadAdapter(IJBossServerRuntime.class, new
NullProgressMonitor());
+ JBossServer jbs = (JBossServer)s.loadAdapter(JBossServer.class, new
NullProgressMonitor());
+ IVMInstall install = ibjsrt.getVM();
+ ArrayList<IRuntimeClasspathEntry> list = new
ArrayList<IRuntimeClasspathEntry>();
+ addJREEntry(list, install);
+ list.add(getRunJarRuntimeCPEntry(jbs));
+ return (IRuntimeClasspathEntry[]) list
+ .toArray(new IRuntimeClasspathEntry[list.size()]);
+ } catch( CoreException ce) {
+ }
+ try {
+ return super.computeUnresolvedClasspath(config);
+ } catch( CoreException ce ) {}
+ return new IRuntimeClasspathEntry[]{};
+ }
+ }
}
Added:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/RunJarContainerWrapper.java
===================================================================
---
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/RunJarContainerWrapper.java
(rev 0)
+++
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/internal/launch/RunJarContainerWrapper.java 2009-02-11
09:44:49 UTC (rev 13577)
@@ -0,0 +1,98 @@
+package org.jboss.ide.eclipse.as.core.server.internal.launch;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.jdt.core.ClasspathContainerInitializer;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
+import org.eclipse.jdt.launching.IVMInstall;
+import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.IServer;
+import org.eclipse.wst.server.core.ServerCore;
+
+public class RunJarContainerWrapper {
+ public static final String ID =
"org.jboss.ide.eclipse.as.core.server.internal.launch.runJarContainer";
+ public static final String RESOLVER_ID =
"org.jboss.ide.eclipse.as.core.server.internal.launch.runtimeCPEResolver";
+
+ public static class RunJarContainerInitializer extends ClasspathContainerInitializer {
+ public void initialize(IPath containerPath, IJavaProject project)
+ throws CoreException {
+ RunJarContainer container = new RunJarContainer(containerPath);
+ JavaCore.setClasspathContainer(containerPath,
+ new IJavaProject[] {project}, new IClasspathContainer[] {container}, null);
+ }
+ }
+
+ public static class RunJarResolver implements
org.eclipse.jdt.launching.IRuntimeClasspathEntryResolver {
+
+ public IRuntimeClasspathEntry[] resolveRuntimeClasspathEntry(
+ IRuntimeClasspathEntry entry, ILaunchConfiguration configuration)
+ throws CoreException {
+ IPath p = entry.getPath();
+ IClasspathEntry[] entries = new RunJarContainer(p).getClasspathEntries();
+ IRuntimeClasspathEntry[] rtEntries = new IRuntimeClasspathEntry[entries.length];
+ for( int i = 0; i < entries.length; i++ ) {
+ rtEntries[i] = JavaRuntime.newArchiveRuntimeClasspathEntry(entries[i].getPath());
+ }
+ return rtEntries;
+ }
+
+ public IRuntimeClasspathEntry[] resolveRuntimeClasspathEntry(
+ IRuntimeClasspathEntry entry, IJavaProject project)
+ throws CoreException {
+ return null;
+ }
+
+ public IVMInstall resolveVMInstall(IClasspathEntry entry)
+ throws CoreException {
+ return null;
+ }
+
+ }
+
+ public static class RunJarContainer implements IClasspathContainer {
+ protected IPath path;
+ public RunJarContainer(IPath path) {
+ this.path = path;
+ }
+
+ public IClasspathEntry[] getClasspathEntries() {
+ String name = path.segment(1);
+ IServer[] servers = ServerCore.getServers();
+ IServer s = null;
+ for( int i = 0; i < servers.length; i++ ) {
+ if( servers[i].getName().equals(name))
+ s = servers[i];
+ }
+ if( s != null ) {
+ IRuntime rt = s.getRuntime();
+ IPath home = rt.getLocation();
+ IPath runJar = home.append(JBossServerStartupLaunchConfiguration.START_JAR_LOC);
+
+ return new IClasspathEntry[] {
+ JavaRuntime.newArchiveRuntimeClasspathEntry(
+ runJar).getClasspathEntry()
+ };
+ }
+ return new IClasspathEntry[]{};
+ }
+
+ public String getDescription() {
+ return "Test Desc";
+ }
+
+ public int getKind() {
+ return K_APPLICATION;
+ }
+
+ public IPath getPath() {
+ return path;
+ }
+
+ }
+}
Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/plugin.xml
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/plugin.xml 2009-02-11 00:15:46 UTC (rev
13576)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/plugin.xml 2009-02-11 09:44:49 UTC (rev
13577)
@@ -706,4 +706,26 @@
class="org.jboss.ide.eclipse.as.core.extensions.jmx.JBossServerConnectionProvider">
</connectionProvider>
</extension>
+ <extension
+ point="org.eclipse.jdt.core.classpathContainerInitializer">
+ <classpathContainerInitializer
+
class="org.jboss.ide.eclipse.as.core.server.internal.launch.RunJarContainerWrapper$RunJarContainerInitializer"
+
id="org.jboss.ide.eclipse.as.core.server.internal.launch.runJarContainer">
+ </classpathContainerInitializer>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.launching.runtimeClasspathEntryResolvers">
+ <runtimeClasspathEntryResolver
+
class="org.jboss.ide.eclipse.as.core.server.internal.launch.RunJarContainerWrapper$RunJarResolver"
+
container="org.jboss.ide.eclipse.as.core.server.internal.launch.runJarContainer"
+
id="org.jboss.ide.eclipse.as.core.server.internal.launch.runJarContainer.resolver">
+ </runtimeClasspathEntryResolver>
+ </extension>
+ <extension
+ point="org.eclipse.jdt.launching.classpathProviders">
+ <classpathProvider
+
class="org.jboss.ide.eclipse.as.core.server.internal.launch.JBossServerStartupLaunchConfiguration$JBossServerDefaultClasspathProvider"
+
id="org.jboss.ide.eclipse.as.core.server.internal.launch.serverClasspathProvider">
+ </classpathProvider>
+ </extension>
</plugin>