### Eclipse Workspace Patch 1.0
#P org.eclipse.ui.ide
Index: src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java,v
retrieving revision 1.21
diff -u -r1.21 ChooseWorkspaceData.java
--- src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java 24 Mar 2008 19:13:35 -0000 1.21
+++ src/org/eclipse/ui/internal/ide/ChooseWorkspaceData.java 2 Jul 2008 20:29:53 -0000
@@ -69,7 +69,7 @@
/**
* This is the second version of the encode/decode protocol that uses the
* confi area preferences store for persistence. This version is the same as
- * the previous version except it uses a \n character to seperate the path
+ * the previous version except it uses a \n character to separate the path
* entries instead of commas. (see bug 98467)
*
* @since 3.3.1
@@ -83,6 +83,18 @@
private String selection;
private String[] recentWorkspaces;
+
+ /**
+ * The port on which an instance of this configuration is already listening for remote communication.
+ * This value is 0 if nobody is already listening.
+ */
+ private int port = 0;
+ /**
+ * An authorization integer that a client must provide when communication with
+ * this application. This is a simple security measure to prevent a port scanner
+ * from executing commands in this application.
+ */
+ private int ipcAuth = 0;
// xml tags
private static interface XML {
@@ -101,7 +113,11 @@
public static final String MAX_LENGTH = "maxLength"; //$NON-NLS-1$
public static final String PATH = "path"; //$NON-NLS-1$
- }
+
+ public static final String PORT= "port"; //$NON-NLS-1$
+
+ public static final String IPC_AUTH= "ipcAuth"; //$NON-NLS-1$
+}
/**
* Creates a new instance, loading persistent data if its found.
@@ -151,6 +167,23 @@
}
initialDefault = dir;
}
+
+ /**
+ * Sets the port on which an instance is listening for remote communication.
+ * @param port The port, or 0 to indicate not listening.
+ */
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ /**
+ * Sets an authorization integer that a client must provide to establish
+ * remote communication. This is used to prevent a port sniffer from
+ * executing commands.
+ */
+ public void setIPCAuthorization(int auth) {
+ this.ipcAuth = auth;
+ }
/**
* Return the currently selected workspace or null if nothing is selected.
@@ -173,6 +206,23 @@
public String[] getRecentWorkspaces() {
return recentWorkspaces;
}
+
+ /**
+ * Returns the port on which an instance of this same configuration is
+ * already listening for remote communication, or 0 if nobody is listening.
+ * @return The port number, or 0.
+ */
+ public int getPort() {
+ return port;
+ }
+
+ /**
+ * Returns the authorization integer for establishing interprocess communication.
+ * @return The authorization integer
+ */
+ public int getIPCAuthorization() {
+ return ipcAuth;
+ }
/**
* The argument workspace has been selected, update the receiver. Does not
@@ -230,8 +280,14 @@
// 5. store the protocol version used to encode the list
node.putInt(IDE.Preferences.RECENT_WORKSPACES_PROTOCOL,
PERS_ENCODING_VERSION_CONFIG_PREFS_NO_COMMAS);
+
+ // 6. store the interprocess communication data, if any
+ if (port != 0) {
+ node.putInt(XML.PORT, port);
+ node.putInt(XML.IPC_AUTH, ipcAuth);
+ }
- // 6. store the node
+ // 7. store the node
try {
node.flush();
} catch (BackingStoreException e) {
@@ -405,6 +461,10 @@
.getString(IDE.Preferences.RECENT_WORKSPACES);
recentWorkspaces = decodeStoredWorkspacePaths(protocol, max, workspacePathPref);
+ // 5. load the interprocess communication data
+ port = store.getInt(XML.PORT);
+ ipcAuth = store.getInt(XML.IPC_AUTH);
+
return true;
}
#P org.eclipse.ui.ide.application
Index: META-INF/MANIFEST.MF
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF,v
retrieving revision 1.8
diff -u -r1.8 MANIFEST.MF
--- META-INF/MANIFEST.MF 1 May 2008 14:01:17 -0000 1.8
+++ META-INF/MANIFEST.MF 2 Jul 2008 20:29:53 -0000
@@ -13,7 +13,8 @@
org.eclipse.ui.navigator.resources;bundle-version="[3.2.100,4.0.0)",
org.eclipse.core.net;bundle-version="[1.0.0,2.0.0)",
org.eclipse.update.core;bundle-version="[3.1.100,4.0.0)",
- com.ibm.icu;bundle-version="3.8.1"
+ com.ibm.icu;bundle-version="3.8.1",
+ org.eclipse.core.filesystem;bundle-version="1.2.0"
Export-Package: org.eclipse.ui.internal.ide.application;x-internal:=true,
org.eclipse.ui.internal.ide.application.dialogs;x-internal:=true
Bundle-RequiredExecutionEnvironment: J2SE-1.4
Index: src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java,v
retrieving revision 1.13
diff -u -r1.13 IDEWorkbenchAdvisor.java
--- src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java 1 May 2008 14:01:17 -0000 1.13
+++ src/org/eclipse/ui/internal/ide/application/IDEWorkbenchAdvisor.java 2 Jul 2008 20:29:53 -0000
@@ -10,34 +10,18 @@
*******************************************************************************/
package org.eclipse.ui.internal.ide.application;
+import org.eclipse.ui.PartInitException;
+
+import com.ibm.icu.text.Collator;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
+import java.util.*;
+import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.net.proxy.IProxyService;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.resources.WorkspaceJob;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IBundleGroup;
-import org.eclipse.core.runtime.IBundleGroupProvider;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.TrayDialog;
+import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
@@ -46,23 +30,11 @@
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.application.IWorkbenchConfigurer;
-import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
-import org.eclipse.ui.application.WorkbenchAdvisor;
-import org.eclipse.ui.application.WorkbenchWindowAdvisor;
+import org.eclipse.ui.*;
+import org.eclipse.ui.application.*;
import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.ISelectionConversionService;
-import org.eclipse.ui.internal.PluginActionBuilder;
-import org.eclipse.ui.internal.Workbench;
-import org.eclipse.ui.internal.ide.AboutInfo;
-import org.eclipse.ui.internal.ide.IDEInternalPreferences;
-import org.eclipse.ui.internal.ide.IDEInternalWorkbenchImages;
-import org.eclipse.ui.internal.ide.IDESelectionConversionService;
-import org.eclipse.ui.internal.ide.IDEWorkbenchActivityHelper;
-import org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
+import org.eclipse.ui.internal.*;
+import org.eclipse.ui.internal.ide.*;
import org.eclipse.ui.internal.ide.model.WorkbenchAdapterBuilder;
import org.eclipse.ui.internal.ide.undo.WorkspaceUndoMonitor;
import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog;
@@ -70,11 +42,7 @@
import org.eclipse.ui.statushandlers.AbstractStatusHandler;
import org.eclipse.ui.statushandlers.StatusManager;
import org.eclipse.update.core.SiteManager;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.Version;
-
-import com.ibm.icu.text.Collator;
+import org.osgi.framework.*;
/**
* IDE-specified workbench advisor which configures the workbench for use as an
@@ -128,7 +96,7 @@
private IDEIdleHelper idleHelper;
private Listener settingsChangeListener;
-
+
/**
* Support class for monitoring workspace changes and periodically
* validating the undo history
@@ -140,6 +108,10 @@
*/
private AbstractStatusHandler ideWorkbenchErrorHandler;
+ static IDEWorkbenchAdvisor getInstance() {
+ return workbenchAdvisor;
+ }
+
/**
* Creates a new workbench advisor instance.
*/
@@ -159,7 +131,7 @@
public void initialize(IWorkbenchConfigurer configurer) {
PluginActionBuilder.setAllowIdeLogging(true);
-
+
// make sure we always save and restore workspace state
configurer.setSaveAndRestore(true);
@@ -186,7 +158,6 @@
}
}
- // register shared images
declareWorkbenchImages();
// initialize the activity helper
@@ -194,7 +165,7 @@
// initialize idle handler
idleHelper = new IDEIdleHelper(configurer);
-
+
// initialize the workspace undo monitor
workspaceUndoMonitor = WorkspaceUndoMonitor.getInstance();
@@ -215,14 +186,10 @@
Job.getJobManager().suspend();
// Register the build actions
- IProgressService service = PlatformUI.getWorkbench()
- .getProgressService();
- ImageDescriptor newImage = IDEInternalWorkbenchImages
- .getImageDescriptor(IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC);
- service.registerIconForFamily(newImage,
- ResourcesPlugin.FAMILY_MANUAL_BUILD);
- service.registerIconForFamily(newImage,
- ResourcesPlugin.FAMILY_AUTO_BUILD);
+ IProgressService service = PlatformUI.getWorkbench().getProgressService();
+ ImageDescriptor newImage = IDEInternalWorkbenchImages.getImageDescriptor(IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC);
+ service.registerIconForFamily(newImage, ResourcesPlugin.FAMILY_MANUAL_BUILD);
+ service.registerIconForFamily(newImage, ResourcesPlugin.FAMILY_AUTO_BUILD);
}
/*
@@ -235,19 +202,50 @@
refreshFromLocal();
activateProxyService();
checkUpdates();
- ((Workbench) PlatformUI.getWorkbench()).registerService(
- ISelectionConversionService.class,
- new IDESelectionConversionService());
+ ((Workbench) PlatformUI.getWorkbench()).registerService(ISelectionConversionService.class, new IDESelectionConversionService());
initializeSettingsChangeListener();
- Display.getCurrent().addListener(SWT.Settings,
- settingsChangeListener);
+ Display.getCurrent().addListener(SWT.Settings, settingsChangeListener);
+ runStartupCommand(Platform.getCommandLineArgs());
} finally {// Resume background jobs after we startup
Job.getJobManager().resume();
}
}
/**
+ * Runs a command specified on the command line, if any
+ */
+ boolean runStartupCommand(String[] arguments) {
+ if (arguments.length == 0)
+ return false;
+ //if the last command line argument is a file, open that file in an editor
+ final IPath path = new Path(arguments[arguments.length - 1]);
+ if (!path.toFile().exists())
+ return false;
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window == null) {
+ IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
+ if (windows.length > 0)
+ window = windows[0];
+ }
+ if (window == null)
+ return false;
+ final IWorkbenchPage page = window.getActivePage();
+ if (page == null)
+ return false;
+ window.getShell().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ try {
+ IDE.openEditorOnFileStore(page, EFS.getLocalFileSystem().getStore(path));
+ } catch (PartInitException e) {
+ IDEWorkbenchPlugin.log("Error opening editor on path: " + path, e); //$NON-NLS-1$
+ }
+ }
+ });
+ return true;
+ }
+
+ /**
* Activate the proxy service by obtaining it.
*/
private void activateProxyService() {
@@ -260,7 +258,7 @@
}
if (proxyService == null) {
IDEWorkbenchPlugin.log("Proxy service could not be found."); //$NON-NLS-1$
- }
+ }
}
/**
@@ -269,8 +267,7 @@
private void initializeSettingsChangeListener() {
settingsChangeListener = new Listener() {
- boolean currentHighContrast = Display.getCurrent()
- .getHighContrast();
+ boolean currentHighContrast = Display.getCurrent().getHighContrast();
public void handleEvent(org.eclipse.swt.widgets.Event event) {
if (Display.getCurrent().getHighContrast() == currentHighContrast)
@@ -279,13 +276,7 @@
currentHighContrast = !currentHighContrast;
// make sure they really want to do this
- if (new MessageDialog(null,
- IDEWorkbenchMessages.SystemSettingsChange_title, null,
- IDEWorkbenchMessages.SystemSettingsChange_message,
- MessageDialog.QUESTION, new String[] {
- IDEWorkbenchMessages.SystemSettingsChange_yes,
- IDEWorkbenchMessages.SystemSettingsChange_no },
- 1).open() == Window.OK) {
+ if (new MessageDialog(null, IDEWorkbenchMessages.SystemSettingsChange_title, null, IDEWorkbenchMessages.SystemSettingsChange_message, MessageDialog.QUESTION, new String[] {IDEWorkbenchMessages.SystemSettingsChange_yes, IDEWorkbenchMessages.SystemSettingsChange_no}, 1).open() == Window.OK) {
PlatformUI.getWorkbench().restart();
}
}
@@ -322,8 +313,7 @@
* @see org.eclipse.ui.application.WorkbenchAdvisor#preShutdown()
*/
public boolean preShutdown() {
- Display.getCurrent().removeListener(SWT.Settings,
- settingsChangeListener);
+ Display.getCurrent().removeListener(SWT.Settings, settingsChangeListener);
return super.preShutdown();
}
@@ -332,8 +322,7 @@
*
* @see org.eclipse.ui.application.WorkbenchAdvisor#createWorkbenchWindowAdvisor(org.eclipse.ui.application.IWorkbenchWindowConfigurer)
*/
- public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
- IWorkbenchWindowConfigurer configurer) {
+ public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
return new IDEWorkbenchWindowAdvisor(this, configurer);
}
@@ -343,16 +332,13 @@
* @return boolean
*/
public boolean hasIntro() {
- return getWorkbenchConfigurer().getWorkbench().getIntroManager()
- .hasIntro();
+ return getWorkbenchConfigurer().getWorkbench().getIntroManager().hasIntro();
}
private void refreshFromLocal() {
String[] commandLineArgs = Platform.getCommandLineArgs();
- IPreferenceStore store = IDEWorkbenchPlugin.getDefault()
- .getPreferenceStore();
- boolean refresh = store
- .getBoolean(IDEInternalPreferences.REFRESH_WORKSPACE_ON_STARTUP);
+ IPreferenceStore store = IDEWorkbenchPlugin.getDefault().getPreferenceStore();
+ boolean refresh = store.getBoolean(IDEInternalPreferences.REFRESH_WORKSPACE_ON_STARTUP);
if (!refresh) {
return;
}
@@ -366,8 +352,7 @@
final IContainer root = ResourcesPlugin.getWorkspace().getRoot();
Job job = new WorkspaceJob(IDEWorkbenchMessages.Workspace_refreshing) {
- public IStatus runInWorkspace(IProgressMonitor monitor)
- throws CoreException {
+ public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
root.refreshLocal(IResource.DEPTH_INFINITE, monitor);
return Status.OK_STATUS;
}
@@ -381,14 +366,11 @@
*/
private void disconnectFromWorkspace() {
// save the workspace
- final MultiStatus status = new MultiStatus(
- IDEWorkbenchPlugin.IDE_WORKBENCH, 1,
- IDEWorkbenchMessages.ProblemSavingWorkbench, null);
+ final MultiStatus status = new MultiStatus(IDEWorkbenchPlugin.IDE_WORKBENCH, 1, IDEWorkbenchMessages.ProblemSavingWorkbench, null);
IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
try {
- status.merge(ResourcesPlugin.getWorkspace().save(true,
- monitor));
+ status.merge(ResourcesPlugin.getWorkspace().save(true, monitor));
} catch (CoreException e) {
status.merge(e.getStatus());
}
@@ -397,22 +379,13 @@
try {
new ProgressMonitorJobsDialog(null).run(true, false, runnable);
} catch (InvocationTargetException e) {
- status
- .merge(new Status(IStatus.ERROR,
- IDEWorkbenchPlugin.IDE_WORKBENCH, 1,
- IDEWorkbenchMessages.InternalError, e
- .getTargetException()));
+ status.merge(new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH, 1, IDEWorkbenchMessages.InternalError, e.getTargetException()));
} catch (InterruptedException e) {
- status.merge(new Status(IStatus.ERROR,
- IDEWorkbenchPlugin.IDE_WORKBENCH, 1,
- IDEWorkbenchMessages.InternalError, e));
- }
- ErrorDialog.openError(null,
- IDEWorkbenchMessages.ProblemsSavingWorkspace, null, status,
- IStatus.ERROR | IStatus.WARNING);
+ status.merge(new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH, 1, IDEWorkbenchMessages.InternalError, e));
+ }
+ ErrorDialog.openError(null, IDEWorkbenchMessages.ProblemsSavingWorkspace, null, status, IStatus.ERROR | IStatus.WARNING);
if (!status.isOK()) {
- IDEWorkbenchPlugin.log(
- IDEWorkbenchMessages.ProblemsSavingWorkspace, status);
+ IDEWorkbenchPlugin.log(IDEWorkbenchMessages.ProblemsSavingWorkspace, status);
}
}
@@ -519,8 +492,7 @@
*/
private Map createNewBundleGroupsMap() {
// retrieve list of installed bundle groups from last session
- IDialogSettings settings = IDEWorkbenchPlugin.getDefault()
- .getDialogSettings();
+ IDialogSettings settings = IDEWorkbenchPlugin.getDefault().getDialogSettings();
String[] previousFeaturesArray = settings.getArray(INSTALLED_FEATURES);
// get a map of currently installed bundle groups and store it for next
@@ -573,85 +545,41 @@
Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH);
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC, PATH_ETOOL
- + "build_exec.gif", false); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_HOVER,
- PATH_ETOOL + "build_exec.gif", false); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_DISABLED,
- PATH_DTOOL + "build_exec.gif", false); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC, PATH_ETOOL
- + "search_src.gif", false); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_HOVER,
- PATH_ETOOL + "search_src.gif", false); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_DISABLED,
- PATH_DTOOL + "search_src.gif", false); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_ETOOL_NEXT_NAV, PATH_ETOOL
- + "next_nav.gif", false); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_ETOOL_PREVIOUS_NAV, PATH_ETOOL
- + "prev_nav.gif", false); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_WIZBAN_NEWPRJ_WIZ, PATH_WIZBAN
- + "newprj_wiz.png", false); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFOLDER_WIZ,
- PATH_WIZBAN + "newfolder_wiz.png", false); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFILE_WIZ, PATH_WIZBAN
- + "newfile_wiz.png", false); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTDIR_WIZ,
- PATH_WIZBAN + "importdir_wiz.png", false); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTZIP_WIZ,
- PATH_WIZBAN + "importzip_wiz.png", false); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTDIR_WIZ,
- PATH_WIZBAN + "exportdir_wiz.png", false); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTZIP_WIZ,
- PATH_WIZBAN + "exportzip_wiz.png", false); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_WIZBAN_RESOURCEWORKINGSET_WIZ,
- PATH_WIZBAN + "workset_wiz.png", false); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_DLGBAN_SAVEAS_DLG, PATH_WIZBAN
- + "saveas_wiz.png", false); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_DLGBAN_QUICKFIX_DLG, PATH_WIZBAN
- + "quick_fix.png", false); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT,
- PATH_OBJECT + "prj_obj.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT
- + "cprj_obj.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OPEN_MARKER,
- PATH_ELOCALTOOL + "gotoobj_tsk.gif", true); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_ELCL_QUICK_FIX_ENABLED,
- PATH_ELOCALTOOL + "smartmode_co.gif", true); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_DLCL_QUICK_FIX_DISABLED,
- PATH_DLOCALTOOL + "smartmode_co.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC, PATH_ETOOL + "build_exec.gif", false); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_HOVER, PATH_ETOOL + "build_exec.gif", false); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_BUILD_EXEC_DISABLED, PATH_DTOOL + "build_exec.gif", false); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC, PATH_ETOOL + "search_src.gif", false); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_HOVER, PATH_ETOOL + "search_src.gif", false); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_SEARCH_SRC_DISABLED, PATH_DTOOL + "search_src.gif", false); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_NEXT_NAV, PATH_ETOOL + "next_nav.gif", false); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_PREVIOUS_NAV, PATH_ETOOL + "prev_nav.gif", false); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_WIZBAN_NEWPRJ_WIZ, PATH_WIZBAN + "newprj_wiz.png", false); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFOLDER_WIZ, PATH_WIZBAN + "newfolder_wiz.png", false); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_WIZBAN_NEWFILE_WIZ, PATH_WIZBAN + "newfile_wiz.png", false); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTDIR_WIZ, PATH_WIZBAN + "importdir_wiz.png", false); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_WIZBAN_IMPORTZIP_WIZ, PATH_WIZBAN + "importzip_wiz.png", false); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTDIR_WIZ, PATH_WIZBAN + "exportdir_wiz.png", false); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_WIZBAN_EXPORTZIP_WIZ, PATH_WIZBAN + "exportzip_wiz.png", false); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_WIZBAN_RESOURCEWORKINGSET_WIZ, PATH_WIZBAN + "workset_wiz.png", false); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_DLGBAN_SAVEAS_DLG, PATH_WIZBAN + "saveas_wiz.png", false); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_DLGBAN_QUICKFIX_DLG, PATH_WIZBAN + "quick_fix.png", false); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT, PATH_OBJECT + "prj_obj.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT_CLOSED, PATH_OBJECT + "cprj_obj.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OPEN_MARKER, PATH_ELOCALTOOL + "gotoobj_tsk.gif", true); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ELCL_QUICK_FIX_ENABLED, PATH_ELOCALTOOL + "smartmode_co.gif", true); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_DLCL_QUICK_FIX_DISABLED, PATH_DLOCALTOOL + "smartmode_co.gif", true); //$NON-NLS-1$
// task objects
// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_HPRIO_TSK,
@@ -661,43 +589,21 @@
// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_LPRIO_TSK,
// PATH_OBJECT+"lprio_tsk.gif");
- declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_TASK_TSK,
- PATH_OBJECT + "taskmrk_tsk.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_BKMRK_TSK,
- PATH_OBJECT + "bkmrk_tsk.gif", true); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_OBJS_COMPLETE_TSK, PATH_OBJECT
- + "complete_tsk.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_OBJS_INCOMPLETE_TSK, PATH_OBJECT
- + "incomplete_tsk.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_ITEM, PATH_OBJECT
- + "welcome_item.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_BANNER, PATH_OBJECT
- + "welcome_banner.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH, PATH_OBJECT
- + "error_tsk.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH, PATH_OBJECT
- + "warn_tsk.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH, PATH_OBJECT
- + "info_tsk.gif", true); //$NON-NLS-1$
-
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_LCL_FLAT_LAYOUT, PATH_ELOCALTOOL
- + "flatLayout.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_LCL_HIERARCHICAL_LAYOUT,
- PATH_ELOCALTOOL + "hierarchicalLayout.gif", true); //$NON-NLS-1$
- declareWorkbenchImage(ideBundle,
- IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEM_CATEGORY,
- PATH_ETOOL + "problem_category.gif", true); //$NON-NLS-1$
-
+ declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_TASK_TSK, PATH_OBJECT + "taskmrk_tsk.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDE.SharedImages.IMG_OBJS_BKMRK_TSK, PATH_OBJECT + "bkmrk_tsk.gif", true); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_COMPLETE_TSK, PATH_OBJECT + "complete_tsk.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_INCOMPLETE_TSK, PATH_OBJECT + "incomplete_tsk.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_ITEM, PATH_OBJECT + "welcome_item.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_WELCOME_BANNER, PATH_OBJECT + "welcome_banner.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_ERROR_PATH, PATH_OBJECT + "error_tsk.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_WARNING_PATH, PATH_OBJECT + "warn_tsk.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_OBJS_INFO_PATH, PATH_OBJECT + "info_tsk.gif", true); //$NON-NLS-1$
+
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_LCL_FLAT_LAYOUT, PATH_ELOCALTOOL + "flatLayout.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_LCL_HIERARCHICAL_LAYOUT, PATH_ELOCALTOOL + "hierarchicalLayout.gif", true); //$NON-NLS-1$
+ declareWorkbenchImage(ideBundle, IDEInternalWorkbenchImages.IMG_ETOOL_PROBLEM_CATEGORY, PATH_ETOOL + "problem_category.gif", true); //$NON-NLS-1$
+
// synchronization indicator objects
// declareRegistryImage(IDEInternalWorkbenchImages.IMG_OBJS_WBET_STAT,
// PATH_OVERLAY+"wbet_stat.gif");
@@ -728,8 +634,7 @@
* false
if this is not a shared image
* @see IWorkbenchConfigurer#declareImage
*/
- private void declareWorkbenchImage(Bundle ideBundle, String symbolicName,
- String path, boolean shared) {
+ private void declareWorkbenchImage(Bundle ideBundle, String symbolicName, String path, boolean shared) {
URL url = FileLocator.find(ideBundle, new Path(path), null);
ImageDescriptor desc = ImageDescriptor.createFromURL(url);
getWorkbenchConfigurer().declareImage(symbolicName, desc, shared);
@@ -765,8 +670,7 @@
ArrayList list = new ArrayList(m.size());
for (Iterator i = m.values().iterator(); i.hasNext();) {
AboutInfo info = (AboutInfo) i.next();
- if (info != null && info.getWelcomePerspectiveId() != null
- && info.getWelcomePageURL() != null) {
+ if (info != null && info.getWelcomePerspectiveId() != null && info.getWelcomePageURL() != null) {
list.add(info);
}
}
@@ -784,8 +688,7 @@
*/
public AbstractStatusHandler getWorkbenchErrorHandler() {
if (ideWorkbenchErrorHandler == null) {
- ideWorkbenchErrorHandler = new IDEWorkbenchErrorHandler(
- getWorkbenchConfigurer());
+ ideWorkbenchErrorHandler = new IDEWorkbenchErrorHandler(getWorkbenchConfigurer());
}
return ideWorkbenchErrorHandler;
}
Index: src/org/eclipse/ui/internal/ide/application/IDEApplication.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEApplication.java,v
retrieving revision 1.7
diff -u -r1.7 IDEApplication.java
--- src/org/eclipse/ui/internal/ide/application/IDEApplication.java 3 Jun 2008 17:56:02 -0000 1.7
+++ src/org/eclipse/ui/internal/ide/application/IDEApplication.java 2 Jul 2008 20:29:53 -0000
@@ -105,7 +105,7 @@
Platform.endSplash();
return EXIT_OK;
}
-
+
// create the workbench with this advisor and run it until it exits
// N.B. createWorkbench remembers the advisor, and also registers
// the workbench globally so that all UI plug-ins can find it using
@@ -217,6 +217,15 @@
// -data @noDefault or -data not specified, prompt and set
ChooseWorkspaceData launchData = new ChooseWorkspaceData(instanceLoc
.getDefault());
+
+ //check if someone is listening that we can pass our command line to
+ if (launchData.getPort() != 0) {
+ if (new IDECommunication().writeToPort(launchData.getPort(), launchData.getIPCAuthorization())) {
+ //we successfully punted this application's command line to another instance,
+ //so we can just shutdown this instance.
+ return false;
+ }
+ }
boolean force = false;
while (true) {
@@ -233,6 +242,11 @@
// the operation will fail if the url is not a valid
// instance data area, so other checking is unneeded
if (instanceLoc.setURL(workspaceUrl, true)) {
+ int[] ipcData = new IDECommunication().listen();
+ if (ipcData != null) {
+ launchData.setPort(ipcData[0]);
+ launchData.setIPCAuthorization(ipcData[1]);
+ }
launchData.writePersistedData();
writeWorkspaceVersion();
return true;
Index: src/org/eclipse/ui/internal/ide/application/IDECommunication.java
===================================================================
RCS file: src/org/eclipse/ui/internal/ide/application/IDECommunication.java
diff -N src/org/eclipse/ui/internal/ide/application/IDECommunication.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/ui/internal/ide/application/IDECommunication.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2008 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.ui.internal.ide.application;
+
+import java.security.SecureRandom;
+
+import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
+
+import java.io.*;
+import java.net.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.jobs.Job;
+
+/**
+ * A helper class that deals with interprocess communication between applications.
+ *
+ * This class uses a socket connection on a random available port to establish
+ * communication between applications. The client must provide an authorization
+ * code to protect against communication from arbitrary port sniffing applications.
+ *
+ * @since 3.5
+ */
+class IDECommunication {
+ /**
+ * A job that listens on a socket for a command, and then invokes the
+ * workbench advisor to handle the command.
+ */
+ class ListenJob extends Job {
+ private ServerSocket server;
+ private int auth;
+
+ public ListenJob(ServerSocket server, int auth) {
+ super("Listen"); //$NON-NLS-1$
+ this.server = server;
+ this.auth = auth;
+ setSystem(true);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#canceling()
+ */
+ protected void canceling() {
+ try {
+ server.close();
+ } catch (IOException e) {
+ //ignore
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
+ */
+ protected IStatus run(IProgressMonitor monitor) {
+ if (server.isClosed())
+ return Status.OK_STATUS;
+ Socket client = null;
+ DataInputStream in = null;
+ DataOutputStream out = null;
+ try {
+ client = server.accept();
+ in = new DataInputStream(client.getInputStream());
+ out = new DataOutputStream(client.getOutputStream());
+ //read the protocol version
+ int version = in.readInt();
+ String[] args = null;
+ if (version == PROTOCOL_VERSION_ONE) {
+ //read the authorization checksum
+ int receivedAuth = in.readInt();
+ //abort immediately if we failed to read the authorization integer
+ if (receivedAuth != auth) {
+ schedule(SCHEDULE_DELAY);
+ return new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH, "Connection from unauthorized client on port " + server.getLocalPort()); //$NON-NLS-1$
+ }
+ args = new String[in.readInt()];
+ for (int i = 0; i < args.length; i++) {
+ args[i] = in.readUTF();
+ }
+ }
+ //pass the read arguments to the workbench advisor
+ IDEWorkbenchAdvisor advisor = IDEWorkbenchAdvisor.getInstance();
+ if (advisor != null && args != null) {
+ if (advisor.runStartupCommand(args))
+ out.writeUTF(OK);
+ else
+ out.writeUTF(FAIL);
+ }
+ } catch (IOException e) {
+ IDEWorkbenchPlugin.log("Error communicating with client", e); //$NON-NLS-1$
+ } finally {
+ safeClose(in);
+ safeClose(out);
+ safeClose(client);
+ }
+ //reschedule
+ schedule(SCHEDULE_DELAY);
+ return Status.OK_STATUS;
+ }
+ }
+
+ /**
+ * The first communication protocol version. This version contains an authorization
+ * integer followed by a list of command line arguments. The format is: int authorizationId, int N, String[N].
+ */
+ private static final int PROTOCOL_VERSION_ONE = 1;
+
+ private static final long SCHEDULE_DELAY = 1000;
+
+ static final String OK = "OK"; //$NON-NLS-1$
+ static final String FAIL = "FAIL"; //$NON-NLS-1$
+
+ /**
+ * Start listening for commands.
+ * @return An integer array of size two. The first integer is the port
+ * number we are listening on, and the second integer is an authorization
+ * integer used to validate connections. Returns null
if
+ * there was a failure to establish communication
+ */
+ public int[] listen() {
+ try {
+ ServerSocket server = new ServerSocket(0);
+ int auth = new SecureRandom().nextInt();
+ new ListenJob(server, auth).schedule(SCHEDULE_DELAY);
+ return new int[] {server.getLocalPort(), auth};
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ /**
+ * Close the given stream and ignore secondary failures.
+ */
+ void safeClose(DataInputStream in) {
+ try {
+ if (in != null)
+ in.close();
+ } catch (IOException e) {
+ //ignore secondary failure while closing
+ }
+ }
+
+ /**
+ * Close the given stream and ignore secondary failures.
+ */
+ void safeClose(DataOutputStream out) {
+ try {
+ if (out != null)
+ out.close();
+ } catch (IOException e) {
+ //ignore secondary failure while closing
+ }
+ }
+
+ /**
+ * Close the given socket and ignore secondary failures.
+ */
+ void safeClose(Socket socket) {
+ try {
+ if (socket != null)
+ socket.close();
+ } catch (IOException e) {
+ //ignore secondary failure while closing
+ }
+ }
+
+ /**
+ * Writes this application's command line arguments to the given port.
+ *
+ * @param port The port to write data to
+ * @param auth The authorization integer
+ * @return true
if written successfully, and false
otherwise.
+ */
+ public boolean writeToPort(int port, int auth) {
+ Socket socket = null;
+ DataOutputStream out = null;
+ DataInputStream in = null;
+ try {
+ socket = new Socket("localhost", port);//$NON-NLS-1$
+ out = new DataOutputStream(socket.getOutputStream());
+ in = new DataInputStream(socket.getInputStream());
+ out.writeInt(PROTOCOL_VERSION_ONE);
+ out.writeInt(auth);
+ String[] args = Platform.getCommandLineArgs();
+ out.writeInt(args.length);
+ for (int i = 0; i < args.length; i++)
+ out.writeUTF(args[i]);
+ //server will return OK or FAIL
+ return in.readUTF().equals(OK);
+ } catch (UnknownHostException e) {
+ return false;
+ } catch (IOException e) {
+ return false;
+ } finally {
+ safeClose(socket);
+ safeClose(out);
+ safeClose(in);
+ }
+ }
+
+}