You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by bi...@apache.org on 2012/03/06 02:10:06 UTC

svn commit: r1297313 - in /camel/trunk: apache-camel/src/main/descriptors/ components/ components/camel-fop/ components/camel-fop/src/ components/camel-fop/src/main/ components/camel-fop/src/main/java/ components/camel-fop/src/main/java/org/ components...

Author: bibryam
Date: Tue Mar  6 01:10:05 2012
New Revision: 1297313

URL: http://svn.apache.org/viewvc?rev=1297313&view=rev
Log:
CAMEL-3551: Added new camel-fop component.

Added:
    camel/trunk/components/camel-fop/
    camel/trunk/components/camel-fop/pom.xml
    camel/trunk/components/camel-fop/src/
    camel/trunk/components/camel-fop/src/main/
    camel/trunk/components/camel-fop/src/main/java/
    camel/trunk/components/camel-fop/src/main/java/org/
    camel/trunk/components/camel-fop/src/main/java/org/apache/
    camel/trunk/components/camel-fop/src/main/java/org/apache/camel/
    camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/
    camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/
    camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopComponent.java
    camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopConstants.java
    camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopEndpoint.java
    camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopProducer.java
    camel/trunk/components/camel-fop/src/main/resources/
    camel/trunk/components/camel-fop/src/main/resources/META-INF/
    camel/trunk/components/camel-fop/src/main/resources/META-INF/services/
    camel/trunk/components/camel-fop/src/main/resources/META-INF/services/org/
    camel/trunk/components/camel-fop/src/main/resources/META-INF/services/org/apache/
    camel/trunk/components/camel-fop/src/main/resources/META-INF/services/org/apache/camel/
    camel/trunk/components/camel-fop/src/main/resources/META-INF/services/org/apache/camel/component/
    camel/trunk/components/camel-fop/src/main/resources/META-INF/services/org/apache/camel/component/fop
    camel/trunk/components/camel-fop/src/test/
    camel/trunk/components/camel-fop/src/test/data/
    camel/trunk/components/camel-fop/src/test/data/conf/
    camel/trunk/components/camel-fop/src/test/data/conf/testcfg.xml
    camel/trunk/components/camel-fop/src/test/data/xml/
    camel/trunk/components/camel-fop/src/test/data/xml/data.xml
    camel/trunk/components/camel-fop/src/test/java/
    camel/trunk/components/camel-fop/src/test/java/org/
    camel/trunk/components/camel-fop/src/test/java/org/apache/
    camel/trunk/components/camel-fop/src/test/java/org/apache/camel/
    camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/
    camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/
    camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopComponentTest.java
    camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopEndpointTest.java
    camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopHelper.java
    camel/trunk/components/camel-fop/src/test/resources/
    camel/trunk/components/camel-fop/src/test/resources/xslt/
    camel/trunk/components/camel-fop/src/test/resources/xslt/template.xsl
Modified:
    camel/trunk/apache-camel/src/main/descriptors/common-bin.xml
    camel/trunk/components/pom.xml
    camel/trunk/parent/pom.xml
    camel/trunk/platforms/karaf/features/pom.xml
    camel/trunk/platforms/karaf/features/src/main/resources/bundles.properties
    camel/trunk/platforms/karaf/features/src/main/resources/features.xml

Modified: camel/trunk/apache-camel/src/main/descriptors/common-bin.xml
URL: http://svn.apache.org/viewvc/camel/trunk/apache-camel/src/main/descriptors/common-bin.xml?rev=1297313&r1=1297312&r2=1297313&view=diff
==============================================================================
--- camel/trunk/apache-camel/src/main/descriptors/common-bin.xml (original)
+++ camel/trunk/apache-camel/src/main/descriptors/common-bin.xml Tue Mar  6 01:10:05 2012
@@ -62,6 +62,7 @@
         <include>org.apache.camel:camel-eventadmin</include>
         <include>org.apache.camel:camel-exec</include>
         <include>org.apache.camel:camel-flatpack</include>
