/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.eclipse.util;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;
import org.drools.eclipse.DroolsEclipsePlugin;
import org.drools.eclipse.preferences.IDroolsConstants;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
public class DroolsRuntimeManager {
private static final String DROOLS_RUNTIME_RECOGNIZER = "org.drools.eclipse.runtimeRecognizer";
public static void createDefaultRuntime(String location) {
List<String> jars = new ArrayList<String>();
// get all drools jars from drools eclipse plugin
String s = getDroolsLocation();
File file = (new Path(s)).toFile();
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory() && files[i].getName().equals("lib")) {
File[] jarFiles = files[i].listFiles();
for (int j = 0; j < jarFiles.length; j++) {
if (jarFiles[j].getPath().endsWith(".jar")) {
jars.add(jarFiles[j].getAbsolutePath());
}
}
}
}
// get eclipse jdt jar
String pluginRootString = Platform.getInstallLocation().getURL().getPath() + "plugins/";
File pluginRoot = new Path(pluginRootString).toFile();
files = pluginRoot.listFiles();
boolean found = false;
// search for eclipse jdt 3.6.x jar
for (int i = 0; i < files.length; i++) {
if (files[i].getAbsolutePath().indexOf("org.eclipse.jdt.core_3.6") > -1) {
jars.add(files[i].getAbsolutePath());
found = true;
break;
}
}
// if not found, search for eclipse jdt 3.5.x jar
if (!found) {
for (int i = 0; i < files.length; i++) {
if (files[i].getAbsolutePath().indexOf("org.eclipse.jdt.core_3.5") > -1) {
jars.add(files[i].getAbsolutePath());
found = true;
break;
}
}
}
// if not found, search for eclipse jdt 3.4.x jar
if (!found) {
for (int i = 0; i < files.length; i++) {
if (files[i].getAbsolutePath().indexOf("org.eclipse.jdt.core_3.4") > -1) {
jars.add(files[i].getAbsolutePath());
break;
}
}
}
// copy jars to specified location
if (!location.endsWith(File.separator)) {
location = location + File.separator;
}
for (String jar: jars) {
try {
File jarFile = new File(jar);
FileChannel inChannel = new FileInputStream(jarFile).getChannel();
FileChannel outChannel = new FileOutputStream(new File(
location + jarFile.getName())).getChannel();
try {
inChannel.transferTo(0, inChannel.size(), outChannel);
}
catch (IOException e) {
throw e;
}
finally {
if (inChannel != null) inChannel.close();
if (outChannel != null) outChannel.close();
}
} catch (Throwable t) {
DroolsEclipsePlugin.log(t);
}
}
}
private static String getDroolsLocation() {
try {
return FileLocator.toFileURL(Platform.getBundle("org.drools.eclipse")
.getEntry("/")).getFile().toString();
} catch (IOException e) {
DroolsEclipsePlugin.log(e);
}
return null;
}
private static String generateString(DroolsRuntime[] droolsRuntimes) {
String result = "";
for (DroolsRuntime runtime: droolsRuntimes) {
result += runtime.getName() + "#" + runtime.getPath() + "#" + runtime.isDefault() + "# ";
if (runtime.getJars() != null) {
for (String jar: runtime.getJars()) {
result += jar + ";";
}
}
result += "###";
}
return result;
}
private static DroolsRuntime[] generateRuntimes(String s) {
List<DroolsRuntime> result = new ArrayList<DroolsRuntime>();
if (s != null && !"".equals(s)) {
String[] runtimeStrings = s.split("###");
for (String runtimeString: runtimeStrings) {
String[] properties = runtimeString.split("#");
DroolsRuntime runtime = new DroolsRuntime();
runtime.setName(properties[0]);
runtime.setPath(properties[1]);
runtime.setDefault("true".equals(properties[2]));
if (properties.length > 3) {
List<String> list = new ArrayList<String>();
String[] jars = properties[3].split(";");
for (String jar: jars) {
jar = jar.trim();
if (jar.length() > 0) {
list.add(jar);
}
}
runtime.setJars(list.toArray(new String[list.size()]));
}
result.add(runtime);
}
}
return result.toArray(new DroolsRuntime[result.size()]);
}
public static DroolsRuntime[] getDroolsRuntimes() {
String runtimesString = DroolsEclipsePlugin.getDefault().getPreferenceStore()
.getString(IDroolsConstants.DROOLS_RUNTIMES);
if (runtimesString != null) {
return generateRuntimes(runtimesString);
}
return new DroolsRuntime[0];
}
public static void setDroolsRuntimes(DroolsRuntime[] runtimes) {
DroolsEclipsePlugin.getDefault().getPreferenceStore().setValue(IDroolsConstants.DROOLS_RUNTIMES,
DroolsRuntimeManager.generateString(runtimes));
}
public static DroolsRuntime getDroolsRuntime(String name) {
DroolsRuntime[] runtimes = getDroolsRuntimes();
for (DroolsRuntime runtime: runtimes) {
if (runtime.getName().equals(name)) {
return runtime;
}
}
return null;
}
public static DroolsRuntime getDefaultDroolsRuntime() {
DroolsRuntime[] runtimes = getDroolsRuntimes();
for (DroolsRuntime runtime: runtimes) {
if (runtime.isDefault()) {
return runtime;
}
}
return null;
}
public static String getDroolsRuntime(IProject project) {
try {
IFile file = project.getFile(".settings/.drools.runtime");
if (file.exists()) {
BufferedReader reader = new BufferedReader(new InputStreamReader(file.getContents()));
String location = reader.readLine();
if (location.startsWith("<runtime>") && location.endsWith("</runtime>")) {
return location.substring(9, location.length() - 10);
}
}
} catch (Exception e) {
DroolsEclipsePlugin.log(e);
}
return null;
}
public static String[] getDroolsRuntimeJars(IProject project) {
String runtimeName = getDroolsRuntime(project);
DroolsRuntime runtime = null;
if (runtimeName == null) {
runtime = getDefaultDroolsRuntime();
} else {
runtime = getDroolsRuntime(runtimeName);
}
if (runtime == null) {
return null;
}
if (runtime.getJars() == null || runtime.getJars().length == 0) {
recognizeJars(runtime);
}
return runtime.getJars();
}
public static void recognizeJars(DroolsRuntime runtime) {
String path = runtime.getPath();
if (path != null) {
try {
IConfigurationElement[] config = Platform.getExtensionRegistry()
.getConfigurationElementsFor(DROOLS_RUNTIME_RECOGNIZER);
for (IConfigurationElement e : config) {
Object o = e.createExecutableExtension("class");
if (o instanceof DroolsRuntimeRecognizer) {
String[] jars = ((DroolsRuntimeRecognizer) o).recognizeJars(path);
if (jars != null && jars.length > 0) {
runtime.setJars(jars);
return;
}
}
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
runtime.setJars(new DefaultDroolsRuntimeRecognizer().recognizeJars(path));
}
}
}