import java.io.Reader;
import java.lang.management.ManagementFactory;
import java.net.URL;
+import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
for (BundleWire wire : requiredWires) {
processWiring(cn, adminSession, wire.getProviderWiring(), processed);
}
+
+ List<String> publishAsLocalRepo = new ArrayList<>();
List<BundleCapability> capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE);
for (BundleCapability capability : capabilities) {
- registerDataModelCapability(cn, adminSession, capability, processed);
+ boolean publish = registerDataModelCapability(cn, adminSession, capability, processed);
+ if (publish)
+ publishAsLocalRepo.add((String) capability.getAttributes().get(DataModelNamespace.NAME));
}
+ // Publish all at once, so that bundles with multiple CNDs are consistent
+ for (String dataModelName : publishAsLocalRepo)
+ publishLocalRepo(dataModelName, adminSession.getRepository());
}
- private void registerDataModelCapability(String cn, Session adminSession, BundleCapability capability,
+ private boolean registerDataModelCapability(String cn, Session adminSession, BundleCapability capability,
Set<String> processed) {
Map<String, Object> attrs = capability.getAttributes();
String name = (String) attrs.get(DataModelNamespace.NAME);
if (processed.contains(name)) {
if (log.isTraceEnabled())
log.trace("Data model " + name + " has already been processed");
- return;
+ return false;
}
// CND
}
if (KernelUtils.asBoolean((String) attrs.get(DataModelNamespace.ABSTRACT)))
- return;
+ return false;
// Non abstract
boolean isStandalone = deployConfig.isStandalone(name);
boolean publishLocalRepo;
else
publishLocalRepo = false;
- if (publishLocalRepo) {
- Hashtable<String, Object> properties = new Hashtable<>();
- // properties.put(LEGACY_JCR_REPOSITORY_ALIAS, name);
- properties.put(NodeConstants.CN, name);
- if (name.equals(NodeConstants.NODE))
- properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
- LocalRepository localRepository = new LocalRepository(adminSession.getRepository(), capability);
- bc.registerService(Repository.class, localRepository, properties);
- if (log.isDebugEnabled())
- log.debug("Published data model " + name);
- }
+ return publishLocalRepo;
+ }
+
+ private void publishLocalRepo(String dataModelName, Repository repository) {
+ Hashtable<String, Object> properties = new Hashtable<>();
+ // properties.put(LEGACY_JCR_REPOSITORY_ALIAS, name);
+ properties.put(NodeConstants.CN, dataModelName);
+ if (dataModelName.equals(NodeConstants.NODE))
+ properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
+ LocalRepository localRepository = new LocalRepository(repository, dataModelName);
+ bc.registerService(Repository.class, localRepository, properties);
+ if (log.isDebugEnabled())
+ log.debug("Published data model " + dataModelName);
}
@Override
package org.argeo.cms.internal.kernel;
-import java.util.Map;
-
import javax.jcr.Repository;
import org.argeo.jcr.JcrRepositoryWrapper;
-import org.argeo.node.DataModelNamespace;
import org.argeo.node.NodeConstants;
-import org.osgi.framework.wiring.BundleCapability;
class LocalRepository extends JcrRepositoryWrapper {
private final String cn;
- public LocalRepository(Repository repository, BundleCapability dataModelCapability) {
+ public LocalRepository(Repository repository, String cn) {
super(repository);
- Map<String, Object> attrs = dataModelCapability.getAttributes();
- cn = (String) attrs.get(DataModelNamespace.NAME);
+ this.cn = cn;
+ // Map<String, Object> attrs = dataModelCapability.getAttributes();
+ // cn = (String) attrs.get(DataModelNamespace.NAME);
putDescriptor(NodeConstants.CN, cn);
}