import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.util.HashSet;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
+import org.argeo.api.acr.ArgeoNamespace;
import org.argeo.api.acr.Content;
import org.argeo.api.acr.CrName;
+import org.argeo.api.acr.NamespaceUtils;
+import org.argeo.api.acr.RuntimeNamespaceContext;
+import org.argeo.api.acr.spi.ContentNamespace;
import org.argeo.api.acr.spi.ContentProvider;
import org.argeo.api.acr.spi.ProvidedContent;
import org.argeo.api.acr.spi.ProvidedRepository;
public abstract class AbstractContentRepository implements ProvidedRepository {
private final static CmsLog log = CmsLog.getLog(AbstractContentRepository.class);
- private final MountManager mountManager;
- private final TypesManager typesManager;
+ private MountManager mountManager;
+ private TypesManager typesManager;
private CmsContentSession systemSession;
+ private Set<ContentProvider> providersToAdd = new HashSet<>();
+
// utilities
/** Should be used only to copy source and results. */
private TransformerFactory identityTransformerFactory = TransformerFactory.newInstance();
- public final static String ACR_MOUNT_PATH_PROPERTY = "acr.mount.path";
+// public final static String ACR_MOUNT_PATH_PROPERTY = "acr.mount.path";
public AbstractContentRepository() {
+ long begin = System.currentTimeMillis();
// types
typesManager = new TypesManager();
typesManager.init();
for (QName type : types) {
log.trace(type + " - " + typesManager.getAttributeTypes(type));
}
-
- systemSession = newSystemSession();
-
- // mounts
- mountManager = new MountManager(systemSession);
-
+ long duration = System.currentTimeMillis() - begin;
+ log.debug(() -> "CMS content types available (initialisation took " + duration + " ms)");
}
protected abstract CmsContentSession newSystemSession();
public void start() {
+ systemSession = newSystemSession();
+ // mounts
+ mountManager = new MountManager(systemSession);
}
public void stop() {
-
+ systemSession.close();
+ systemSession = null;
}
/*
* REPOSITORY
*/
-
+ @Override
public void addProvider(ContentProvider provider) {
- mountManager.addStructuralContentProvider(provider);
+ if (mountManager == null) {
+ providersToAdd.add(provider);
+ log.debug(
+ () -> "Will add provider " + provider.getMountPath() + " (" + provider.getClass().getName() + ")");
+ } else {
+ mountManager.addStructuralContentProvider(provider);
+ log.debug(() -> "Added provider " + provider.getMountPath() + " (" + provider.getClass().getName() + ")");
+ }
}
- public void registerTypes(String prefix, String namespaceURI, String schemaSystemId) {
- typesManager.registerTypes(prefix, namespaceURI, schemaSystemId);
+ @Override
+ public void registerTypes(ContentNamespace... namespaces) {
+ typesManager.registerTypes(namespaces);
}
/*
// document = dBuilder.parse(inputSource);
// } else {
document = dBuilder.newDocument();
- Element root = document.createElementNS(CrName.CR_NAMESPACE_URI, CrName.ROOT.get().toPrefixedString());
+ Element root = document.createElementNS(ArgeoNamespace.CR_NAMESPACE_URI,
+ NamespaceUtils.toPrefixedName(CrName.root.qName()));
- for (String prefix : typesManager.getPrefixes().keySet()) {
+ for (String prefix : RuntimeNamespaceContext.getPrefixes().keySet()) {
// root.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, XMLConstants.XMLNS_ATTRIBUTE + ":" + prefix,
// contentTypesManager.getPrefixes().get(prefix));
- DomUtils.addNamespace(root, prefix, typesManager.getPrefixes().get(prefix));
+ DomUtils.addNamespace(root, prefix,
+ RuntimeNamespaceContext.getNamespaceContext().getNamespaceURI(prefix));
}
document.appendChild(root);
throw new IllegalStateException("Cannot init ACR root " + path, e);
}
+ // add content providers already notified
+ for (ContentProvider contentProvider : providersToAdd)
+ addProvider(contentProvider);
+ providersToAdd.clear();
}
public void writeDom(Document document, OutputStream out) throws IOException {
return typesManager;
}
+ CmsContentSession getSystemSession() {
+ return systemSession;
+ }
+
+
}