/*
* Copyright (C) 2007-2012 Argeo GmbH
*
* 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.argeo.slc.osgi;
import org.argeo.slc.DefaultNameVersion;
import org.argeo.slc.NameVersion;
import org.argeo.slc.build.Distribution;
import org.argeo.slc.core.build.ResourceDistribution;
import org.argeo.slc.deploy.DeploymentData;
import org.argeo.slc.deploy.Module;
import org.argeo.slc.deploy.ModuleDescriptor;
import org.argeo.slc.deploy.TargetData;
import org.argeo.slc.execution.RealizedFlow;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.springframework.core.io.Resource;
/** A deployed OSGi bundle. */
public class OsgiBundle extends DefaultNameVersion implements Module {
private ResourceDistribution distribution;
private Long internalBundleId;
private String title;
private String description;
public OsgiBundle() {
}
public OsgiBundle(String name, String version) {
super(name, version);
}
public OsgiBundle(NameVersion nameVersion) {
super(nameVersion);
}
public OsgiBundle(Bundle bundle) {
super(bundle.getSymbolicName(), getVersionSafe(bundle));
internalBundleId = bundle.getBundleId();
}
/**
* Initialize from a {@link RealizedFlow}.
*
* @deprecated introduce an unnecessary dependency. TODO: create a separate
* helper.
*/
public OsgiBundle(RealizedFlow realizedFlow) {
super(realizedFlow.getModuleName(), realizedFlow.getModuleVersion());
}
/** Utility to avoid NPE. */
private static String getVersionSafe(Bundle bundle) {
Object versionObj = bundle.getHeaders().get(Constants.BUNDLE_VERSION);
if (versionObj != null)
return versionObj.toString();
else
return null;
}
/** Unique deployed system id. TODO: use internal bundle id when available? */
public String getDeployedSystemId() {
return getName() + ":" + getVersion();
}
/**
* OSGi bundle are self-contained and do not require additional deployment
* data.
*
* @return always null
*/
public DeploymentData getDeploymentData() {
return null;
}
/** The related distribution. */
public Distribution getDistribution() {
return distribution;
}
/**
* The related distribution, a jar file with OSGi metadata referenced by a
* {@link Resource}.
*/
public ResourceDistribution getResourceDistribution() {
return distribution;
}
/** TODO: reference the {@link OsgiRuntime} as target data? */
public TargetData getTargetData() {
throw new UnsupportedOperationException();
}
public void setResourceDistribution(ResourceDistribution distribution) {
this.distribution = distribution;
}
/**
* Bundle ID used by the OSGi runtime. To be used for optimization when
* looking in the bundle context. Can therefore be null.
*/
public Long getInternalBundleId() {
return internalBundleId;
}
/** Only package access for the time being. e.g. from {@link BundlesManager} */
void setInternalBundleId(Long internalBundleId) {
this.internalBundleId = internalBundleId;
}
/** Value of the Bundle-Name
directive. */
public String getTitle() {
return title;
}
public void setTitle(String label) {
this.title = label;
}
/** Value of the Bundle-Description
directive. */
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public ModuleDescriptor getModuleDescriptor() {
ModuleDescriptor moduleDescriptor = new ModuleDescriptor();
moduleDescriptor.setName(getName());
moduleDescriptor.setVersion(getVersion());
moduleDescriptor.setDescription(description);
moduleDescriptor.setTitle(title);
return moduleDescriptor;
}
}