package org.argeo.cms.internal.kernel;
-import static org.argeo.node.DataModelNamespace.CMS_DATA_MODEL_NAMESPACE;
+import static org.argeo.api.DataModelNamespace.CMS_DATA_MODEL_NAMESPACE;
import java.util.ArrayList;
import java.util.Collections;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.argeo.api.DataModelNamespace;
import org.argeo.cms.CmsException;
-import org.argeo.node.DataModelNamespace;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
public DataModels(BundleContext bc) {
for (Bundle bundle : bc.getBundles())
- processBundle(bundle);
+ processBundle(bundle, null);
bc.addBundleListener(this);
}
@Override
public void bundleChanged(BundleEvent event) {
if (event.getType() == Bundle.RESOLVED) {
- processBundle(event.getBundle());
+ processBundle(event.getBundle(), null);
} else if (event.getType() == Bundle.UNINSTALLED) {
BundleWiring wiring = event.getBundle().adapt(BundleWiring.class);
List<BundleCapability> providedDataModels = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE);
}
- protected void processBundle(Bundle bundle) {
+ protected void processBundle(Bundle bundle, List<Bundle> scannedBundles) {
+ if (scannedBundles != null && scannedBundles.contains(bundle))
+ throw new IllegalStateException("Cycle in CMS data model requirements for " + bundle);
BundleWiring wiring = bundle.adapt(BundleWiring.class);
if (wiring == null) {
- log.warn("Bundle " + bundle.getSymbolicName() + " #" + bundle.getBundleId() + " (" + bundle.getLocation()
- + ") cannot be adapted to a wiring");
+ int bundleState = bundle.getState();
+ if (bundleState != Bundle.INSTALLED && bundleState != Bundle.UNINSTALLED) {// ignore unresolved bundles
+ log.warn("Bundle " + bundle.getSymbolicName() + " #" + bundle.getBundleId() + " ("
+ + bundle.getLocation() + ") cannot be adapted to a wiring");
+ } else {
+ if (log.isTraceEnabled())
+ log.warn("Bundle " + bundle.getSymbolicName() + " is not resolved.");
+ }
return;
}
List<BundleCapability> providedDataModels = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE);
List<BundleWire> requiredDataModels = wiring.getRequiredWires(CMS_DATA_MODEL_NAMESPACE);
// process requirements first
for (BundleWire bundleWire : requiredDataModels) {
- processBundle(bundleWire.getProvider().getBundle());
+ List<Bundle> nextScannedBundles = new ArrayList<>();
+ if (scannedBundles != null)
+ nextScannedBundles.addAll(scannedBundles);
+ nextScannedBundles.add(bundle);
+ Bundle providerBundle = bundleWire.getProvider().getBundle();
+ processBundle(providerBundle, nextScannedBundles);
}
for (BundleCapability bundleCapability : providedDataModels) {
String name = (String) bundleCapability.getAttributes().get(DataModelNamespace.NAME);