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     */
017    package org.apache.camel.builder;
018    
019    import java.util.zip.Deflater;
020    
021    import org.w3c.dom.Node;
022    
023    import org.apache.camel.model.ProcessorDefinition;
024    import org.apache.camel.model.dataformat.ArtixDSContentType;
025    import org.apache.camel.model.dataformat.ArtixDSDataFormat;
026    import org.apache.camel.model.dataformat.CsvDataFormat;
027    import org.apache.camel.model.dataformat.DataFormatDefinition;
028    import org.apache.camel.model.dataformat.HL7DataFormat;
029    import org.apache.camel.model.dataformat.JaxbDataFormat;
030    import org.apache.camel.model.dataformat.JsonDataFormat;
031    import org.apache.camel.model.dataformat.RssDataFormat;
032    import org.apache.camel.model.dataformat.SerializationDataFormat;
033    import org.apache.camel.model.dataformat.StringDataFormat;
034    import org.apache.camel.model.dataformat.TidyMarkupDataFormat;
035    import org.apache.camel.model.dataformat.XMLBeansDataFormat;
036    import org.apache.camel.model.dataformat.XMLSecurityDataFormat;
037    import org.apache.camel.model.dataformat.XStreamDataFormat;
038    import org.apache.camel.model.dataformat.ZipDataFormat;
039    
040    /**
041     * An expression for constructing the different possible {@link org.apache.camel.spi.DataFormat}
042     * options.
043     *
044     * @version $Revision: 751655 $
045     */
046    public class DataFormatClause<T extends ProcessorDefinition> {
047        private final T processorType;
048        private final Operation operation;
049    
050        /**
051         * {@link org.apache.camel.spi.DataFormat} operations.
052         */
053        public enum Operation {
054            Marshal, Unmarshal
055        }
056    
057        public DataFormatClause(T processorType, Operation operation) {
058            this.processorType = processorType;
059            this.operation = operation;
060        }
061    
062        /**
063         * Uses the
064         * <a href="http://camel.apache.org/artix-data-services.html">Artix Data Services</a>
065         * data format for dealing with lots of different message formats such as SWIFT etc.
066         */
067        public T artixDS() {
068            return dataFormat(new ArtixDSDataFormat());
069        }
070    
071        /**
072         * Uses the
073         * <a href="http://camel.apache.org/artix-data-services.html">Artix Data Services</a>
074         * data format with the specified type of ComplexDataObject
075         * for marshalling and unmarshalling messages using the dataObject's default Source and Sink.
076         */
077        public T artixDS(Class<?> dataObjectType) {
078            return dataFormat(new ArtixDSDataFormat(dataObjectType));
079        }
080    
081    
082        /**
083         * Uses the
084         * <a href="http://camel.apache.org/artix-data-services.html">Artix Data Services</a>
085         * data format with the specified type of ComplexDataObject
086         * for marshalling and unmarshalling messages using the dataObject's default Source and Sink.
087         */
088        public T artixDS(Class<?> elementType, ArtixDSContentType contentType) {
089            return dataFormat(new ArtixDSDataFormat(elementType, contentType));
090        }
091    
092        /**
093         * Uses the
094         * <a href="http://camel.apache.org/artix-data-services.html">Artix Data Services</a>
095         * data format with the specified content type
096         * for marshalling and unmarshalling messages
097         */
098        public T artixDS(ArtixDSContentType contentType) {
099            return dataFormat(new ArtixDSDataFormat(contentType));
100        }
101    
102        /**
103         * Uses the CSV data format
104         */
105        public T csv() {
106            return dataFormat(new CsvDataFormat());
107        }
108    
109        /**
110         * Uses the HL7 data format
111         */
112        public T hl7() {
113            return dataFormat(new HL7DataFormat());
114        }
115    
116        /**
117         * Uses the JAXB data format
118         */
119        public T jaxb() {
120            return dataFormat(new JaxbDataFormat());
121        }
122    
123        /**
124         * Uses the JAXB data format turning pretty printing on or off
125         */
126        public T jaxb(boolean prettyPrint) {
127            return dataFormat(new JaxbDataFormat(prettyPrint));
128        }
129    
130        /**
131         * Uses the RSS data format
132         */
133        public T rss() {
134            return dataFormat(new RssDataFormat());
135        }    
136        
137        /**
138         * Uses the Java Serialization data format
139         */
140        public T serialization() {
141            return dataFormat(new SerializationDataFormat());
142        }
143    
144        /**
145         * Uses the String data format
146         */
147        public T string() {
148            return string(null);
149        }
150    
151        /**
152         * Uses the String data format supporting encoding using given charset
153         */
154        public T string(String charset) {
155            StringDataFormat sdf = new StringDataFormat();
156            sdf.setCharset(charset);
157            return dataFormat(sdf);
158        }
159    
160        /**
161         * Uses the JAXB data format
162         */
163        public T xmlBeans() {
164            return dataFormat(new XMLBeansDataFormat());
165        }
166    
167        /**
168         * Return WellFormed HTML (an XML Document) either 
169         * {@link java.lang.String} or {@link org.w3c.dom.Node}
170         */
171        public T tidyMarkup(Class<?> dataObjectType) {
172            return dataFormat(new TidyMarkupDataFormat(dataObjectType));
173        }
174    
175        /**
176         * Return TidyMarkup in the default format 
177         *  as {@link org.w3c.dom.Node}
178         */
179        public T tidyMarkup() {
180            return dataFormat(new TidyMarkupDataFormat(Node.class));
181        }
182    
183        
184        /**
185         * Uses the XStream data format
186         */
187        public T xstream() {
188            return dataFormat(new XStreamDataFormat());
189        }
190        
191        /**
192         * Uses the JSON data format
193         */
194        public T json() {
195            return dataFormat(new JsonDataFormat());
196        }
197    
198        /**
199         * Uses the XML Security data format
200         */
201        public T secureXML() {
202            XMLSecurityDataFormat xsdf = new XMLSecurityDataFormat();
203            return dataFormat(xsdf);
204        }
205    
206        /**
207         * Uses the XML Security data format
208         */
209        public T secureXML(String secureTag, boolean secureTagContents) {
210            XMLSecurityDataFormat xsdf = new XMLSecurityDataFormat(secureTag, secureTagContents);
211            return dataFormat(xsdf);
212        }
213    
214        /**
215         * Uses the XML Security data format
216         */
217        public T secureXML(String secureTag, boolean secureTagContents, String passPhrase) {
218            XMLSecurityDataFormat xsdf = new XMLSecurityDataFormat(secureTag, secureTagContents, passPhrase);
219            return dataFormat(xsdf);
220        }
221    
222        /**
223         * Uses the XML Security data format
224         */
225        public T secureXML(String secureTag, boolean secureTagContents, String passPhrase, String xmlCipherAlgorithm) {
226            XMLSecurityDataFormat xsdf = new XMLSecurityDataFormat(secureTag, secureTagContents, passPhrase, xmlCipherAlgorithm);
227            return dataFormat(xsdf);
228        }
229    
230        /**
231         * Uses the ZIP deflater data format
232         */
233        public T zip() {
234            ZipDataFormat zdf = new ZipDataFormat(Deflater.DEFAULT_COMPRESSION);
235            return dataFormat(zdf);
236        }
237    
238        /**
239         * Uses the ZIP deflater data format
240         */
241        public T zip(int compressionLevel) {
242            ZipDataFormat zdf = new ZipDataFormat(compressionLevel);
243            return dataFormat(zdf);
244        }
245    
246        @SuppressWarnings("unchecked")
247        private T dataFormat(DataFormatDefinition dataFormatType) {
248            switch (operation) {
249            case Unmarshal:
250                return (T)processorType.unmarshal(dataFormatType);
251            case Marshal:
252                return (T)processorType.marshal(dataFormatType);
253            default:
254                throw new IllegalArgumentException("Unknown DataFormat operation: " + operation);
255            }
256        }
257    }