/** * 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.fop; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.util.Map; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSource; import org.apache.camel.Exchange; import org.apache.camel.impl.DefaultProducer; import org.apache.camel.util.IntrospectionSupport; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.Fop; import org.apache.fop.apps.FopFactory; import org.apache.fop.pdf.PDFEncryptionParams; /** * The Fop producer. */ public class FopProducer extends DefaultProducer { private final FopFactory fopFactory; private final String outputFormat; public FopProducer(FopEndpoint endpoint, FopFactory fopFactory, String outputFormat) { super(endpoint); this.fopFactory = fopFactory; this.outputFormat = outputFormat; } public void process(Exchange exchange) throws Exception { FOUserAgent userAgent = fopFactory.newFOUserAgent(); Map<String, Object> headers = exchange.getIn().getHeaders(); setRenderParameters(userAgent, headers); setEncryptionParameters(userAgent, headers); setUserAgentRendererOptions(userAgent, headers); String outputFormat = getOutputFormat(exchange); Source src = exchange.getIn().getBody(StreamSource.class); OutputStream out = transform(userAgent, outputFormat, src); exchange.getOut().setBody(out); // propagate headers exchange.getOut().setHeaders(headers); } private String getOutputFormat(Exchange exchange) { String headerOutputFormat = exchange.getIn().getHeader(FopConstants.CAMEL_FOP_OUTPUT_FORMAT, String.class); if (headerOutputFormat != null) { // it may be a short hand FopOutputType type = exchange.getContext().getTypeConverter().tryConvertTo(FopOutputType.class, exchange, headerOutputFormat); if (type != null) { return type.getFormatExtended(); } else { return headerOutputFormat; } } else { return outputFormat; } } private OutputStream transform(FOUserAgent userAgent, String outputFormat, Source src) throws FOPException, TransformerException { OutputStream out = new ByteArrayOutputStream(); Fop fop = fopFactory.newFop(outputFormat, userAgent, out); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); Result res = new SAXResult(fop.getDefaultHandler()); transformer.transform(src, res); return out; } @SuppressWarnings("unchecked") private void setEncryptionParameters(FOUserAgent userAgent, Map<String, Object> headers) throws Exception { Map<String, Object> encryptionParameters = IntrospectionSupport .extractProperties(headers, FopConstants.CAMEL_FOP_ENCRYPT); if (!encryptionParameters.isEmpty()) { PDFEncryptionParams encryptionParams = new PDFEncryptionParams(); IntrospectionSupport.setProperties(encryptionParams, encryptionParameters); userAgent.getRendererOptions().put("encryption-params", encryptionParams); } } private void setUserAgentRendererOptions(FOUserAgent userAgent, Map<String, Object> headers) { Map<String, Object> parameters = IntrospectionSupport.extractProperties(headers, FopConstants.CAMEL_FOP_RENDERER_OPTIONS); if (!parameters.isEmpty()) { userAgent.getRendererOptions().putAll(parameters); } } private void setRenderParameters(FOUserAgent userAgent, Map<String, Object> headers) throws Exception { Map<String, Object> parameters = IntrospectionSupport.extractProperties(headers, FopConstants.CAMEL_FOP_RENDER); if (!parameters.isEmpty()) { IntrospectionSupport.setProperties(userAgent, parameters); } } }