/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* 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.
*/
/*******************************************************************************
* Copyright (c) 2010 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.runtime.handlers;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import org.drools.eclipse.util.DroolsRuntime;
import org.drools.eclipse.util.DroolsRuntimeManager;
import org.eclipse.core.runtime.IProgressMonitor;
import org.jboss.tools.runtime.core.model.AbstractRuntimeDetectorDelegate;
import org.jboss.tools.runtime.core.model.RuntimeDefinition;
import org.kie.eclipse.runtime.IRuntime;
public class DroolsHandler extends AbstractRuntimeDetectorDelegate {
private static final String DROOLS_PREFIX = "Drools "; // NON-NLS-1$
private static final String DROOLS_PREFIX_HYPHEN = DROOLS_PREFIX + " - "; // NON-NLS-1$
private static final String DROOLS = "DROOLS"; // NON-NLS-1$
private static final String SOA_P = "SOA-P"; //$NON-NLS-1$
@Override
public void initializeRuntimes(List<RuntimeDefinition> serverDefinitions) {
IRuntime[] existingRuntimes = DroolsRuntimeManager.getDefault().getConfiguredRuntimes();
List<DroolsRuntime> droolsRuntimes = new ArrayList<DroolsRuntime>();
if (existingRuntimes != null) {
for (IRuntime runtime : existingRuntimes) {
if (runtime instanceof DroolsRuntime)
droolsRuntimes.add((DroolsRuntime) runtime);
}
}
initializeInternal(serverDefinitions, droolsRuntimes);
if (droolsRuntimes.size() > 0) {
DroolsRuntime[] dra = droolsRuntimes.toArray(new DroolsRuntime[0]);
DroolsRuntimeManager.getDefault().setRuntimes(dra);
}
}
private void initializeInternal(List<RuntimeDefinition> serverDefinitions,
List<DroolsRuntime> droolsRuntimes) {
for (RuntimeDefinition serverDefinition : serverDefinitions) {
String type = serverDefinition.getType();
if (serverDefinition.isEnabled() && !droolsExists(serverDefinition)) {
if (DROOLS.equals(type)) {
File droolsRoot = serverDefinition.getLocation();
if (droolsRoot.isDirectory()) {
DroolsRuntime runtime = new DroolsRuntime();
boolean startsWithDrools = serverDefinition.getName().startsWith(DROOLS_PREFIX);
String newName = startsWithDrools ? serverDefinition.getName() :
DROOLS_PREFIX + serverDefinition.getName();
runtime.setName(newName);
runtime.setPath(droolsRoot.getAbsolutePath());
DroolsRuntimeManager.getDefault().recognizeJars(runtime);
runtime.setDefault(true);
droolsRuntimes.add(runtime);
}
}
}
initializeInternal(serverDefinition.getIncludedRuntimeDefinitions(),
droolsRuntimes);
}
}
/**
* @param serverDefinition
* @return
*/
private static boolean droolsExists(RuntimeDefinition serverDefinition) {
return getRuntimeForLocation(serverDefinition.getLocation().getAbsolutePath()) != null;
}
private static DroolsRuntime getRuntimeForLocation(String loc) {
IRuntime[] droolsRuntimes = DroolsRuntimeManager.getDefault().getConfiguredRuntimes();
for (IRuntime dr : droolsRuntimes) {
String location = dr.getPath();
if (location != null && location.equals(loc) && dr instanceof DroolsRuntime) {
return (DroolsRuntime) dr;
}
}
return null;
}
private boolean droolsRuntimeNameExists(String name) {
IRuntime[] droolsRuntimes = DroolsRuntimeManager.getDefault().getConfiguredRuntimes();
for (IRuntime dr : droolsRuntimes) {
if( dr.getName().equals(name))
return true;
}
return false;
}
private String getDroolsRuntimeName(String prefix) {
if( !droolsRuntimeNameExists(prefix))
return prefix;
int count = 1;
while(droolsRuntimeNameExists(prefix + " (" + count + ")"))
count++;
return prefix + " (" + count + ")";
}
@Override
public RuntimeDefinition getRuntimeDefinition(File root,
IProgressMonitor monitor) {
if (monitor.isCanceled() || root == null) {
return null;
}
String[] files = root.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
if (name.startsWith("drools-api") && name.endsWith(".jar")) {
return true;
}
return false;
}
});
if (files != null && files.length > 0) {
String version = getImplementationVersion(root, files[0]);
if (version != null) {
version = version.substring(0, 3);
String name = getDroolsRuntimeName(DROOLS_PREFIX + version);
DroolsRuntime found = getRuntimeForLocation(root.getAbsolutePath());
if( found != null) {
name = found.getName();
}
return new RuntimeDefinition(name, version, DROOLS,
root.getAbsoluteFile());
}
}
return null;
}
public String getImplementationVersion(File dir, String file) {
File jarFile = new File(dir, file);
if(!jarFile.isFile()) {
return null;
}
try {
JarFile jar = new JarFile(jarFile);
Attributes attributes = jar.getManifest().getMainAttributes();
String version = attributes.getValue("Implementation-Version");
return version;
} catch (IOException e) {
return null;
}
}
@Override
public boolean exists(RuntimeDefinition serverDefinition) {
if (serverDefinition == null || serverDefinition.getLocation() == null) {
return false;
}
return droolsExists(serverDefinition);
}
public void computeIncludedRuntimeDefinition(
RuntimeDefinition serverDefinition) {
if (serverDefinition == null
|| !SOA_P.equals(serverDefinition.getType())) {
return;
}
File droolsRoot = serverDefinition.getLocation(); //$NON-NLS-1$
if (droolsRoot.isDirectory()) {
String name = DROOLS_PREFIX_HYPHEN + serverDefinition.getName(); //$NON-NLS-1$
RuntimeDefinition sd = new RuntimeDefinition(name,
serverDefinition.getVersion(), DROOLS, droolsRoot);
sd.setParent(serverDefinition);
serverDefinition.getIncludedRuntimeDefinitions().add(sd);
}
}
public String getVersion(RuntimeDefinition runtimeDefinition) {
return runtimeDefinition.getVersion();
}
}