/**
* 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.xslt;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import org.apache.camel.CamelContext;
import org.apache.camel.ContextTestSupport;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.builder.xml.XsltUriResolver;
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 XsltUriResolverFactoryTest extends ContextTestSupport {
private JndiRegistry registry;
public void testConfigurationOnEndpoint() throws Exception {
String endpointUri = "xslt:xslt/staff/staff.xsl?uriResolverFactory=#uriResolverFactory";
String directStart = "direct:start";
// ensure that the URI resolver factory is not set on the component by
// the method "testConfigurationOnComponent"
registry.getContext().unbind("xslt");
execute(endpointUri, directStart);
}
public void testConfigurationOnComponent() throws Exception {
XsltComponent xsltComponent = new XsltComponent();
xsltComponent.setUriResolverFactory(new CustomXsltUriResolverFactory());
registry.bind("xslt", xsltComponent);
String endpointUri = "xslt:xslt/staff/staff.xsl";
String directStart = "direct:startComponent";
execute(endpointUri, directStart);
}
void execute(String endpointUri, String directStart) throws InterruptedException {
InputStream payloud = XsltUriResolverFactoryTest.class.getClassLoader().getResourceAsStream("xslt/staff/staff.xml");
MockEndpoint mock = getMockEndpoint("mock:result");
mock.expectedMessageCount(1);
sendBody(directStart, payloud);
XsltEndpoint xsltEndpoint = null;
for (int i = 0; i < 5; i++) {
xsltEndpoint = resolveMandatoryEndpoint(endpointUri, XsltEndpoint.class);
if (xsltEndpoint != null) {
break;
}
// wait until endpoint is resolved
Thread.sleep(50);
}
assertMockEndpointsSatisfied();
assertNotNull(xsltEndpoint);
CustomXsltUriResolver resolver = (CustomXsltUriResolver)xsltEndpoint.getUriResolver();
checkResourceUri(resolver.resolvedResourceUris, "xslt/staff/staff.xsl");
checkResourceUri(resolver.resolvedResourceUris, "../common/staff_template.xsl");
}
@Override
protected RouteBuilder[] createRouteBuilders() throws Exception {
return new RouteBuilder[] {new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start") //
.setHeader("xslt_file", new ConstantExpression("xslt/staff/staff.xsl")) //
.recipientList(new SimpleExpression("xslt:${header.xslt_file}?uriResolverFactory=#uriResolverFactory")) //
.to("mock:result");
}
}, new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:startComponent") //
.setHeader("xslt_file", new ConstantExpression("xslt/staff/staff.xsl")) //
.recipientList(new SimpleExpression("xslt:${header.xslt_file}")) //
.to("mock:result");
}
}};
}
@Override
protected JndiRegistry createRegistry() throws Exception {
registry = super.createRegistry();
registry.bind("uriResolverFactory", new CustomXsltUriResolverFactory());
return registry;
}
void checkResourceUri(Set<String> uris, String resourceUri) {
Assert.assertTrue("Missing resource uri " + resourceUri + " in resolved resource URI set", uris.contains(resourceUri));
}
static class CustomXsltUriResolverFactory implements XsltUriResolverFactory {
@Override
public URIResolver createUriResolver(CamelContext camelContext, String resourceUri) {
return new CustomXsltUriResolver(camelContext, resourceUri);
}
}
static class CustomXsltUriResolver extends XsltUriResolver {
private final Set<String> resolvedResourceUris = new HashSet<>();
CustomXsltUriResolver(CamelContext context, String location) {
super(context, location);
}
public Source resolve(String href, String base) throws TransformerException {
Source result = super.resolve(href, base);
resolvedResourceUris.add(href);
return result;
}
}
}