blob: 9da280223f0cab5ffb16694af4a217bab94c6bc7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 Boeing.
* All rights reserved. This program and the accompanying materials
* are 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.framework.ui.workspacebundleloader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.security.NoSuchAlgorithmException;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import java.util.logging.Level;
import org.eclipse.osee.framework.jdk.core.util.ChecksumUtil;
import org.eclipse.osee.framework.logging.OseeLog;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
public class BundleInfoLite {
private final String symbolicName;
private final String version;
private final URL systemLocation;
private final File file;
private final Manifest manifest;
private byte[] md5Digest;
private Bundle bundle;
public BundleInfoLite(URL systemLocation) throws IOException {
File tmpFile;
try {
tmpFile = new File(systemLocation.toURI());
} catch (URISyntaxException ex) {
tmpFile = new File(systemLocation.getPath());
}
this.file = tmpFile;
JarFile jarFile = new JarFile(file);
this.manifest = jarFile.getManifest();
this.symbolicName = generateBundleName(manifest);
this.version = manifest.getMainAttributes().getValue("Bundle-Version");
this.systemLocation = systemLocation;
this.md5Digest = null;
}
/**
* @return the name of the bundle
*/
private String generateBundleName(Manifest jarManifest) {
String nameEntry = jarManifest.getMainAttributes().getValue("Bundle-SymbolicName");
if(nameEntry == null){
return "unknown";
}
// Sometimes there's a semicolon then extra info - ignore this
int index = nameEntry.indexOf(';');
if (index != -1) {
nameEntry = nameEntry.substring(0, index);
}
return nameEntry;
}
/**
* @return the symbolicName
*/
public String getSymbolicName() {
return symbolicName;
}
/**
* @return the version
*/
public String getVersion() {
return version;
}
/**
* @return the location
*/
public URL getSystemLocation() {
return systemLocation;
}
@Override
public String toString() {
return getSymbolicName() + ":" + getVersion();
}
/**
* @return the md5Digest
*/
public byte[] getMd5Digest() {
// Do lazy calculation of this since it can be costly
// and does not get read for all bundle info's
if (md5Digest == null) {
try {
InputStream in = systemLocation.openStream();
md5Digest = ChecksumUtil.createChecksum(in, "MD5");
in.close();
} catch (NoSuchAlgorithmException ex) {
throw new IllegalStateException("Always expect MD5 to be available", ex);
} catch (IOException ex) {
throw new IllegalStateException("Always expect local jar file to be available", ex);
}
}
return md5Digest;
}
public void install(BundleContext context) throws BundleException, IOException{
bundle = context.installBundle("reference:" + this.getSystemLocation().toExternalForm());
}
public Bundle uninstall() throws BundleException{
if(isInstalled()){
bundle.uninstall();
}
return bundle;
}
public boolean isInstalled() {
if(bundle == null){
return false;
} else {
int state = bundle.getState();
return state != Bundle.UNINSTALLED;
}
}
public boolean isStarted() {
if(isInstalled()){
int state = bundle.getState();
return state == Bundle.ACTIVE || state == Bundle.STARTING;
} else {
return false;
}
}
public void start(BundleContext context) throws BundleException{
if(bundle == null){
for(Bundle findit:context.getBundles()){
if(findit.getSymbolicName().equals(getSymbolicName())){
findit.start();
return;
}
}
OseeLog.log(BundleInfoLite.class, Level.WARNING, String.format("Tried to start bundle [%s] that is not installed.", getSymbolicName()));
} else if (bundle.getState() == Bundle.INSTALLED || bundle.getState() == Bundle.RESOLVED){
bundle.start();
}
}
}