Index: plugin.xml
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.core.runtime/plugin.xml,v
retrieving revision 1.68
diff -u -r1.68 plugin.xml
--- plugin.xml 4 Mar 2005 22:18:54 -0000 1.68
+++ plugin.xml 7 Nov 2005 20:22:09 -0000
@@ -6,4 +6,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: src/org/eclipse/core/internal/runtime/Messages.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Messages.java,v
retrieving revision 1.18
diff -u -r1.18 Messages.java
--- src/org/eclipse/core/internal/runtime/Messages.java 20 Oct 2005 18:31:04 -0000 1.18
+++ src/org/eclipse/core/internal/runtime/Messages.java 7 Nov 2005 20:22:09 -0000
@@ -106,6 +106,14 @@
public static String plugin_instantiateClassError;
public static String plugin_loadClassError;
+ // initializer
+ public static String initializer_error;
+
+ // file initializer
+ public static String fileInitializer_fileNotFound;
+ public static String fileInitializer_IOError;
+ public static String fileInitializer_missingFileName;
+
static {
// load message values from bundle file
reloadMessages();
@@ -114,4 +122,4 @@
public static void reloadMessages() {
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
}
-}
\ No newline at end of file
+}
Index: src/org/eclipse/core/internal/runtime/messages.properties
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/messages.properties,v
retrieving revision 1.106
diff -u -r1.106 messages.properties
--- src/org/eclipse/core/internal/runtime/messages.properties 20 Oct 2005 18:31:04 -0000 1.106
+++ src/org/eclipse/core/internal/runtime/messages.properties 7 Nov 2005 20:22:09 -0000
@@ -54,6 +54,13 @@
url_resolveFragment = Unable to resolve fragment \"{0}\".
url_resolvePlugin = Unable to resolve plug-in \"{0}\".
+### Initializer
+initializer_error=There was a problem running the application {0}.
+
+### File Initiializer
+fileInitializer_fileNotFound={0}: The file {1} was not found.
+fileInitializer_IOError={0}: There was an error reading {1}.
+
### Compatibility - parsing/resolving
parse_badPrereqOnFrag = Fragment \"{0}\" requires non-existent plug-in \"{1}\". Fragment ignored.
parse_duplicateFragment = Duplicate fragment found with id \"{0}\" and version \"{1}\".
Index: src/org/eclipse/core/runtime/Platform.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.core.runtime/src/org/eclipse/core/runtime/Platform.java,v
retrieving revision 1.90
diff -u -r1.90 Platform.java
--- src/org/eclipse/core/runtime/Platform.java 26 Aug 2005 19:39:21 -0000 1.90
+++ src/org/eclipse/core/runtime/Platform.java 7 Nov 2005 20:22:09 -0000
@@ -95,6 +95,15 @@
public static final String OPTION_STARTTIME = PI_RUNTIME + "/starttime"; //$NON-NLS-1$
/**
+ * The simple identifier constant (value "initializers") of
+ * the extension point of the Core Runtime plug-in where plug-ins declare
+ * their the existence of initialization code.
+ *
+ * @since 3.1
+ */
+
+ public static final String PT_INITIALIZERS = "initializers"; //$NON-NLS-1$
+ /**
* Name of a preference for configuring the performance level for this system.
*
*
Index: schema/initializers.exsd
===================================================================
RCS file: schema/initializers.exsd
diff -N schema/initializers.exsd
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ schema/initializers.exsd 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+ Platform runtime supports plug-ins which would like to
+be initialized. That is, plug-ins that needs to be initialized when
+the initialization application is being run should provide an extension
+to this extension-point.
+The initializers are run when the org.eclipse.core.runtime.initializer application
+is being run. The initializers are run in any order.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.1
+
+
+
+
+
+
+
+
+ Following is an example of initializer declaration:
+<p>
+<pre>
+ <extension id="myInitializer" point="org.eclipse.core.runtime.initializers">
+ <initializer>
+ <initialize class="myInitializer.Doit"/>
+ </initializer>
+ </extension>
+</pre>
+</p>
+
+
+
+
+
+
+
+
+ The value of the class attribute must represent an
+implementor of
+<samp>org.eclipse.core.runtime.IPlatformRunnable</samp>.
+
+
+
+
+
+
+
+
+ [Enter information about supplied implementation of this extension point.]
+
+
+
+
+
+
+
+
+ Copyright (c) 2005 IBM Corporation and others.<br>
+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
+<a
+href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>
+
+
+
+
Index: src/org/eclipse/core/internal/runtime/FileInitializer.java
===================================================================
RCS file: src/org/eclipse/core/internal/runtime/FileInitializer.java
diff -N src/org/eclipse/core/internal/runtime/FileInitializer.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/core/internal/runtime/FileInitializer.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,186 @@
+package org.eclipse.core.internal.runtime;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Properties;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IPlatformRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osgi.util.NLS;
+import org.osgi.framework.Bundle;
+
+/**
+ *
+ * This application extracts files to their "localURL". The file patterns that you
+ * want to extract should be specified in a file in a properties format like this:
+ *
+ *
+ * .* = *.so,about.html
+ * org.eclipse.team.core.cvs = *.html
+ *
+ *
+ * This application should be run through the generic initializer mechanism and
+ * not run directly.
+ *
+ *
+ *
+ * To run this application, do something like:
+ *
+ *
+ *
+ *
+ * java -cp startup.jar org.eclipse.core.launcher.Main -application org.eclipse.core.runtime.initializer [-justThisArchOSWS] -fileInitializer <fileWithFilePatternsToExtract>
+ *
+ *
+ *
+ *
+ *
+ * -
+ * Note: Only the files that are extracted will be printed to the console. If you
+ * want to debug things, use the -consolelog option in
+ * org.eclipse.core.launcher.Main
+ *
+ *
+ *
+ *
+ * @see Initializer
+ * @see Platform#asLocalURL(URL)
+ * @since 3.1
+ */
+public class FileInitializer implements IPlatformRunnable {
+
+ private LinkedList extractedFiles;
+ private boolean justThisArchOSWS;
+
+ public Object run(Object args) throws Exception {
+ Properties bundleAndFilePatterns = getBundleAndFileNamePatterns((String[]) args);
+ Set bundlePatterns = bundleAndFilePatterns.keySet();
+
+ // don't do anything if bundleAndFilePatterns is empty
+ if (bundleAndFilePatterns == null || bundleAndFilePatterns.size() == 0) {
+ return IPlatformRunnable.EXIT_OK;
+ }
+
+ justThisArchOSWS = getJustThisArchOSWS((String[]) args);
+
+ Bundle[] installedBundles = InternalPlatform.getDefault().getBundleContext().getBundles();
+ extractedFiles = new LinkedList();
+
+ // foreach(bundle pattern)
+ for (Iterator bundlePatternIter = bundlePatterns.iterator(); bundlePatternIter.hasNext();) {
+ Object bundlePattern = bundlePatternIter.next();
+ Object fileNamePattern = bundleAndFilePatterns.get(bundlePattern);
+ // foreach(filename pattern)
+ String[] fileNamePatterns = ((String) fileNamePattern).split(","); //$NON-NLS-1$
+ for (int i = 0; i < fileNamePatterns.length; i++) {
+ fileNamePatterns[i] = fileNamePatterns[i].trim();
+ }
+ // foreach(bundle)
+ for (int i = 0; i < installedBundles.length; i++) {
+ String bundleName = installedBundles[i].getSymbolicName();
+ // if(bundle matches pattern) check fileNamePattern(s)
+ if(Pattern.matches((String) bundlePattern, bundleName)) {
+ for (int j = 0; j < fileNamePatterns.length; j++) {
+ extractMatchingFilesFromBundle(fileNamePatterns[j], installedBundles[i]);
+ }
+ }
+ }
+ } // end for
+ return IPlatformRunnable.EXIT_OK;
+ }
+
+ private void extractMatchingFilesFromBundle(String fileNamePattern, Bundle bundle) throws IOException {
+ Enumeration e = bundle.findEntries("/", fileNamePattern, true); //$NON-NLS-1$
+
+ while(e != null && e.hasMoreElements()) {
+ URL fileURL = (URL) e.nextElement();
+ if (justThisArchOSWS) {
+ Path filePath = new Path(fileURL.getPath());
+
+ String[] path = filePath.segments();
+ // check to see if the file should be extracted to the current os/arch
+ if (path.length == 4 && path[0].equals("os") && !(path[1].equals(Platform.getOS()) && path[2].equals(Platform.getOSArch()))) { //$NON-NLS-1$
+ continue;
+ }
+ // check to see if the file is should be extracted to the current ws
+ if (path.length == 3 && path[0].equals("ws") && !path[1].equals(Platform.getWS())) { //$NON-NLS-1$
+ continue;
+ }
+ }
+
+ // the call to Platform.asLocalURL(URL) does the actual extraction
+ URL localURL = Platform.asLocalURL(fileURL);
+ if (localURL != null) {
+ String localURLPath = localURL.getPath();
+
+ // only print the path if it hasn't been printed yet
+ int index = Collections.binarySearch(extractedFiles, localURLPath);
+ if (index < 0) {
+ extractedFiles.add(-(index + 1), localURLPath);
+ System.out.println("FileInitializer: " + localURLPath); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ private final String ARG_FILE = "-fileInitializer"; //$NON-NLS-1$
+
+ private Properties getBundleAndFileNamePatterns(String[] argsArray) {
+
+ for (int i = 0; i < argsArray.length; i++) {
+ if (argsArray[i].equalsIgnoreCase(ARG_FILE)) {
+
+ // the "file patterns" file was not specified
+ if (argsArray.length < i + 2) {
+ String msg = NLS.bind(Messages.fileInitializer_missingFileName, this.getClass().getName());
+ IStatus status = new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.PLUGIN_ERROR, msg, null);
+ InternalPlatform.getDefault().log(status);
+ return null;
+ }
+
+ try {
+ FileInputStream fin = new FileInputStream(argsArray[i + 1]);
+ Properties bundleAndFileNameProperties = new Properties();
+ bundleAndFileNameProperties.load(fin);
+ fin.close();
+ return bundleAndFileNameProperties;
+ } catch (FileNotFoundException e1) {
+ String msg = NLS.bind(Messages.fileInitializer_fileNotFound, this.getClass().getName(), argsArray[i + 1]);
+ IStatus status = new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.PLUGIN_ERROR, msg, null);
+ InternalPlatform.getDefault().log(status);
+ return null;
+ } catch (IOException e) {
+ String msg = NLS.bind(Messages.fileInitializer_IOError, this.getClass().getName(), argsArray[i + 1]);
+ IStatus status = new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.PLUGIN_ERROR, msg, e);
+ InternalPlatform.getDefault().log(status);
+ return null;
+ }
+ }
+ }
+
+ // ARG_FILE wasn't found
+ return null;
+ }
+
+ private final String ARG_JUSTTHISARCHOSWS = "-justThisArchOSWS"; //$NON-NLS-1$
+
+ private boolean getJustThisArchOSWS(String[] argsArray) {
+ for (int i = 0; i < argsArray.length; i++) {
+ if (argsArray[i].equalsIgnoreCase(ARG_JUSTTHISARCHOSWS)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
Index: src/org/eclipse/core/internal/runtime/Initializer.java
===================================================================
RCS file: src/org/eclipse/core/internal/runtime/Initializer.java
diff -N src/org/eclipse/core/internal/runtime/Initializer.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/org/eclipse/core/internal/runtime/Initializer.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,49 @@
+/*******************************************************************************
+* Copyright (c) 2005 Red Hat, Inc. 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 - Initial implementation
+*******************************************************************************/
+package org.eclipse.core.internal.runtime;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IPlatformRunnable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.osgi.util.NLS;
+
+public class Initializer implements IPlatformRunnable {
+
+ public Object run(Object args) throws Exception {
+ IExtensionPoint xpt = Platform.getExtensionRegistry().getExtensionPoint(Platform.PI_RUNTIME, Platform.PT_INITIALIZERS);
+ if (xpt == null)
+ return IPlatformRunnable.EXIT_OK;
+
+ IExtension[] exts = xpt.getExtensions();
+ for (int i = 0; i < exts.length; i++) {
+ IConfigurationElement[] configs = exts[i].getConfigurationElements();
+ IPlatformRunnable initializer = null;
+ if (configs.length != 0) {
+ try {
+ initializer = (IPlatformRunnable) configs[0].createExecutableExtension("initialize"); //$NON-NLS-1$
+ initializer.run(args);
+ } catch(CoreException e) {
+ String msg = NLS.bind(Messages.initializer_error, exts[i].getExtensionPointUniqueIdentifier());
+ IStatus status = new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.PLUGIN_ERROR, msg, e);
+ InternalPlatform.getDefault().log(status);
+ return null;
+ }
+ }
+ }
+ return IPlatformRunnable.EXIT_OK;
+ }
+
+}