blob: d0e9d2a6a8982b94c4d89fbb4a08bbef7938969c [file] [log] [blame]
package org.eclipse.dltk.core;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Plugin;
import org.osgi.framework.Bundle;
/**
* Utility functions useful for interacting with internal scripts that may need
* to be excuted by the plugin itself to obtain information about the underlying
* interpreter, etc.
*/
public abstract class ScriptUtils {
/**
* Store an internal executable script inside a plugin's metadata directory.
*
* <p>
* This is useful for storing internal scripts in a consistent location so
* they may be executed once the plugin is installed. For instance, if your
* source structure looks like the following:
* </p>
*
* <pre>
* org.eclipse.dltk.core
* src/
* scripts/
* test.script
* </pre>
*
* <p>
* you would invoke this method using the following invocation:
* </p>
*
* <code>storeToMetaData(DLTKCore.getDefault(), "test.script", "scripts/test.script")</code>
*
* @param plugin
* plugin that owns the script to be saved
* @param name
* name script will be saved as
* @param path
* path to script (relative to project Bundle)
*
* @return File object representing the path to the stored script
*
* @throws IOException
*/
public static final File storeToMetadata(Plugin plugin, String name,
String path) throws IOException {
Bundle bundle = plugin.getBundle();
File file = plugin.getStateLocation().append(name).toFile();
storeFile(file, FileLocator.resolve(bundle.getEntry(path)));
return file;
}
private static void storeFile(File dest, URL url) throws IOException {
InputStream input = null;
OutputStream output = null;
try {
input = new BufferedInputStream(url.openStream());
output = new BufferedOutputStream(new FileOutputStream(dest));
// Simple copy
int ch = -1;
while ((ch = input.read()) != -1) {
output.write(ch);
}
} finally {
if (input != null) {
input.close();
}
if (output != null) {
output.close();
}
}
}
/**
* Tests if the nature of the specified input object is the same as
* specified value. If the input object does not implement neither
* {@link IScriptLanguageProvider} nor {@link IScriptNatureProvider} then
* <code>defaultValue<code> is returned.
*
* @param natureId
* @param input
* @param defaultValue
* @return
*/
public static boolean checkNature(String natureId, Object input,
boolean defaultValue) {
if (input instanceof IScriptNatureProvider) {
return natureId.equals(((IScriptNatureProvider) input)
.getNatureId());
} else if (input instanceof IScriptLanguageProvider) {
return natureId.equals((((IScriptLanguageProvider) input)
.getLanguageToolkit().getNatureId()));
} else {
return defaultValue;
}
}
/**
* Retrieves the nature of the specified input object. If the input object
* does not implement neither {@link IScriptLanguageProvider} nor
* {@link IScriptNatureProvider} then <code>null<code> is returned.
*
* @param input
* @return natureId or <code>null</code>
*/
public static String getNatureId(Object input) {
if (input instanceof IScriptNatureProvider) {
return ((IScriptNatureProvider) input).getNatureId();
} else if (input instanceof IScriptLanguageProvider) {
return ((IScriptLanguageProvider) input).getLanguageToolkit()
.getNatureId();
} else {
return null;
}
}
/**
* Retrieves the toolkit of the specified input object. If the input object
* does not implement neither {@link IScriptLanguageProvider} nor
* {@link IScriptNatureProvider} then <code>null<code> is returned.
*
* @param input
* @return toolkit or <code>null</code>
* @since 4.0
*/
public static IDLTKLanguageToolkit getLanguageToolkit(Object input) {
if (input instanceof IScriptNatureProvider) {
String natureId = ((IScriptNatureProvider) input).getNatureId();
return DLTKLanguageManager.getLanguageToolkit(natureId);
} else if (input instanceof IScriptLanguageProvider) {
return ((IScriptLanguageProvider) input).getLanguageToolkit();
} else {
return null;
}
}
}