X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2FTypesManager.java;h=c60849355ecf9207512d23dda63ac3d38471ef84;hb=b74e4d3911480252ab20de7cacffdba695c78920;hp=f9077f0a6da9414b016caa25d0a6142c461cb376;hpb=8acca40eb96fef7df712f0cbf5e5ffc13d48fcbd;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/acr/TypesManager.java b/org.argeo.cms/src/org/argeo/cms/acr/TypesManager.java index f9077f0a6..c60849355 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/TypesManager.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/TypesManager.java @@ -5,11 +5,11 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import javax.xml.XMLConstants; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -22,6 +22,7 @@ import javax.xml.validation.Validator; import org.apache.xerces.impl.xs.XSImplementationImpl; import org.apache.xerces.impl.xs.util.StringListImpl; +import org.apache.xerces.jaxp.DocumentBuilderFactoryImpl; import org.apache.xerces.xs.StringList; import org.apache.xerces.xs.XSAttributeDeclaration; import org.apache.xerces.xs.XSAttributeUse; @@ -40,6 +41,9 @@ import org.apache.xerces.xs.XSSimpleTypeDefinition; import org.apache.xerces.xs.XSTerm; import org.apache.xerces.xs.XSTypeDefinition; import org.argeo.api.acr.CrAttributeType; +import org.argeo.api.acr.NamespaceUtils; +import org.argeo.api.acr.RuntimeNamespaceContext; +import org.argeo.api.acr.spi.ContentNamespace; import org.argeo.api.cms.CmsLog; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; @@ -48,7 +52,7 @@ import org.xml.sax.SAXParseException; /** Register content types. */ class TypesManager { private final static CmsLog log = CmsLog.getLog(TypesManager.class); - private Map prefixes = new TreeMap<>(); +// private Map prefixes = new TreeMap<>(); // immutable factories private SchemaFactory schemaFactory; @@ -58,51 +62,49 @@ class TypesManager { // cached private Schema schema; - DocumentBuilderFactory documentBuilderFactory; + private DocumentBuilderFactory documentBuilderFactory; private XSModel xsModel; private SortedMap> types; private boolean validating = true; + private final static boolean limited = false; + public TypesManager() { - schemaFactory = SchemaFactory.newDefaultInstance(); + schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // types - types = new TreeMap<>((qn1, qn2) -> { - if (Objects.equals(qn1.getNamespaceURI(), qn2.getNamespaceURI())) {// same namespace - return qn1.getLocalPart().compareTo(qn2.getLocalPart()); - } else { - return qn1.getNamespaceURI().compareTo(qn2.getNamespaceURI()); - } - }); + types = new TreeMap<>(NamespaceUtils.QNAME_COMPARATOR); } - public synchronized void init() { -// 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); - - for (CmsContentTypes cs : CmsContentTypes.values()) { - StreamSource source = new StreamSource(cs.getResource().toExternalForm()); - sources.add(source); - if (prefixes.containsKey(cs.getDefaultPrefix())) - throw new IllegalStateException("Prefix " + cs.getDefaultPrefix() + " is already mapped with " - + prefixes.get(cs.getDefaultPrefix())); - prefixes.put(cs.getDefaultPrefix(), cs.getNamespace()); - } + public void init() { +// for (CmsContentTypes cs : CmsContentTypes.values()) { +// if (cs.getSchemaResource() != null) { +// StreamSource source = new StreamSource(cs.getSchemaResource().toExternalForm()); +// sources.add(source); +// } +// RuntimeNamespaceContext.register(cs.getNamespace(), cs.getDefaultPrefix()); +// } - reload(); + registerTypes(CmsContentNamespace.values()); +// reload(); } - public synchronized void registerTypes(String defaultPrefix, String namespace, String xsdSystemId) { - if (prefixes.containsKey(defaultPrefix)) - throw new IllegalStateException( - "Prefix " + defaultPrefix + " is already mapped with " + prefixes.get(defaultPrefix)); - prefixes.put(defaultPrefix, namespace); - - sources.add(new StreamSource(xsdSystemId)); + public void registerTypes(ContentNamespace... namespaces) { +// if (prefixes.containsKey(defaultPrefix)) +// throw new IllegalStateException( +// "Prefix " + defaultPrefix + " is already mapped with " + prefixes.get(defaultPrefix)); +// prefixes.put(defaultPrefix, namespace); + for (ContentNamespace contentNamespace : namespaces) { + RuntimeNamespaceContext.register(contentNamespace.getNamespaceURI(), contentNamespace.getDefaultPrefix()); + + if (contentNamespace.getSchemaResource() != null) { + sources.add(new StreamSource(contentNamespace.getSchemaResource().toExternalForm())); + log.debug(() -> "Registered types " + contentNamespace.getNamespaceURI() + " from " + + contentNamespace.getSchemaResource().toExternalForm()); + } + } reload(); } @@ -122,11 +124,14 @@ class TypesManager { schema = schemaFactory.newSchema(sources.toArray(new Source[sources.size()])); // document builder factory - documentBuilderFactory = DocumentBuilderFactory.newInstance(); + // we force usage of Xerces for predictability + documentBuilderFactory = limited ? DocumentBuilderFactory.newInstance() : new DocumentBuilderFactoryImpl(); documentBuilderFactory.setNamespaceAware(true); - documentBuilderFactory.setXIncludeAware(true); - documentBuilderFactory.setSchema(getSchema()); - documentBuilderFactory.setValidating(validating); + if (!limited) { + documentBuilderFactory.setXIncludeAware(true); + documentBuilderFactory.setSchema(getSchema()); + documentBuilderFactory.setValidating(validating); + } // XS model // TODO use JVM implementation? @@ -150,7 +155,7 @@ class TypesManager { // } collectTypes(); } catch (XSException | SAXException e) { - throw new IllegalStateException("Cannot relaod types"); + throw new IllegalStateException("Cannot reload types", e); } } @@ -453,13 +458,14 @@ class TypesManager { try { validator.validate(source); } catch (SAXException e) { - throw new IllegalArgumentException("Provided source is not valid", e); + log.error(source + " is not valid " + e); + // throw new IllegalArgumentException("Provided source is not valid", e); } } - public Map getPrefixes() { - return prefixes; - } +// public Map getPrefixes() { +// return prefixes; +// } public List getSources() { return sources;