001/** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.camel.component.xslt; 018 019import java.util.Map; 020import javax.xml.transform.URIResolver; 021 022import org.apache.camel.Endpoint; 023import org.apache.camel.builder.xml.XsltUriResolver; 024import org.apache.camel.converter.jaxp.XmlConverter; 025import org.apache.camel.impl.UriEndpointComponent; 026import org.apache.camel.spi.Metadata; 027import org.apache.camel.util.ResourceHelper; 028import org.slf4j.Logger; 029import org.slf4j.LoggerFactory; 030 031/** 032 * The <a href="http://camel.apache.org/xslt.html">XSLT Component</a> is for performing XSLT transformations of messages 033 */ 034public class XsltComponent extends UriEndpointComponent { 035 036 private static final Logger LOG = LoggerFactory.getLogger(XsltComponent.class); 037 038 @Metadata(label = "advanced") 039 private XmlConverter xmlConverter; 040 @Metadata(label = "advanced", description = "To use a custom UriResolver. Should not be used together with the option 'uriResolverFactory'.") 041 private URIResolver uriResolver; 042 @Metadata(label = "advanced", description = "To use a custom UriResolver which depends on a dynamic endpoint resource URI. Should not be used together with the option 'uriResolver'.") 043 private XsltUriResolverFactory uriResolverFactory; 044 @Metadata(defaultValue = "true") 045 private boolean contentCache = true; 046 private boolean saxon; 047 048 public XsltComponent() { 049 super(XsltEndpoint.class); 050 } 051 052 public XmlConverter getXmlConverter() { 053 return xmlConverter; 054 } 055 056 /** 057 * To use a custom implementation of {@link org.apache.camel.converter.jaxp.XmlConverter} 058 */ 059 public void setXmlConverter(XmlConverter xmlConverter) { 060 this.xmlConverter = xmlConverter; 061 } 062 063 064 065 public XsltUriResolverFactory getUriResolverFactory() { 066 return uriResolverFactory; 067 } 068 069 /** 070 * To use a custom javax.xml.transform.URIResolver which depends on a dynamic endpoint resource URI or which is a subclass of {@link XsltUriResolver}. 071 * Do not use in combination with uriResolver. 072 * See also {@link #setUriResolver(URIResolver)}. 073 */ 074 public void setUriResolverFactory(XsltUriResolverFactory uriResolverFactory) { 075 this.uriResolverFactory = uriResolverFactory; 076 } 077 078 public URIResolver getUriResolver() { 079 return uriResolver; 080 } 081 082 /** 083 * To use a custom javax.xml.transform.URIResolver. Do not use in combination with uriResolverFactory. 084 * See also {@link #setUriResolverFactory(XsltUriResolverFactory)}. 085 */ 086 public void setUriResolver(URIResolver uriResolver) { 087 this.uriResolver = uriResolver; 088 } 089 090 public boolean isContentCache() { 091 return contentCache; 092 } 093 094 /** 095 * Cache for the resource content (the stylesheet file) when it is loaded. 096 * If set to false Camel will reload the stylesheet file on each message processing. This is good for development. 097 * A cached stylesheet can be forced to reload at runtime via JMX using the clearCachedStylesheet operation. 098 */ 099 public void setContentCache(boolean contentCache) { 100 this.contentCache = contentCache; 101 } 102 103 public boolean isSaxon() { 104 return saxon; 105 } 106 107 /** 108 * Whether to use Saxon as the transformerFactoryClass. 109 * If enabled then the class net.sf.saxon.TransformerFactoryImpl. You would need to add Saxon to the classpath. 110 */ 111 public void setSaxon(boolean saxon) { 112 this.saxon = saxon; 113 } 114 115 protected Endpoint createEndpoint(String uri, final String remaining, Map<String, Object> parameters) throws Exception { 116 XsltEndpoint endpoint = new XsltEndpoint(uri, this); 117 endpoint.setConverter(getXmlConverter()); 118 endpoint.setContentCache(isContentCache()); 119 endpoint.setSaxon(isSaxon()); 120 121 String resourceUri = remaining; 122 123 // if its a http uri, then append additional parameters as they are part of the uri 124 if (ResourceHelper.isHttpUri(resourceUri)) { 125 resourceUri = ResourceHelper.appendParameters(resourceUri, parameters); 126 } 127 LOG.debug("{} using schema resource: {}", this, resourceUri); 128 endpoint.setResourceUri(resourceUri); 129 130 // lookup custom resolver to use 131 URIResolver resolver = resolveAndRemoveReferenceParameter(parameters, "uriResolver", URIResolver.class); 132 if (resolver == null) { 133 // not in endpoint then use component specific resolver 134 resolver = getUriResolver(); 135 } 136 if (resolver == null) { 137 // lookup custom resolver factory to use 138 XsltUriResolverFactory resolverFactory = resolveAndRemoveReferenceParameter(parameters, "uriResolverFactory", XsltUriResolverFactory.class); 139 if (resolverFactory == null) { 140 // not in endpoint then use component specific resolver factory 141 resolverFactory = getUriResolverFactory(); 142 } 143 if (resolverFactory == null) { 144 // fallback to use the Default URI resolver factory 145 resolverFactory = new DefaultXsltUriResolverFactory(); 146 } 147 148 resolver = resolverFactory.createUriResolver(getCamelContext(), remaining); 149 } 150 endpoint.setUriResolver(resolver); 151 152 setProperties(endpoint, parameters); 153 if (!parameters.isEmpty()) { 154 // additional parameters need to be stored on endpoint as they can be used to configure xslt builder additionally 155 endpoint.setParameters(parameters); 156 } 157 158 return endpoint; 159 } 160 161}