Massive package refactoring
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / acr / AbstractContentRepository.java
index 6ca7b3591a8cae1d27f42755833dded275687ba3..98a2fec9304699b6f09b8ac8242ae94dcc3137a9 100644 (file)
@@ -5,6 +5,7 @@ import java.io.InputStream;
 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;
@@ -16,13 +17,15 @@ import javax.xml.transform.TransformerFactory;
 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.ContentProvider;
 import org.argeo.api.acr.spi.ProvidedContent;
 import org.argeo.api.acr.spi.ProvidedRepository;
 import org.argeo.api.cms.CmsLog;
-import org.argeo.api.uuid.UuidFactory;
 import org.argeo.cms.acr.xml.DomContentProvider;
 import org.argeo.cms.acr.xml.DomUtils;
 import org.w3c.dom.DOMException;
@@ -36,20 +39,21 @@ import org.xml.sax.SAXException;
 public abstract class AbstractContentRepository implements ProvidedRepository {
        private final static CmsLog log = CmsLog.getLog(AbstractContentRepository.class);
 
-       private UuidFactory uuidFactory;
-
        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();
@@ -58,7 +62,8 @@ public abstract class AbstractContentRepository implements ProvidedRepository {
                        for (QName type : types) {
                                log.trace(type + " - " + typesManager.getAttributeTypes(type));
                        }
-
+               long duration = System.currentTimeMillis() - begin;
+               log.debug(() -> "CMS content types available (initialisation took " + duration + " ms)");
        }
 
        protected abstract CmsContentSession newSystemSession();
@@ -77,9 +82,16 @@ public abstract class AbstractContentRepository implements ProvidedRepository {
        /*
         * 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) {
@@ -106,12 +118,14 @@ public abstract class AbstractContentRepository implements ProvidedRepository {
 //                             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);
@@ -131,6 +145,10 @@ public abstract class AbstractContentRepository implements ProvidedRepository {
                        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 {
@@ -200,8 +218,9 @@ public abstract class AbstractContentRepository implements ProvidedRepository {
                return typesManager;
        }
 
-       public void setUuidFactory(UuidFactory uuidFactory) {
-               this.uuidFactory = uuidFactory;
+       CmsContentSession getSystemSession() {
+               return systemSession;
        }
-
+       
+       
 }