/*
* Copyright 2010 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.
* 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.kie.eclipse.runtime;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map.Entry;
import java.util.jar.JarFile;
import org.kie.eclipse.runtime.AbstractRuntime.Version;
public abstract class AbstractRuntimeRecognizer implements IRuntimeRecognizer {
List<String> fileList = new ArrayList<String>();
Hashtable<String, List<Version>> products = new Hashtable<String, List<Version>>();
protected void clearFiles() {
fileList.clear();
products.clear();
}
protected void addFile(File file) {
// add file name to internal list
fileList.add(file.getAbsolutePath());
// identify the product
String product = null;
String name = file.getName();
if (name.startsWith("drools-")) {
product = "drools";
}
else if (name.startsWith("jbpm-")) {
product = "jbpm";
}
if (product!=null && file.getName().endsWith(".jar")) {
// get the runtime version from manifest
JarFile jar = null;
try {
jar = new java.util.jar.JarFile(file);
Version version = null;
for (Entry<Object, Object> a : jar.getManifest().getMainAttributes().entrySet()) {
if ("Bundle-Version".equals(a.getKey().toString())) {
version = new Version((String) a.getValue());
break;
}
}
if (version==null) {
// jar contains no manifest or Bundle Version not specified
// use Implementation Version specified in older runtimes
for (Entry<Object, Object> a : jar.getManifest().getMainAttributes().entrySet()) {
if ("Implementation-Version".equals(a.getKey().toString())) {
version = new Version((String) a.getValue());
break;
}
}
}
if (version==null) {
// no luck, try to guess version from file name
String versionPart = name.replaceFirst(".*([0-9]+\\.[0-9]+\\.[0-9]+\\..*)", "$1").replace(".jar", "");
if (Version.validate(versionPart)==null) {
version = new Version(versionPart);
}
}
if (version!=null) {
// System.out.println("File: "+name+" contains "+product+" "+version.toString());
List<Version> productVersions = products.get(product);
if (productVersions!=null) {
if (!productVersions.contains(version)) {
productVersions.add(version);
}
}
else {
productVersions = new ArrayList<Version>();
productVersions.add(version);
products.put(product,productVersions);
}
}
}
catch (Exception e) {
}
finally {
try {
if (jar!=null)
jar.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
protected String[] getFiles() {
return fileList.toArray(new String[fileList.size()]);
}
@Override
public Hashtable<String, List<Version>> getProducts() {
return products;
}
}