X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2FCmsContentRepository.java;h=50438e89a094b4cf7411c3bb86a7358eb93a5b30;hb=2ff5b17e0065bf0b8d9eca41d7029f4969f44aac;hp=6d17ea87dd4d6fc463e01cfcee3f75ca0c061549;hpb=c615307d7b87bcb260d8a9f402c6e0a880862f38;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java b/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java index 6d17ea87d..50438e89a 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/CmsContentRepository.java @@ -11,7 +11,6 @@ import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.NavigableMap; -import java.util.Set; import java.util.TreeMap; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; @@ -20,6 +19,7 @@ import java.util.stream.Collectors; import javax.security.auth.Subject; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; +import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -29,7 +29,6 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerFactoryConfigurationError; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; -import javax.xml.validation.Schema; import org.argeo.api.acr.Content; import org.argeo.api.acr.ContentSession; @@ -62,20 +61,20 @@ public class CmsContentRepository implements ProvidedRepository { private NavigableMap partitions = new TreeMap<>(); // TODO synchronize ? - private NavigableMap prefixes = new TreeMap<>(); +// private NavigableMap prefixes = new TreeMap<>(); - private Schema schema; +// private Schema schema; + private ContentTypesManager contentTypesManager; private CmsContentSession systemSession; private Map userSessions = Collections.synchronizedMap(new HashMap<>()); public CmsContentRepository() { - prefixes.put(CrName.CR_DEFAULT_PREFIX, CrName.CR_NAMESPACE_URI); - prefixes.put("basic", CrName.CR_NAMESPACE_URI); - prefixes.put("owner", CrName.CR_NAMESPACE_URI); - prefixes.put("posix", CrName.CR_NAMESPACE_URI); - + contentTypesManager = new ContentTypesManager(); + contentTypesManager.init(); + contentTypesManager.listTypes(); + systemSession = newSystemSession(); } @@ -136,15 +135,16 @@ public class CmsContentRepository implements ProvidedRepository { mount.put(CrName.MOUNT.get(), "true"); } - public void registerPrefix(String prefix, String namespaceURI) { - String registeredUri = prefixes.get(prefix); - if (registeredUri == null) { - prefixes.put(prefix, namespaceURI); - return; - } - if (!registeredUri.equals(namespaceURI)) - throw new IllegalStateException("Prefix " + prefix + " is already registred for " + registeredUri); - // do nothing if same namespace is already registered + public void registerTypes(String prefix, String namespaceURI, String schemaSystemId) { + contentTypesManager.registerTypes(prefix, namespaceURI, schemaSystemId); +// String registeredUri = prefixes.get(prefix); +// if (registeredUri == null) { +// prefixes.put(prefix, namespaceURI); +// return; +// } +// if (!registeredUri.equals(namespaceURI)) +// throw new IllegalStateException("Prefix " + prefix + " is already registred for " + registeredUri); +// // do nothing if same namespace is already registered } /* @@ -157,6 +157,8 @@ public class CmsContentRepository implements ProvidedRepository { factory.setXIncludeAware(true); // factory.setSchema(schema); + factory.setSchema(contentTypesManager.getSchema()); + DocumentBuilder dBuilder = factory.newDocumentBuilder(); dBuilder.setErrorHandler(new ErrorHandler() { @@ -176,21 +178,24 @@ public class CmsContentRepository implements ProvidedRepository { }); Document document; - if (Files.exists(path)) { - InputSource inputSource = new InputSource(path.toAbsolutePath().toUri().toString()); - inputSource.setEncoding(StandardCharsets.UTF_8.name()); - // TODO public id as well? - document = dBuilder.parse(inputSource); - } else { - document = dBuilder.newDocument(); -// Element root = document.createElementNS(CrName.ROOT.getNamespaceURI(), -// CrName.ROOT.get().toPrefixedString()); - Element root = document.createElement(CrName.ROOT.get().toPrefixedString()); - // root.setAttribute("xmlns", ""); - root.setAttribute("xmlns:" + CrName.CR_DEFAULT_PREFIX, CrName.CR_NAMESPACE_URI); - document.appendChild(root); - - // write it +// if (path != null && Files.exists(path)) { +// InputSource inputSource = new InputSource(path.toAbsolutePath().toUri().toString()); +// inputSource.setEncoding(StandardCharsets.UTF_8.name()); +// // TODO public id as well? +// document = dBuilder.parse(inputSource); +// } else { + document = dBuilder.newDocument(); + Element root = document.createElementNS(CrName.CR_NAMESPACE_URI, CrName.ROOT.get().toPrefixedString()); + + for (String prefix : contentTypesManager.getPrefixes().keySet()) { + root.setAttributeNS(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, XMLConstants.XMLNS_ATTRIBUTE + ":" + prefix, + contentTypesManager.getPrefixes().get(prefix)); + } + + document.appendChild(root); + + // write it + if (path != null) { TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(document); @@ -199,11 +204,12 @@ public class CmsContentRepository implements ProvidedRepository { transformer.transform(source, result); } } +// } DomContentProvider contentProvider = new DomContentProvider(document); addProvider("/", contentProvider); - } catch (DOMException | ParserConfigurationException | SAXException | IOException - | TransformerFactoryConfigurationError | TransformerException e) { + } catch (DOMException | ParserConfigurationException | IOException | TransformerFactoryConfigurationError + | TransformerException e) { throw new IllegalStateException("Cannot init ACR root " + path, e); } @@ -240,9 +246,13 @@ public class CmsContentRepository implements ProvidedRepository { @Override public Content get(String path) { Map.Entry 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); } @@ -267,13 +277,15 @@ public class CmsContentRepository implements ProvidedRepository { @Override public String getNamespaceURI(String prefix) { - return NamespaceUtils.getNamespaceURI((p) -> prefixes.get(p), prefix); + return NamespaceUtils.getNamespaceURI((p) -> contentTypesManager.getPrefixes().get(p), prefix); } @Override public Iterator getPrefixes(String namespaceURI) { - return NamespaceUtils.getPrefixes((ns) -> prefixes.entrySet().stream().filter(e -> e.getValue().equals(ns)) - .map(Map.Entry::getKey).collect(Collectors.toUnmodifiableSet()), namespaceURI); + return NamespaceUtils.getPrefixes( + (ns) -> contentTypesManager.getPrefixes().entrySet().stream().filter(e -> e.getValue().equals(ns)) + .map(Map.Entry::getKey).collect(Collectors.toUnmodifiableSet()), + namespaceURI); } // @Override