package de.twenty11.skysail.server.ext.osgimonitor.domain;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceReference;
import de.twenty11.skysail.common.ext.osgimonitor.domain.BundleDescriptor;
import de.twenty11.skysail.common.graphs.EdgeProvider;
import de.twenty11.skysail.common.graphs.NodeProvider;
public class BundleDetails extends BundleDescriptor {
private List<ServiceReferenceDetails> registeredServices = new ArrayList<ServiceReferenceDetails>();
private List<ServiceReferenceDetails> servicesInUse = new ArrayList<ServiceReferenceDetails>();
// public BundleDetails() {
// // needed for javax.persistence
// super();
// }
public BundleDetails(Bundle bundle) {
super(bundle);
getRegisteredServicesFromBundle(bundle);
getUsedServicesFromBundle(bundle);
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(symbolicName).append(", ");
return sb.toString();
}
public void setRegisteredServices(List<ServiceReferenceDetails> list) {
this.registeredServices = list;
}
public List<ServiceReferenceDetails> getRegisteredServices() {
return registeredServices;
}
public void setServicesInUse(List<ServiceReferenceDetails> list) {
this.servicesInUse = list;
}
public List<ServiceReferenceDetails> getServicesInUse() {
return servicesInUse;
}
@JsonIgnore
public NodeProvider asNode() {
return new NodeProvider() {
@Override
public String getType() {
return BundleDetails.this.getClass().getCanonicalName();
}
@Override
public Map<String, String> getNodeProperties() {
return Collections.emptyMap();
}
@Override
public String getNodeLabel() {
return symbolicName + "(" + version.toString() + ")";
}
@Override
public String getNodeId() {
return Long.toString(getBundleId());
}
@Override
public List<EdgeProvider> getEdges() {
List<EdgeProvider> result = new ArrayList<EdgeProvider>();
for (final ServiceReferenceDetails srd : BundleDetails.this.registeredServices) {
if (srd.getUsingBundles().size() == 0) {
continue;
}
for (final BundleDetails usingBundle : srd.getUsingBundles()) {
EdgeProvider edgeProvider = new EdgeProvider() {
@Override
public int getWeight() {
return 1;
}
@Override
public String getTarget() {
return Long.toString(usingBundle.getBundleId());
}
@Override
public String getSource() {
return BundleDetails.this.asNode().getNodeId();
}
@Override
public Map<String, String> getEdgeProperties() {
return Collections.emptyMap();
}
@Override
public String getEdgeLabel() {
return srd.getName();
}
@Override
public String getEdgeId() {
return srd.getName();
}
};
result.add(edgeProvider);
}
}
return result;
}
};
}
private void getRegisteredServicesFromBundle(Bundle bundle) {
setRegisteredServices(getDetails(bundle.getRegisteredServices()));
}
private void getUsedServicesFromBundle(Bundle bundle) {
setServicesInUse(getDetails(bundle.getServicesInUse()));
}
private List<ServiceReferenceDetails> getDetails(ServiceReference[] serviceReferences) {
List<ServiceReferenceDetails> serviceDetails = new ArrayList<ServiceReferenceDetails>();
if (serviceReferences == null) {
return serviceDetails;
}
for (ServiceReference sr : serviceReferences) {
serviceDetails.add(new ServiceReferenceDetails(sr));
}
return serviceDetails;
}
}