- public ContentProvider getMountContentProvider(Content mountPoint, boolean initialize, QName... types) {
- String mountPath = mountPoint.getPath();
- if (partitions.containsKey(mountPath))
- // TODO check consistency with types
- return partitions.get(mountPath);
- DocumentBuilder dBuilder = contentTypesManager.newDocumentBuilder();
- Document document;
- if (initialize) {
- QName firstType = types[0];
- document = dBuilder.newDocument();
- String prefix = ((ProvidedContent) mountPoint).getSession().getPrefix(firstType.getNamespaceURI());
- Element root = document.createElementNS(firstType.getNamespaceURI(),
- prefix + ":" + firstType.getLocalPart());
- DomUtils.addNamespace(root, prefix, firstType.getNamespaceURI());
- document.appendChild(root);
-// try (OutputStream out = mountPoint.open(OutputStream.class)) {
-// writeDom(document, out);
-// } catch (IOException e) {
-// throw new IllegalStateException("Cannot write mount from " + mountPoint, e);
-// }
- } else {
- try (InputStream in = mountPoint.open(InputStream.class)) {
- document = dBuilder.parse(in);
- // TODO check consistency with types
- } catch (IOException | SAXException e) {
- throw new IllegalStateException("Cannot load mount from " + mountPoint, e);
- }
- }
- DomContentProvider contentProvider = new DomContentProvider(mountPath, document);
- partitions.put(mountPath, contentProvider);
- return contentProvider;
- }
-
- @Override
- public boolean shouldMount(QName... types) {
- if (types.length == 0)
- throw new IllegalArgumentException("Types must be provided");
- QName firstType = types[0];
- Set<QName> registeredTypes = contentTypesManager.listTypes();
- if (registeredTypes.contains(firstType))
- return true;
- return false;
- }
-
- /*
- * NAMESPACE CONTEXT
- */
-
- /*
- * SESSION
- */
-
- class CmsContentSession implements ProvidedSession {
- private Subject subject;
- private Locale locale;
-
- private CompletableFuture<ProvidedSession> closed = new CompletableFuture<>();
-
- private CompletableFuture<ContentSession> edition;
-
- public CmsContentSession(Subject subject, Locale locale) {
- this.subject = subject;
- this.locale = locale;
- }
-
- public void close() {
- closed.complete(this);
- }
-
- @Override
- public CompletionStage<ProvidedSession> onClose() {
- return closed.minimalCompletionStage();
- }
-
- @Override
- public Content get(String path) {
- Map.Entry<String, ContentProvider> entry = partitions.floorEntry(path);
- if (entry == null)
- throw new IllegalArgumentException("No entry provider found for " + path);
- String mountPath = entry.getKey();
- ContentProvider provider = entry.getValue();
- String relativePath = path.substring(mountPath.length());
- if (relativePath.length() > 0 && relativePath.charAt(0) == '/')
- relativePath = relativePath.substring(1);
- return provider.get(CmsContentSession.this, mountPath, relativePath);
- }
-
- @Override
- public Subject getSubject() {
- return subject;
- }
-
- @Override
- public Locale getLocale() {
- return locale;
- }
-
- @Override
- public ProvidedRepository getRepository() {
- return CmsContentRepository.this;
- }
-
- /*
- * MOUNT MANAGEMENT
- */
- @Override
- public Content getMountPoint(String path) {
- String[] parent = ContentUtils.getParentPath(path);
- ProvidedContent mountParent = (ProvidedContent) get(parent[0]);
-// Content mountPoint = mountParent.getProvider().get(CmsContentSession.this, null, path);
- return mountParent.getMountPoint(parent[1]);
- }
-
- /*
- * NAMESPACE CONTEXT
- */
-
- @Override
- public String getNamespaceURI(String prefix) {
- return NamespaceUtils.getNamespaceURI((p) -> contentTypesManager.getPrefixes().get(p), prefix);
- }
-
- @Override
- public Iterator<String> getPrefixes(String namespaceURI) {
- return NamespaceUtils.getPrefixes(
- (ns) -> contentTypesManager.getPrefixes().entrySet().stream().filter(e -> e.getValue().equals(ns))
- .map(Map.Entry::getKey).collect(Collectors.toUnmodifiableSet()),
- namespaceURI);
- }
-
- @Override
- public CompletionStage<ContentSession> edit(Consumer<ContentSession> work) {
- edition = CompletableFuture.supplyAsync(() -> {
- work.accept(this);
- return this;
- }).thenApply((s) -> {
- // TODO optimise
- for (ContentProvider provider : partitions.values()) {
- if (provider instanceof DomContentProvider) {
- ((DomContentProvider) provider).persist(s);
- }
- }
- return s;
- });
- return edition.minimalCompletionStage();
- }
-
- @Override
- public boolean isEditing() {
- return edition != null && !edition.isDone();