X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Finternal%2Fkernel%2FDataModels.java;h=48b6b7fc75f3476caab9b7a9be218feca546e8cf;hb=b6cad136dfd4589bc2a8f48ec9168732517f451b;hp=b758a30637a9aac70d79c5a846618b1fad62455e;hpb=e61a7a2dbff5e17fbf1c6c8bbd7fa687935d2897;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java index b758a3063..48b6b7fc7 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java @@ -8,6 +8,8 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.argeo.cms.CmsException; import org.argeo.node.DataModelNamespace; import org.osgi.framework.Bundle; @@ -19,6 +21,8 @@ import org.osgi.framework.wiring.BundleWire; import org.osgi.framework.wiring.BundleWiring; class DataModels implements BundleListener { + private final static Log log = LogFactory.getLog(DataModels.class); + private Map dataModels = new TreeMap<>(); public DataModels(BundleContext bc) { @@ -56,13 +60,32 @@ class DataModels implements BundleListener { protected void processBundle(Bundle bundle) { BundleWiring wiring = bundle.adapt(BundleWiring.class); + if (wiring == null) { + 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 providedDataModels = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE); if (providedDataModels.size() == 0) return; List requiredDataModels = wiring.getRequiredWires(CMS_DATA_MODEL_NAMESPACE); + // process requirements first + for (BundleWire bundleWire : requiredDataModels) { + processBundle(bundleWire.getProvider().getBundle()); + } for (BundleCapability bundleCapability : providedDataModels) { - DataModel dataModel = new DataModel(bundleCapability, requiredDataModels); - dataModels.put(dataModel.getName(), dataModel); + String name = (String) bundleCapability.getAttributes().get(DataModelNamespace.NAME); + assert name != null; + if (!dataModels.containsKey(name)) { + DataModel dataModel = new DataModel(name, bundleCapability, requiredDataModels); + dataModels.put(dataModel.getName(), dataModel); + } } } @@ -85,11 +108,10 @@ class DataModels implements BundleListener { private final String cnd; private final List required; - private DataModel(BundleCapability bundleCapability, List requiredDataModels) { + private DataModel(String name, BundleCapability bundleCapability, List requiredDataModels) { assert CMS_DATA_MODEL_NAMESPACE.equals(bundleCapability.getNamespace()); + this.name = name; Map attrs = bundleCapability.getAttributes(); - name = (String) attrs.get(DataModelNamespace.NAME); - assert name != null; abstrct = KernelUtils.asBoolean((String) attrs.get(DataModelNamespace.ABSTRACT)); // standalone = KernelUtils.asBoolean((String) // attrs.get(DataModelNamespace.CAPABILITY_STANDALONE_ATTRIBUTE));