+        <include>org.apache.camel:camel-fop</include>
         <include>org.apache.camel:camel-freemarker</include>
         <include>org.apache.camel:camel-ftp</include>
         <include>org.apache.camel:camel-gae</include>

Added: camel/trunk/components/camel-fop/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/pom.xml?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/pom.xml (added)
+++ camel/trunk/components/camel-fop/pom.xml Tue Mar  6 01:10:05 2012
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-parent</artifactId>
+        <version>2.10-SNAPSHOT</version>
+        <relativePath>../../parent</relativePath>
+    </parent>
+
+    <artifactId>camel-fop</artifactId>
+    <packaging>bundle</packaging>
+    <name>Camel :: FOP</name>
+    <description>Camel FOP support</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.xmlgraphics</groupId>
+            <artifactId>fop</artifactId>
+            <version>${fop-version}</version>
+        </dependency>
+
+        <!-- for testing -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.pdfbox</groupId>
+            <artifactId>pdfbox</artifactId>
+            <version>1.6.0</version>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- logging -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>

Added: camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopComponent.java?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopComponent.java (added)
+++ camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopComponent.java Tue Mar  6 01:10:05 2012
@@ -0,0 +1,35 @@
+/**
+ * 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.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.DefaultComponent;
+
+/**
+ * Represents the component that manages {@link FopEndpoint}.
+ */
+public class FopComponent extends DefaultComponent {
+
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters)
+        throws Exception {
+        FopEndpoint endpoint = new FopEndpoint(uri, this, remaining);
+        setProperties(endpoint, parameters);
+        return endpoint;
+    }
+}

