|
|
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; |
|
/** |
* <p> |
* 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: |
* |
* <pre> |
* .* = *.so,about.html |
* org.eclipse.team.core.cvs = *.html |
* </pre> |
* |
* This application should be run through the generic initializer mechanism and |
* not run directly. |
* </p> |
* |
* <p> |
* To run this application, do something like: |
* </p> |
* |
* <p> |
* <code> |
* java -cp startup.jar org.eclipse.core.launcher.Main -application org.eclipse.core.runtime.initializer [-justThisArchOSWS] -fileInitializer <fileWithFilePatternsToExtract> |
* </code> |
* </p> |
* |
* <p> |
* <ul> |
* <li> |
* 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 |
* </li> |
* </ul> |
* </p> |
* |
* @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; |
} |
} |