From: <sp...@us...> - 2011-06-18 09:42:09
|
Revision: 7861 http://geonetwork.svn.sourceforge.net/geonetwork/?rev=7861&view=rev Author: sppigot Date: 2011-06-18 09:42:02 +0000 (Sat, 18 Jun 2011) Log Message: ----------- Add validation of schema-ident file for schemas so that errors and/or missing elements do not cause NPE Change schema-ident namespace to something more reasonable Modified Paths: -------------- sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/utils/Xml.java sandbox/BlueNetMEST/ANZMEST/web/src/main/java/org/fao/geonet/kernel/SchemaManager.java sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/config-metadata-mcp.xml sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/log4j.cfg sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/oasis-catalog.xml sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/csw-record/schema-ident.xml sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/dublin-core/schema-ident.xml sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/fgdc-std/schema-ident.xml sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19110/schema-ident.xml sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19115/schema-ident.xml sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19139/schema-ident.xml Added Paths: ----------- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/validation/schemaPlugins/ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/validation/schemaPlugins/schema-ident.xsd Modified: sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/utils/Xml.java =================================================================== --- sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/utils/Xml.java 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/jeeves/src/main/java/jeeves/utils/Xml.java 2011-06-18 09:42:02 UTC (rev 7861) @@ -956,6 +956,10 @@ Schema schema = factory().newSchema(); ErrorHandler eh = new ErrorHandler(); validateRealGuts(schema, xml, eh); + if (eh.errors()) { + Element xsdXPaths = eh.getXPaths(); + throw new XSDValidationErrorEx("XSD Validation error(s):\n"+getString(xsdXPaths), xsdXPaths); + } } //--------------------------------------------------------------------------- @@ -970,7 +974,7 @@ public static void validate(String schemaPath, Element xml) throws Exception { Element xsdXPaths = validateInfo(schemaPath,xml); - if (xsdXPaths != null && xsdXPaths.getContent().size() > 0) throw new XSDValidationErrorEx("XSD Validation error(s)", xsdXPaths); + if (xsdXPaths != null && xsdXPaths.getContent().size() > 0) throw new XSDValidationErrorEx("XSD Validation error(s):\n"+getString(xsdXPaths), xsdXPaths); } //--------------------------------------------------------------------------- @@ -1087,7 +1091,6 @@ Resolver resolver = ResolverWrapper.getInstance(); ValidatorHandler vh = schema.newValidatorHandler(); - String nullStr = null; vh.setResourceResolver(resolver.getXmlResolver()); vh.setErrorHandler(eh); Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/java/org/fao/geonet/kernel/SchemaManager.java =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/java/org/fao/geonet/kernel/SchemaManager.java 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/java/org/fao/geonet/kernel/SchemaManager.java 2011-06-18 09:42:02 UTC (rev 7861) @@ -1,9 +1,9 @@ -//============================================================================== +//============================================================================= //=== //=== SchemaManager //=== -//============================================================================== -//=== Copyright (C) GeoNetwork +//============================================================================= +//=== Copyright (C) Free Software Foundation //=== //=== This program is free software; you can redistribute it and/or modify //=== it under the terms of the GNU General Public License as published by @@ -81,7 +81,7 @@ private static final int MODE_ROOT = 1; private static final int MODE_NEEDLEWITHVALUE = 2; - private static final String GEONET_SCHEMA_URI = "http://www.osgeo.org/geonetwork/schemas/geonet_schema"; + private static final String GEONET_SCHEMA_URI = "http://geonetwork-opensource.org/schemas/schema-ident"; private static final Namespace GEONET_SCHEMA_PREFIX_NS = Namespace.getNamespace("gns", GEONET_SCHEMA_URI); private static final Namespace GEONET_SCHEMA_NS = Namespace.getNamespace(GEONET_SCHEMA_URI); @@ -703,17 +703,17 @@ Map<String, XmlFile> xfMap = new HashMap<String, XmlFile>(); for (String fname : fnames) { - Log.info(Geonet.SCHEMA_MANAGER, "Searching for "+path+"/loc/"+defaultLang+"/"+fname); + Log.debug(Geonet.SCHEMA_MANAGER, "Searching for "+path+"/loc/"+defaultLang+"/"+fname); if (new File(path+ FS +"loc"+ FS +defaultLang+ FS +fname).exists()) { Element config = new Element("xml"); config.setAttribute("name",name); config.setAttribute("base",base); config.setAttribute("file",fname); - Log.info(Geonet.SCHEMA_MANAGER, "Adding XmlFile "+Xml.getString(config)); + Log.debug(Geonet.SCHEMA_MANAGER, "Adding XmlFile "+Xml.getString(config)); XmlFile xf = new XmlFile(config, defaultLang, true); xfMap.put(fname, xf); } else { - Log.info(Geonet.SCHEMA_MANAGER, "Unable to load this file"); + Log.debug(Geonet.SCHEMA_MANAGER, "Unable to load this file"); } } @@ -991,20 +991,28 @@ String substitutesFile = schemasDir + saSchemas[i] +"/"+ Geonet.File.SCHEMA_SUBSTITUTES; String idFile = schemasDir + saSchemas[i] +"/"+ Geonet.File.SCHEMA_ID; String oasisCatFile = schemasDir + saSchemas[i] +"/"+ Geonet.File.SCHEMA_OASIS; - + + String stage = ""; try { + // validate the schema-ident file before reading it + stage = "reading schema-ident file "+idFile; + Element root = Xml.loadFile(idFile); + stage = "validating schema-ident file "+idFile; + Xml.validate(new Document(root)); + if (hmSchemas.containsKey(saSchemas[i])) { // exists so ignore it Log.error(Geonet.SCHEMA_MANAGER, "Schema "+saSchemas[i]+" already exists - cannot add!"); } else { + stage = "adding the schema information"; addSchema(fromAppPath, saSchemas[i], isPluginSchema, schemaPluginCatRoot, schemaFile, suggestFile, substitutesFile, idFile, oasisCatFile); numberOfSchemasAdded++; } } catch (Exception e) { - Log.error(Geonet.SCHEMA_MANAGER, "Failed. "+e.getMessage()); - Log.debug(Geonet.SCHEMA_MANAGER, e); - continue; // skip this one + Log.error(Geonet.SCHEMA_MANAGER, "Failed whilst "+stage+". Exception message if any is "+e.getMessage()); + e.printStackTrace(); + continue; // skip this schema } - } + } } } Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/config-metadata-mcp.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/config-metadata-mcp.xml 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/config-metadata-mcp.xml 2011-06-18 09:42:02 UTC (rev 7861) @@ -57,6 +57,27 @@ <output sheet="thesaurus-taxonlist.xsl" contentType="text/xml; charset=UTF-8"/> </service> + <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> + + <service name="iso19139.mcp.xml"> + <class name=".services.metadata.Show" /> + <output sheet="schemaPlugins/iso19139.mcp/convert/xml_iso19139.mcp.xsl" contentType="text/xml; charset=UTF-8"/> + <error id="operation-not-allowed" sheet="error-embedded.xsl" statusCode="403"> + <xml name="error" file="xml/privileges-error.xml" /> + </error> + </service> + + <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> + + <service name="iso19139.mcp-1.4.xml"> + <class name=".services.metadata.Show" /> + <output sheet="schemaPlugins/iso19139.mcp-1.4/convert/xml_iso19139.mcp-1.4.xsl" contentType="text/xml; charset=UTF-8"/> + <error id="operation-not-allowed" sheet="error-embedded.xsl" statusCode="403"> + <xml name="error" file="xml/privileges-error.xml" /> + </error> + </service> + + <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> </services> </geonet> Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/log4j.cfg =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/log4j.cfg 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/log4j.cfg 2011-06-18 09:42:02 UTC (rev 7861) @@ -5,7 +5,7 @@ log4j.logger.geonetwork = DEBUG, console, jeeves log4j.logger.geonetwork.search = DEBUG -log4j.logger.geonetwork.schemamanager = DEBUG +log4j.logger.geonetwork.schemamanager = INFO log4j.logger.geonetwork.editorexpandelement = WARN log4j.logger.geonetwork.editoraddelement = WARN log4j.logger.geonetwork.index = WARN Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/oasis-catalog.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/oasis-catalog.xml 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/WEB-INF/oasis-catalog.xml 2011-06-18 09:42:02 UTC (rev 7861) @@ -9,9 +9,16 @@ <!-- Each schema has an oasis-catalog file for remapping individual xsd schemaLocation hints --> + <!-- remap system id schema-ident.xsd to local copy in GeoNetwork + relative to this catalog file --> + + <system systemId="http://geonetwork-opensource.org/schemas/schema-ident/schema-ident.xsd" + uri="../xml/validation/schemaPlugins/schema-ident.xsd"/> + <!-- remap utils-fn.xsl included in schematrons to the correct place relative to this catalog file --> + <uri name="../../../xsl/utils-fn.xsl" uri="../xsl/utils-fn.xsl"/> Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/csw-record/schema-ident.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/csw-record/schema-ident.xml 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/csw-record/schema-ident.xml 2011-06-18 09:42:02 UTC (rev 7861) @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<schema xmlns="http://www.osgeo.org/geonetwork/schemas/geonet_schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgeo.org/geonetwork/schemas/geonet_schema http://www.osgeo.org/geonetwork/schemas/geonet_schema/geonet_schema.xsd"> +<schema xmlns="http://geonetwork-opensource.org/schemas/schema-ident" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://geonetwork-opensource.org/schemas/schema-ident http://geonetwork-opensource.org/schemas/schema-ident/schema-ident.xsd"> <name>csw-record</name> <id>e5f27024-dde2-11df-a18e-001c2346de4c</id> <version>2.0.2</version> Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/dublin-core/schema-ident.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/dublin-core/schema-ident.xml 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/dublin-core/schema-ident.xml 2011-06-18 09:42:02 UTC (rev 7861) @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<gns:schema xmlns:gns="http://www.osgeo.org/geonetwork/schemas/geonet_schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgeo.org/geonetwork/schemas/geonet_schema http://www.osgeo.org/geonetwork/schemas/geonet_schema/geonet_schema.xsd"> +<gns:schema xmlns:gns="http://geonetwork-opensource.org/schemas/schema-ident" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://geonetwork-opensource.org/schemas/schema-ident http://geonetwork-opensource.org/schemas/schema-ident/schema-ident.xsd"> <gns:name>dublin-core</gns:name> <gns:id>3785ae4c-dde3-11df-a813-001c2346de4c</gns:id> <gns:version>1.0</gns:version> Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/fgdc-std/schema-ident.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/fgdc-std/schema-ident.xml 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/fgdc-std/schema-ident.xml 2011-06-18 09:42:02 UTC (rev 7861) @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<gns:schema xmlns:gns="http://www.osgeo.org/geonetwork/schemas/geonet_schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgeo.org/geonetwork/schemas/geonet_schema http://www.osgeo.org/geonetwork/schemas/geonet_schema/geonet_schema.xsd"> +<gns:schema xmlns:gns="http://geonetwork-opensource.org/schemas/schema-ident" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://geonetwork-opensource.org/schemas/schema-ident http://geonetwork-opensource.org/schemas/schema-ident/schema-ident.xsd"> <gns:name>fgdc-std</gns:name> <gns:id>7cd48bd0-dde3-11df-81b4-001c2346de4c</gns:id> <gns:version>1.0</gns:version> Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19110/schema-ident.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19110/schema-ident.xml 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19110/schema-ident.xml 2011-06-18 09:42:02 UTC (rev 7861) @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<schema xmlns="http://www.osgeo.org/geonetwork/schemas/geonet_schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgeo.org/geonetwork/schemas/geonet_schema http://www.osgeo.org/geonetwork/schemas/geonet_schema/geonet_schema.xsd"> +<schema xmlns="http://geonetwork-opensource.org/schemas/schema-ident" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://geonetwork-opensource.org/schemas/schema-ident http://geonetwork-opensource.org/schemas/schema-ident/schema-ident.xsd"> <name>iso19110</name> <id>ae229ba0-dde3-11df-99ab-001c2346de4c</id> <version>1.0</version> Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19115/schema-ident.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19115/schema-ident.xml 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19115/schema-ident.xml 2011-06-18 09:42:02 UTC (rev 7861) @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<gns:schema xmlns:gns="http://www.osgeo.org/geonetwork/schemas/geonet_schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgeo.org/geonetwork/schemas/geonet_schema http://www.osgeo.org/geonetwork/schemas/geonet_schema/geonet_schema.xsd"> +<gns:schema xmlns:gns="http://geonetwork-opensource.org/schemas/schema-ident" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://geonetwork-opensource.org/schemas/schema-ident http://geonetwork-opensource.org/schemas/schema-ident/schema-ident.xsd"> <gns:name>iso19115</gns:name> <gns:id>f4862378-dde3-11df-b603-001c2346de4c</gns:id> <gns:version>1.0</gns:version> Modified: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19139/schema-ident.xml =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19139/schema-ident.xml 2011-06-18 09:36:14 UTC (rev 7860) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/schemas/iso19139/schema-ident.xml 2011-06-18 09:42:02 UTC (rev 7861) @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<schema xmlns="http://www.osgeo.org/geonetwork/schemas/geonet_schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgeo.org/geonetwork/schemas/geonet_schema http://www.osgeo.org/geonetwork/schemas/geonet_schema/geonet_schema.xsd"> +<schema xmlns="http://geonetwork-opensource.org/schemas/schema-ident" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://geonetwork-opensource.org/schemas/schema-ident http://geonetwork-opensource.org/schemas/schema-ident/schema-ident.xsd"> <name>iso19139</name> <id>3f95190a-dde4-11df-8626-001c2346de4c</id> <version>1.0</version> Added: sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/validation/schemaPlugins/schema-ident.xsd =================================================================== --- sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/validation/schemaPlugins/schema-ident.xsd (rev 0) +++ sandbox/BlueNetMEST/ANZMEST/web/src/main/webapp/xml/validation/schemaPlugins/schema-ident.xsd 2011-06-18 09:42:02 UTC (rev 7861) @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<xs:schema version="1.0" elementFormDefault="qualified" + attributeFormDefault="unqualified" + targetNamespace="http://geonetwork-opensource.org/schemas/schema-ident" + xmlns:gns="http://geonetwork-opensource.org/schemas/schema-ident" + xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:annotation> + <xs:documentation> + XML Schema which can be used to validate GeoNetwork schema-ident.xml + file used in Schema Plugins. + </xs:documentation> + </xs:annotation> + +<!-- ====================================================================== --> +<!-- schema is the root element in a GeoNetwork schema identification --> +<!-- ====================================================================== --> + + <xs:element name="schema" type="gns:schemaType"/> + +<!-- ====================================================================== --> +<!-- schemaType complex type --> +<!-- ====================================================================== --> + + <xs:complexType name="schemaType"> + <xs:annotation> + <xs:documentation> + All schema identity files must have the elements defined in this + type: + + name = unique name of the schema used in GeoNetwork (lower case, + and if a profile then it should be named after the base schema + using base-schema-name.profile-name eg. iso19139.mcp) + + id = unique identifier for the schema + + version = official version number of the schema + + schemaLocation = official URL of XML schema definitions (XSD) for this + metadata schema + + autodetect = information used to detect whether a metadata record + belongs to this schema + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="name" type="xs:string" minOccurs="1"/> + <xs:element name="id" type="xs:string" minOccurs="1"/> + <xs:element name="version" type="xs:string" minOccurs="1"/> + <xs:element name="schemaLocation" type="xs:string" minOccurs="1"/> + <xs:element name="autodetect" type="gns:autodetectType" + minOccurs="1" maxOccurs="1"/> + </xs:sequence> + </xs:complexType> + +<!-- ====================================================================== --> +<!-- autodetectType complex type --> +<!-- ====================================================================== --> + + <xs:complexType name="autodetectType"> + <xs:annotation> + <xs:documentation> + Define the information used to determine whether a + metadata record is defined using this schema. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="elements" type="gns:elementsType" minOccurs="1"/> + </xs:sequence> + </xs:complexType> + +<!-- ====================================================================== --> +<!-- elementsType complex type --> +<!-- ====================================================================== --> + + <xs:complexType name="elementsType"> + <xs:annotation> + <xs:documentation> + Contains the elements that must exist in a metadata record for it + to be identified as belonging to this schema. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:any namespace="##any" processContents="skip" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="type" use="optional"> + <xs:annotation> + <xs:documentation> + Determines how the elements specified will be used to detect the + schema. + + root = the element defined is expected to be the root element + + search = the elements and their content must be present somewhere in + the record (default if unspecified) + </xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="root"/> + <xs:enumeration value="search"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + +</xs:schema> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |