/** * Copyright (C) 2010 Orbeon, Inc. * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU Lesser General Public License as published by the Free Software Foundation; either version * 2.1 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * The full text of the license is available at http://www.gnu.org/copyleft/lesser.html */ package org.orbeon.oxf.xml; import org.orbeon.oxf.common.OXFException; import org.orbeon.oxf.controller.PageFlowControllerProcessor; import org.orbeon.oxf.processor.*; import org.orbeon.oxf.processor.XQuery.XQueryProcessor; import org.orbeon.oxf.processor.converter.QNameConverter; import org.orbeon.oxf.processor.converter.XMLConverter; import org.orbeon.oxf.processor.converter.XSLFOConverter; import org.orbeon.oxf.processor.execute.ExecuteProcessor; import org.orbeon.oxf.processor.file.FileProcessor; import org.orbeon.oxf.processor.generator.*; import org.orbeon.oxf.processor.pdf.PDFTemplateProcessor; import org.orbeon.oxf.processor.pipeline.AggregatorProcessor; import org.orbeon.oxf.processor.pipeline.PipelineProcessor; import org.orbeon.oxf.processor.scope.ScopeProcessorBase; import org.orbeon.oxf.processor.serializer.CachedSerializer; import org.orbeon.oxf.processor.serializer.FileSerializer; import org.orbeon.oxf.processor.serializer.HttpSerializer; import org.orbeon.oxf.processor.sql.SQLProcessor; import org.orbeon.oxf.processor.transformer.TraxTransformer; import org.orbeon.oxf.processor.transformer.xslt.XSLT1Transformer; import org.orbeon.oxf.processor.transformer.xslt.XSLTTransformer; import org.orbeon.oxf.processor.validation.MSVValidationProcessor; import org.orbeon.oxf.properties.Properties; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * Global repository which maps schema URIs to file URIs. */ public class SchemaRepository { private static final String SCHEMA_PREFIX = "oxf.schemas."; private static final String BASE_PATH = "/org/orbeon/oxf/"; private static final String GLOBAL_SCHEMA_PATH = BASE_PATH + "xml/"; // NOTE: now trying to put schemas long with respective classes instead private static final String PROCESSORS_SCHEMA_PATH = BASE_PATH + "processor/"; private static final String PORTLET_PROCESSORS_SCHEMA_PATH = BASE_PATH + "portlet/processor/"; private static final Map<String, String> SCHEMAS = new HashMap<String, String>(); private static SchemaRepository instance; static { SCHEMAS.put(Properties.PROPERTIES_SCHEMA_URI, BASE_PATH + "properties/properties.rng"); SCHEMAS.put(PipelineProcessor.PIPELINE_NAMESPACE_URI, "schemas/pipeline.rng"); SCHEMAS.put(AggregatorProcessor.AGGREGATOR_NAMESPACE_URI, "schemas/aggregator.rng"); SCHEMAS.put(DelegationProcessor.DELEGATION_NAMESPACE_URI, "schemas/delegation.rng"); SCHEMAS.put(JavaProcessor.JAVA_CONFIG_NAMESPACE_URI, "schemas/java.rng"); SCHEMAS.put(URLGenerator.URL_NAMESPACE_URI, "schemas/url-generator-config.rng"); SCHEMAS.put(RedirectProcessor.REDIRECT_SCHEMA_URI, "schemas/redirect.rng"); SCHEMAS.put(RequestGenerator.REQUEST_CONFIG_NAMESPACE_URI, "schemas/request-config.rng"); SCHEMAS.put(ImageServer.IMAGE_SERVER_CONFIG_NAMESPACE_URI, "schemas/image-server-config.rng"); SCHEMAS.put(ImageServer.IMAGE_SERVER_IMAGE_NAMESPACE_URI, "schemas/image-server-image.rng"); SCHEMAS.put(RequestSecurityGenerator.REQUEST_SECURITY_NAMESPACE_URI, "schemas/request-security.rng"); SCHEMAS.put(SignatureVerifierProcessor.SIGNATURE_DATA_URI, "schemas/signature.rng"); SCHEMAS.put(SignatureVerifierProcessor.SIGNATURE_PUBLIC_KEY_URI, "schemas/public-key.rng"); SCHEMAS.put(XMLProcessorRegistry.PROCESSOR_REGISTRY_CONFIG_NAMESPACE_URI, "schemas/processor-registry.rng"); // Serializers schemas SCHEMAS.put(CachedSerializer.SERIALIZER_CONFIG_NAMESPACE_URI, PROCESSORS_SCHEMA_PATH + "serializer/legacy-serializer-config.rng"); SCHEMAS.put(HttpSerializer.HTTP_SERIALIZER_CONFIG_NAMESPACE_URI, PROCESSORS_SCHEMA_PATH + "serializer/http-serializer-config.rng"); SCHEMAS.put(FileSerializer.FILE_SERIALIZER_CONFIG_NAMESPACE_URI, "schemas/file-serializer-config.rng"); // Converter schemas SCHEMAS.put(XMLConverter.STANDARD_TEXT_CONVERTER_CONFIG_NAMESPACE_URI, PROCESSORS_SCHEMA_PATH + "converter/standard-text-converter-config.rng"); SCHEMAS.put(XSLFOConverter.XSLFO_CONVERTER_CONFIG_NAMESPACE_URI, PROCESSORS_SCHEMA_PATH + "converter/xslfo-converter-config.rng"); SCHEMAS.put(QNameConverter.QNAME_CONVERTER_CONFIG_NAMESPACE_URI, PROCESSORS_SCHEMA_PATH + "converter/qname-converter-config.rng"); SCHEMAS.put(ScopeProcessorBase.ScopeConfigNamespaceUri(), PROCESSORS_SCHEMA_PATH + "scope/scope-config.rng"); SCHEMAS.put(EmailProcessor.ConfigNamespaceURI(), "schemas/email.rng"); SCHEMAS.put(BeanGenerator.BEAN_CONFIG_NAMESPACE_URI, "schemas/bean-generator-config.rng"); SCHEMAS.put(ResourceServer.RESOURCE_SERVER_NAMESPACE_URI, "schemas/resource-server.rng"); SCHEMAS.put(LDAPProcessor.LDAP_CONFIG_NAMESPACE_URI, "schemas/ldap-config.rng"); SCHEMAS.put(LDAPProcessor.LDAP_FILTER_NAMESPACE_URI, "schemas/ldap-filter.rng"); SCHEMAS.put(SchedulerProcessor.SCHEDULER_CONFIG_NAMESPACE_URI, "schemas/scheduler-config.rng"); SCHEMAS.put(ServletIncludeGenerator.SERVLET_INCLUDE_NAMESPACE_URI, "schemas/servlet-include-config.rng"); // Portlet schemas SCHEMAS.put("http://orbeon.org/oxf/xml/portlet-preferences-serializer-data", PORTLET_PROCESSORS_SCHEMA_PATH + "portlet-preferences-serializer-data.rng"); // XSLT schemas SCHEMAS.put(XSLTTransformer.XSLT_TRANSFORMER_CONFIG_NAMESPACE_URI, "schemas/xslt-transformer-config.rng"); SCHEMAS.put(XSLTTransformer.XSLT_PREFERENCES_CONFIG_NAMESPACE_URI, "schemas/attributes-config.rng"); SCHEMAS.put(TraxTransformer.TRAX_TRANSFORMER_CONFIG_NAMESPACE_URI, "schemas/trax-transformer-config.rng"); SCHEMAS.put(PageFlowControllerProcessor.ControllerNamespaceURI(), "schemas/page-flow-controller.rng"); SCHEMAS.put(MSVValidationProcessor.ORBEON_ERROR_NS, "schemas/validation-config.rng"); SCHEMAS.put(DirectoryScannerProcessor.DIRECTORY_GENERATOR_NAMESPACE_URI, "schemas/directory-generator-config.rng"); // SQL processor schemas SCHEMAS.put(SQLProcessor.SQL_NAMESPACE_URI, PROCESSORS_SCHEMA_PATH + "sql/sql-processor-config.rng"); SCHEMAS.put(SQLProcessor.SQL_DATASOURCE_URI, PROCESSORS_SCHEMA_PATH + "sql/sql-processor-datasource.rng"); // XQuery Generator schema SCHEMAS.put(XQueryProcessor.XQUERY_NAMESPACE_URI, PROCESSORS_SCHEMA_PATH + "XQuery/xquery-processor.rng"); // Test processor schema // 2016-06-09: Not good that we have to hardcode this, but the processor is now in a different module. Processors // should be able to add themselves to the repository somehow. SCHEMAS.put("http://www.orbeon.org/oxf/xml/schemas/test-processor", PROCESSORS_SCHEMA_PATH + "test/test-processor-config.rng"); SCHEMAS.put(PDFTemplateProcessor.PDFTemplateModelNamespaceURI(), PROCESSORS_SCHEMA_PATH + "pdf/pdf-template-model.rng"); SCHEMAS.put("http://relaxng.org/ns/structure/1.0", "schemas/relaxng.rng"); SCHEMAS.put("http://www.w3.org/2001/xml-events", "schemas/XML-Events-Schema.xsd"); SCHEMAS.put("http://www.w3.org/2001/XMLSchema", "schemas/XMLSchema.xsd"); SCHEMAS.put("http://www.w3.org/XML/1998/namespace", "schemas/xml.xsd"); // XSLT schemas SCHEMAS.put(XSLT1Transformer.XSLT_1_0_PSEUDO_URI, "schemas/xslt-1_0.rng");// Schema for 1.0 only SCHEMAS.put(XSLTTransformer.XSLT_URI, "schemas/xslt-2_0.xsd");// Schema for 1.0 and 2.0, should be less restrictive // Other schemas SCHEMAS.put(FileProcessor.FILE_PROCESSOR_CONFIG_NAMESPACE_URI, PROCESSORS_SCHEMA_PATH + "file/file-processor-config.rng"); SCHEMAS.put(ExecuteProcessor.EXECUTE_PROCESSOR_CONFIG_NAMESPACE_URI, PROCESSORS_SCHEMA_PATH + "execute/execute-processor-config.rng"); } private SchemaRepository() { // Don't allow creation from outside } /** * Return the global instance of SchemaRepository. * * @return SchemaRepository */ public static SchemaRepository instance() { if (instance == null) instance = new SchemaRepository(); return instance; } /** * Get a systemId by looking in the properties, then in the builtin Orbeon Forms schemas. This is used for * user-defined validation. */ public String getSchemaLocation(String publicId) { // First look in the properties final Set keys = Properties.instance().keySet(); if (keys != null) { for (Iterator i = keys.iterator(); i.hasNext();) { final String currentKey = (String) i.next(); if (currentKey.equals(SCHEMA_PREFIX + publicId)) { return Properties.instance().getPropertySet().getString(currentKey); } } } // Not defined in properties: try predefined Orbeon Forms schemas final String schemaFile = SCHEMAS.get(publicId); if (schemaFile != null) { if (schemaFile.startsWith("/")) return "oxf:" + schemaFile; else return "oxf:" + GLOBAL_SCHEMA_PATH + schemaFile; } throw new OXFException("Can't load schema for URI: " + publicId); } }