Added: camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopConstants.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopConstants.java?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopConstants.java (added)
+++ camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopConstants.java Tue Mar  6 01:10:05 2012
@@ -0,0 +1,23 @@
+/**
+ * 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;
+
+public interface FopConstants {
+    String CAMEL_FOP_RENDER = "CamelFop.Render.";
+    String CAMEL_FOP_ENCRYPT = "CamelFop.Encrypt.";
+    String CAMEL_FOP_OUTPUT_FORMAT = "CamelFop.Output.Format";
+}

Added: camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopEndpoint.java?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopEndpoint.java (added)
+++ camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopEndpoint.java Tue Mar  6 01:10:05 2012
@@ -0,0 +1,86 @@
+/**
+ * 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.IOException;
+
+import org.xml.sax.SAXException;
+
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.impl.DefaultEndpoint;
+import org.apache.fop.apps.FOPException;
+import org.apache.fop.apps.FopFactory;
+
+/**
+ * Represents a Fop endpoint.
+ */
+public class FopEndpoint extends DefaultEndpoint {
+    private String userConfigURL;
+    private FopFactory fopFactory;
+    private String remaining;
+
+    public FopEndpoint(String uri, FopComponent component, String remaining) {
+        super(uri, component);
+        this.remaining = remaining;
+        this.fopFactory = FopFactory.newInstance();
+    }
+
+    public Producer createProducer() throws Exception {
+        return new FopProducer(this, fopFactory, remaining);
+    }
+
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new UnsupportedOperationException("Consumer not supported for FOP endpoint");
+    }
+
+    public boolean isSingleton() {
+        return true;
+    }
+
+    FopFactory getFopFactory() {
+        return fopFactory;
+    }
+
+    public void setUserConfigURL(String userConfigURL) {
+        this.userConfigURL = userConfigURL;
+        updateConfigurations();
+    }
+
+    private void updateConfigurations() {
+        DefaultConfigurationBuilder cfgBuilder = new DefaultConfigurationBuilder();
+        Configuration cfg;
+        try {
+            cfg = cfgBuilder.buildFromFile(this.userConfigURL);
+        } catch (SAXException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } catch (ConfigurationException e) {
+            throw new RuntimeException(e);
+        }
+        try {
+            fopFactory.setUserConfig(cfg);
+        } catch (FOPException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

Added: camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopProducer.java?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopProducer.java (added)
+++ camel/trunk/components/camel-fop/src/main/java/org/apache/camel/component/fop/FopProducer.java Tue Mar  6 01:10:05 2012
@@ -0,0 +1,106 @@
+/**
+ * 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.RuntimeExchangeException;
+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 remaining;
+
+    public FopProducer(FopEndpoint endpoint, FopFactory fopFactory, String remaining) {
+        super(endpoint);
+        this.fopFactory = fopFactory;
+        this.remaining = remaining;
+    }
+
+    public void process(Exchange exchange) throws Exception {
+        FOUserAgent userAgent = fopFactory.newFOUserAgent();
+        Map<String, Object> headers = exchange.getIn().getHeaders();
+        setRenderParameters(userAgent, headers);
+        setEncryptionParameters(userAgent, headers);
+
+        String outputFormat = getOutputFormat(exchange);
+        Source src = exchange.getIn().getBody(StreamSource.class);
+
+        OutputStream out = transform(userAgent, outputFormat, src);
+        exchange.getOut().setBody(out);
+    }
+
+    private String getOutputFormat(Exchange exchange) {
+        String outputFormat = exchange.getIn()
+                .getHeader(FopConstants.CAMEL_FOP_OUTPUT_FORMAT, this.remaining, String.class);
+        if (outputFormat == null) {
+            throw new RuntimeExchangeException("Missing output format", exchange);
+        }
+
+        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;
+    }
+
+    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 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);
+        }
+    }
+}

Added: camel/trunk/components/camel-fop/src/main/resources/META-INF/services/org/apache/camel/component/fop
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/main/resources/META-INF/services/org/apache/camel/component/fop?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/main/resources/META-INF/services/org/apache/camel/component/fop (added)
+++ camel/trunk/components/camel-fop/src/main/resources/META-INF/services/org/apache/camel/component/fop Tue Mar  6 01:10:05 2012
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+class=org.apache.camel.component.fop.FopComponent

Added: camel/trunk/components/camel-fop/src/test/data/conf/testcfg.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/test/data/conf/testcfg.xml?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/test/data/conf/testcfg.xml (added)
+++ camel/trunk/components/camel-fop/src/test/data/conf/testcfg.xml Tue Mar  6 01:10:05 2012
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<fop version="1.0">
+
+  <!-- Strict user configuration -->
+  <strict-configuration>true</strict-configuration>
+
+  <!-- Strict FO validation -->
+  <strict-validation>true</strict-validation>
+
+  <!-- Base URL for resolving relative URLs -->
+  <base>./</base>
+
+  <!-- Font Base URL for resolving relative font URLs -->
+  <font-base>./</font-base>
+
+  <!-- Source resolution in dpi (dots/pixels per inch) for determining the size of pixels in SVG and bitmap images, default: 72dpi -->
+  <source-resolution>96</source-resolution>
+  <!-- Target resolution in dpi (dots/pixels per inch) for specifying the target resolution for generated bitmaps, default: 72dpi -->
+  <target-resolution>72</target-resolution>
+
+  <!-- default page-height and page-width, in case
+       value is specified as auto -->
+  <default-page-settings height="11in" width="8.26in"/>
+
+  <!-- etc. etc..... -->
+</fop>

Added: camel/trunk/components/camel-fop/src/test/data/xml/data.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/test/data/xml/data.xml?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/test/data/xml/data.xml (added)
+++ camel/trunk/components/camel-fop/src/test/data/xml/data.xml Tue Mar  6 01:10:05 2012
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<projectteam>
+    <projectname>The Killer Application</projectname>
+    <member>
+        <name>John Doe</name>
+        <function>lead</function>
+        <email>jon.doe@killerapp.fun</email>
+    </member>
+    <member>
+        <name>Paul Coder</name>
+        <function>dev</function>
+        <email>paul.coder@killerapp.fun</email>
+    </member>
+    <member>
+        <name>Max Hacker</name>
+        <function>dev</function>
+        <email>max.hacker@killerapp.fun</email>
+    </member>
+    <member>
+        <name>Donna Book</name>
+        <function>doc</function>
+        <email>donna.book@killerapp.fun</email>
+    </member>
+    <member>
+        <name>Henry Tester</name>
+        <function>qa</function>
+        <email>henry.tester@killerapp.fun</email>
+    </member>
+</projectteam>

Added: camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopComponentTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopComponentTest.java?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopComponentTest.java (added)
+++ camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopComponentTest.java Tue Mar  6 01:10:05 2012
@@ -0,0 +1,67 @@
+/**
+ * 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.FileInputStream;
+
+import org.apache.camel.EndpointInject;
+import org.apache.camel.Exchange;
+import org.apache.camel.Produce;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.junit.Test;
+
+public class FopComponentTest extends CamelTestSupport {
+
+    @EndpointInject(uri = "mock:result")
+    protected MockEndpoint resultEndpoint;
+
+    @Produce(uri = "direct:start")
+    protected ProducerTemplate template;
+
+    @Test
+    public void createPdfUsingXmlDataAndXsltTransformation() throws Exception {
+        resultEndpoint.expectedMessageCount(1);
+        FileInputStream inputStream = new FileInputStream("src/test/data/xml/data.xml");
+
+        template.sendBody(inputStream);
+        resultEndpoint.assertIsSatisfied();
+
+        PDDocument document = PDDocument.load("target/data/result.pdf");
+        String pdfText = FopHelper.extractTextFrom(document);
+        assertTrue(pdfText.contains("Project"));    //from xsl template
+        assertTrue(pdfText.contains("John Doe"));   //from data xml
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:start")
+                        .to("xslt:xslt/template.xsl")
+                        .to("fop:application/pdf")
+                        .setHeader(Exchange.FILE_NAME, constant("result.pdf"))
+                        .to("file:target/data")
+                        .to("mock:result");
+
+            }
+        };
+    }
+}

Added: camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopEndpointTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopEndpointTest.java?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopEndpointTest.java (added)
+++ camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopEndpointTest.java Tue Mar  6 01:10:05 2012
@@ -0,0 +1,101 @@
+/**
+ * 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.IOException;
+import java.io.InputStream;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Producer;
+import org.apache.camel.impl.DefaultExchange;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.fop.apps.MimeConstants;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.junit.Test;
+
+public class FopEndpointTest extends CamelTestSupport {
+
+    @Test
+    public void generatePdfFromXslfoWithSpecificText() throws Exception {
+        Endpoint endpoint = context().getEndpoint("fop:application/pdf");
+        Producer producer = endpoint.createProducer();
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getIn().setBody(FopHelper.decorateTextWithXSLFO("Test Content"));
+
+        producer.process(exchange);
+        PDDocument document = getDocumentFrom(exchange);
+        String content = FopHelper.extractTextFrom(document);
+        assertEquals("Test Content", content);
+    }
+
+    @Test
+    public void specifyCustomUserConfigurationFile() throws Exception {
+        FopEndpoint customConfiguredEndpoint = context()
+                .getEndpoint("fop:application/pdf?userConfigURL=src/test/data/conf/testcfg.xml",
+                        FopEndpoint.class);
+        float customSourceResolution = customConfiguredEndpoint.getFopFactory().getSourceResolution();
+        assertEquals(96.0, customSourceResolution, 0.1);
+    }
+
+    @Test
+    public void setPDFRenderingMetadataPerDocument() throws Exception {
+        Endpoint endpoint = context().getEndpoint("fop:application/pdf");
+        Producer producer = endpoint.createProducer();
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getIn().setHeader("CamelFop.Render.Creator", "Test User");
+        exchange.getIn().setBody(FopHelper.decorateTextWithXSLFO("Test Content"));
+
+        producer.process(exchange);
+        PDDocument document = getDocumentFrom(exchange);
+        String creator = FopHelper.getDocumentMetadataValue(document, COSName.CREATOR);
+        assertEquals("Test User", creator);
+    }
+
+    @Test
+    public void encryptPdfWithUserPassword() throws Exception {
+        Endpoint endpoint = context().getEndpoint("fop:application/pdf");
+        Producer producer = endpoint.createProducer();
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getIn().setHeader("CamelFop.Encrypt.userPassword", "secret");
+        exchange.getIn().setBody(FopHelper.decorateTextWithXSLFO("Test Content"));
+
+        producer.process(exchange);
+        PDDocument document = getDocumentFrom(exchange);
+        assertTrue(document.isEncrypted());
+    }
+
+    @Test
+    public void overridePdfOutputFormatToPlainText() throws Exception {
+        String defaultOutputFormat = "application/pdf";
+        Endpoint endpoint = context().getEndpoint("fop:" + defaultOutputFormat);
+        Producer producer = endpoint.createProducer();
+        Exchange exchange = new DefaultExchange(context);
+        exchange.getIn().setHeader(FopConstants.CAMEL_FOP_OUTPUT_FORMAT, MimeConstants.MIME_PLAIN_TEXT);
+        exchange.getIn().setBody(FopHelper.decorateTextWithXSLFO("Test Content"));
+
+        producer.process(exchange);
+        String plainText = exchange.getOut().getBody(String.class).trim();
+        assertEquals("Test Content", plainText);
+    }
+
+    private PDDocument getDocumentFrom(Exchange exchange) throws IOException {
+        InputStream inputStream = exchange.getOut().getBody(InputStream.class);
+        return PDDocument.load(inputStream);
+    }
+}

Added: camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopHelper.java?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopHelper.java (added)
+++ camel/trunk/components/camel-fop/src/test/java/org/apache/camel/component/fop/FopHelper.java Tue Mar  6 01:10:05 2012
@@ -0,0 +1,75 @@
+/**
+ * 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.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.exceptions.CryptographyException;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDDocumentInformation;
+import org.apache.pdfbox.pdmodel.encryption.BadSecurityHandlerException;
+import org.apache.pdfbox.pdmodel.encryption.DecryptionMaterial;
+import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial;
+import org.apache.pdfbox.util.PDFTextStripper;
+
+public final class FopHelper {
+    private FopHelper() {
+    }
+
+    //decryption requires additional libraries
+    public static void decryptPDFN(PDDocument document, String password) throws
+            IOException, CryptographyException, BadSecurityHandlerException {
+        if (document.isEncrypted()) {
+            DecryptionMaterial decryptionMaterial = new StandardDecryptionMaterial(password);
+            document.openProtection(decryptionMaterial);
+        } else {
+            throw new RuntimeException("Document not encrypted");
+        }
+    }
+
+    public static String extractTextFrom(PDDocument document) throws IOException {
+        Writer output = new StringWriter();
+        PDFTextStripper stripper = new PDFTextStripper();
+        stripper.writeText(document, output);
+        return output.toString().trim();
+    }
+
+    public static String getDocumentMetadataValue(PDDocument document, COSName name) {
+        PDDocumentInformation info = document.getDocumentInformation();
+        return info.getDictionary().getString(name);
+    }
+
+    public static String decorateTextWithXSLFO(String text) {
+        return "<fo:root xmlns:fo=\"http://www.w3.org/1999/XSL/Format\">\n"
+                + "  <fo:layout-master-set>\n"
+                + "    <fo:simple-page-master master-name=\"only\">\n"
+                + "      <fo:region-body region-name=\"xsl-region-body\" margin=\"0.7in\"  padding=\"0\" />\n"
+                + "      <fo:region-before region-name=\"xsl-region-before\" extent=\"0.7in\" />\n"
+                + "        <fo:region-after region-name=\"xsl-region-after\" extent=\"0.7in\" />\n"
+                + "      </fo:simple-page-master>\n"
+                + "    </fo:layout-master-set>\n"
+                + "    <fo:page-sequence master-reference=\"only\">\n"
+                + "      <fo:flow flow-name=\"xsl-region-body\">\n"
+                + "      <fo:block>" + text + "</fo:block>\n"
+                + "    </fo:flow>\n"
+                + "  </fo:page-sequence>\n"
+                + "</fo:root>";
+    }
+}

Added: camel/trunk/components/camel-fop/src/test/resources/xslt/template.xsl
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-fop/src/test/resources/xslt/template.xsl?rev=1297313&view=auto
==============================================================================
--- camel/trunk/components/camel-fop/src/test/resources/xslt/template.xsl (added)
+++ camel/trunk/components/camel-fop/src/test/resources/xslt/template.xsl Tue Mar  6 01:10:05 2012
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
+  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>
+  <xsl:param name="versionParam" select="'1.0'"/> 
+  <!-- ========================= -->
+  <!-- root element: projectteam -->
+  <!-- ========================= -->
+  <xsl:template match="projectteam">
+    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+
+      <fo:layout-master-set>
+        <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
+          <fo:region-body/>
+        </fo:simple-page-master>
+      </fo:layout-master-set>
+      <fo:page-sequence master-reference="simpleA4">
+        <fo:flow flow-name="xsl-region-body">
+          <fo:block font-size="16pt" font-weight="bold" space-after="5mm">Project: <xsl:value-of select="projectname"/>
+
+          </fo:block>
+          <fo:block font-size="12pt" space-after="5mm">Version <xsl:value-of select="$versionParam"/>
+          </fo:block>
+          <fo:block font-size="10pt">
+            <fo:table table-layout="fixed" width="100%" border-collapse="separate">
+              <fo:table-column column-width="4cm"/>
+              <fo:table-column column-width="4cm"/>
+              <fo:table-column column-width="5cm"/>
+
+              <fo:table-body>
+                <xsl:apply-templates select="member"/>
+              </fo:table-body>
+            </fo:table>
+          </fo:block>
+        </fo:flow>
+      </fo:page-sequence>
+    </fo:root>
+  </xsl:template>
+
+  <!-- ========================= -->
+  <!-- child element: member     -->
+  <!-- ========================= -->
+  <xsl:template match="member">
+    <fo:table-row>
+      <xsl:if test="function = 'lead'">
+        <xsl:attribute name="font-weight">bold</xsl:attribute>
+      </xsl:if>
+
+      <fo:table-cell>
+        <fo:block>
+          <xsl:value-of select="name"/>
+        </fo:block>
+      </fo:table-cell>
+      <fo:table-cell>
+        <fo:block>
+          <xsl:value-of select="function"/>
+        </fo:block>
+      </fo:table-cell>
+      <fo:table-cell>
+        <fo:block>
+          <xsl:value-of select="email"/>
+        </fo:block>
+      </fo:table-cell>
+    </fo:table-row>
+  </xsl:template>
+</xsl:stylesheet>
+

Modified: camel/trunk/components/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/components/pom.xml?rev=1297313&r1=1297312&r2=1297313&view=diff
==============================================================================
--- camel/trunk/components/pom.xml (original)
+++ camel/trunk/components/pom.xml Tue Mar  6 01:10:05 2012
@@ -76,6 +76,7 @@
     <module>camel-eventadmin</module>
     <module>camel-exec</module>
     <module>camel-flatpack</module>
+    <module>camel-fop</module>
     <module>camel-freemarker</module>
     <module>camel-ftp</module>
     <module>camel-gae</module>

Modified: camel/trunk/parent/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/parent/pom.xml?rev=1297313&r1=1297312&r2=1297313&view=diff
==============================================================================
--- camel/trunk/parent/pom.xml (original)
+++ camel/trunk/parent/pom.xml Tue Mar  6 01:10:05 2012
@@ -69,6 +69,7 @@
     <easymock-version>3.0</easymock-version>
     <ehcache-bundle-version>2.4.3_1</ehcache-bundle-version>
     <flatpack-version>3.2.0_1</flatpack-version>
+    <fop-version>1.0</fop-version>
     <ftpserver-version>1.0.5</ftpserver-version>
     <freemarker-version>2.3.18</freemarker-version>
     <geronimo-el-spec-version>1.0.1</geronimo-el-spec-version>
@@ -391,6 +392,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-fop</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-freemarker</artifactId>
         <version>${project.version}</version>
       </dependency>

Modified: camel/trunk/platforms/karaf/features/pom.xml
URL: http://svn.apache.org/viewvc/camel/trunk/platforms/karaf/features/pom.xml?rev=1297313&r1=1297312&r2=1297313&view=diff
==============================================================================
--- camel/trunk/platforms/karaf/features/pom.xml (original)
+++ camel/trunk/platforms/karaf/features/pom.xml Tue Mar  6 01:10:05 2012
@@ -60,6 +60,7 @@
       <flatpack-bundle-version>3.2.0_2</flatpack-bundle-version>
       <felix-configadmin-version>1.2.4</felix-configadmin-version>
       <felix-framework-version>2.0.5</felix-framework-version>
+      <fop-bundle-version>1.0_2</fop-bundle-version>
       <freemarker-bundle-version>2.3.18_1</freemarker-bundle-version>
       <geronimo-el-version>1.0.1</geronimo-el-version>
       <geronimo-ws-metadata-spec-version>1.1.3</geronimo-ws-metadata-spec-version>

Modified: camel/trunk/platforms/karaf/features/src/main/resources/bundles.properties
URL: http://svn.apache.org/viewvc/camel/trunk/platforms/karaf/features/src/main/resources/bundles.properties?rev=1297313&r1=1297312&r2=1297313&view=diff
==============================================================================
--- camel/trunk/platforms/karaf/features/src/main/resources/bundles.properties (original)
+++ camel/trunk/platforms/karaf/features/src/main/resources/bundles.properties Tue Mar  6 01:10:05 2012
@@ -40,6 +40,7 @@ org.apache.servicemix.bundles/org.apache
 org.apache.servicemix.bundles/org.apache.servicemix.bundles.commons-io/${commons-io-bundle-version}/jar
 org.apache.servicemix.bundles/org.apache.servicemix.bundles.dom4j/${dom4j-bundle-version}/jar
 org.apache.servicemix.bundles/org.apache.servicemix.bundles.flatpack/${flatpack-bundle-version}/jar
+org.apache.servicemix.bundles/org.apache.servicemix.bundles.fop/${fop-bundle-version}/jar
 org.apache.servicemix.bundles/org.apache.servicemix.bundles.freemarker/${freemarker-bundle-version}/jar
 org.apache.servicemix.bundles/org.apache.servicemix.bundles.hamcrest/${hamcrest-bundle-version}/jar
 org.apache.servicemix.bundles/org.apache.servicemix.bundles.hapi/${hapi-bundle-version}/jar

Modified: camel/trunk/platforms/karaf/features/src/main/resources/features.xml
URL: http://svn.apache.org/viewvc/camel/trunk/platforms/karaf/features/src/main/resources/features.xml?rev=1297313&r1=1297312&r2=1297313&view=diff
==============================================================================
--- camel/trunk/platforms/karaf/features/src/main/resources/features.xml (original)
+++ camel/trunk/platforms/karaf/features/src/main/resources/features.xml Tue Mar  6 01:10:05 2012
@@ -276,6 +276,11 @@
     <bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.flatpack/${flatpack-bundle-version}</bundle>
     <bundle>mvn:org.apache.camel/camel-flatpack/${project.version}</bundle>
   </feature>
+  <feature name='camel-fop' version='${pom.version}' resolver='(obr)' start-level='50'>
+    <feature version='${project.version}'>camel-core</feature>
+    <bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.fop/${fop-bundle-version}</bundle>
+    <bundle>mvn:org.apache.camel/camel-fop/${project.version}</bundle>
+  </feature>
   <feature name='camel-freemarker' version='${project.version}' resolver='(obr)' start-level='50'>
     <feature version='${project.version}'>camel-core</feature>
     <bundle dependency='true'>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.freemarker/${freemarker-bundle-version}</bundle>