/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.validator; import java.util.HashSet; import java.util.Set; import org.w3c.dom.ls.LSInput; import org.w3c.dom.ls.LSResourceResolver; import org.apache.camel.CamelContext; import org.apache.camel.ContextTestSupport; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.impl.JndiRegistry; import org.apache.camel.model.language.ConstantExpression; import org.apache.camel.model.language.SimpleExpression; import org.junit.Assert; public class ValidatorResourceResolverFactoryTest extends ContextTestSupport { private JndiRegistry registry; public void testConfigurationOnEndpoint() throws Exception { // ensure that validator from test method "testConfigurationOnComponent" // is unbind registry.getContext().unbind("validator"); String directStart = "direct:start"; String endpointUri = "validator:org/apache/camel/component/validator/xsds/person.xsd?resourceResolverFactory=#resourceResolverFactory"; execute(directStart, endpointUri); } public void testConfigurationOnComponent() throws Exception { // set resource resolver factory on component ValidatorComponent validatorComponent = new ValidatorComponent(); validatorComponent.setResourceResolverFactory(new ResourceResolverFactoryImpl()); registry.bind("validator", validatorComponent); String directStart = "direct:startComponent"; String endpointUri = "validator:org/apache/camel/component/validator/xsds/person.xsd"; execute(directStart, endpointUri); } void execute(String directStart, String endpointUri) throws InterruptedException { MockEndpoint endEndpoint = resolveMandatoryEndpoint("mock:end", MockEndpoint.class); endEndpoint.expectedMessageCount(1); final String body = "<p:person user=\"james\" xmlns:p=\"org.person\" xmlns:h=\"org.health.check.person\" xmlns:c=\"org.health.check.common\">\n" // + " <p:firstName>James</p:firstName>\n" // + " <p:lastName>Strachan</p:lastName>\n" // + " <p:city>London</p:city>\n" // + " <h:health>\n"// + " <h:lastCheck>2011-12-23</h:lastCheck>\n" // + " <h:status>OK</h:status>\n" // + " <c:commonElement>" // + " <c:element1/>" // + " <c:element2/>" // + " </c:commonElement>" // + " </h:health>\n" // + "</p:person>"; template.sendBody(directStart, body); // fetch dynamic endpoint ValidatorEndpoint validatorEndpoint = null; for (int i = 0; i < 5; i++) { validatorEndpoint = resolveMandatoryEndpoint(endpointUri, ValidatorEndpoint.class); if (validatorEndpoint != null) { break; } // wait until endpoint is resolved Thread.sleep(50); } MockEndpoint.assertIsSatisfied(endEndpoint); Assert.assertNotNull(validatorEndpoint); CustomResourceResolver resolver = (CustomResourceResolver)validatorEndpoint.getResourceResolver(); Set<String> uris = resolver.getResolvedResourceUris(); checkResourceUri(uris, "../type2.xsd"); checkResourceUri(uris, "health/health.xsd"); checkResourceUri(uris, "type1.xsd"); checkResourceUri(uris, "common/common.xsd"); } void checkResourceUri(Set<String> uris, String resourceUri) { Assert.assertTrue("Missing resource uri " + resourceUri + " in resolved resource URI set", uris.contains(resourceUri)); } @Override protected JndiRegistry createRegistry() throws Exception { registry = super.createRegistry(); registry.bind("resourceResolverFactory", new ResourceResolverFactoryImpl()); return registry; } @Override protected RouteBuilder[] createRouteBuilders() throws Exception { return new RouteBuilder[] {new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").setHeader("xsd_file", new ConstantExpression("org/apache/camel/component/validator/xsds/person.xsd")) .recipientList(new SimpleExpression("validator:${header.xsd_file}?resourceResolverFactory=#resourceResolverFactory")).to("mock:end"); } }, new RouteBuilder() { @Override public void configure() throws Exception { from("direct:startComponent").setHeader("xsd_file", new ConstantExpression("org/apache/camel/component/validator/xsds/person.xsd")) .recipientList(new SimpleExpression("validator:${header.xsd_file}")).to("mock:end"); } }}; } static class ResourceResolverFactoryImpl implements ValidatorResourceResolverFactory { @Override public LSResourceResolver createResourceResolver(CamelContext camelContext, String rootResourceUri) { return new CustomResourceResolver(camelContext, rootResourceUri); } } /** Custom resource resolver which collects all resolved resource URIs. */ static class CustomResourceResolver extends DefaultLSResourceResolver { private final Set<String> resolvedRsourceUris = new HashSet<>(); CustomResourceResolver(CamelContext camelContext, String resourceUri) { super(camelContext, resourceUri); } public Set<String> getResolvedResourceUris() { return resolvedRsourceUris; } @Override public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) { LSInput result = super.resolveResource(type, namespaceURI, publicId, systemId, baseURI); resolvedRsourceUris.add(systemId); return result; } } }