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 org.apache.camel.model.ProcessorType;
020    import org.apache.camel.model.dataformat.ArtixDSContentType;
021    import org.apache.camel.model.dataformat.ArtixDSDataFormat;
022    import org.apache.camel.model.dataformat.CsvDataFormat;
023    import org.apache.camel.model.dataformat.DataFormatType;
024    import org.apache.camel.model.dataformat.HL7DataFormat;
025    import org.apache.camel.model.dataformat.JaxbDataFormat;
026    import org.apache.camel.model.dataformat.JsonDataFormat;
027    import org.apache.camel.model.dataformat.SerializationDataFormat;
028    import org.apache.camel.model.dataformat.StringDataFormat;
029    import org.apache.camel.model.dataformat.XMLBeansDataFormat;
030    import org.apache.camel.model.dataformat.XStreamDataFormat;
031    import org.apache.camel.spi.DataFormat;
032    
033    /**
034     * An expression for constructing the different possible {@link DataFormat}
035     * options.
036     *
037     * @version $Revision: 61208 $
038     */
039    public class DataFormatClause<T extends ProcessorType> {
040        private final T processorType;
041        private final Operation operation;
042    
043        /**
044         * {@link DataFormat} operations.
045         */
046        public enum Operation {
047            Marshal, Unmarshal
048        }
049    
050        public DataFormatClause(T processorType, Operation operation) {
051            this.processorType = processorType;
052            this.operation = operation;
053        }
054    
055        /**
056         * Uses the
057         * <a href="http://activemq.apache.org/camel/artix-data-services.html">Artix Data Services</a>
058         * data format for dealing with lots of different message formats such as SWIFT etc.
059         */
060        public T artixDS() {
061            return dataFormat(new ArtixDSDataFormat());
062        }
063    
064        /**
065         * Uses the
066         * <a href="http://activemq.apache.org/camel/artix-data-services.html">Artix Data Services</a>
067         * data format with the specified type of ComplexDataObject
068         * for marshalling and unmarshalling messages using the dataObject's default Source and Sink.
069         */
070        public T artixDS(Class<?> dataObjectType) {
071            return dataFormat(new ArtixDSDataFormat(dataObjectType));
072        }
073    
074    
075        /**
076         * Uses the
077         * <a href="http://activemq.apache.org/camel/artix-data-services.html">Artix Data Services</a>
078         * data format with the specified type of ComplexDataObject
079         * for marshalling and unmarshalling messages using the dataObject's default Source and Sink.
080         */
081        public T artixDS(Class<?> elementType, ArtixDSContentType contentType) {
082            return dataFormat(new ArtixDSDataFormat(elementType, contentType));
083        }
084    
085        /**
086         * Uses the
087         * <a href="http://activemq.apache.org/camel/artix-data-services.html">Artix Data Services</a>
088         * data format with the specified content type
089         * for marshalling and unmarshalling messages
090         */
091        public T artixDS(ArtixDSContentType contentType) {
092            return dataFormat(new ArtixDSDataFormat(contentType));
093        }
094    
095        /**
096         * Uses the CSV data format
097         */
098        public T csv() {
099            return dataFormat(new CsvDataFormat());
100        }
101    
102        /**
103         * Uses the HL7 data format
104         */
105        public T hl7() {
106            return dataFormat(new HL7DataFormat());
107        }
108    
109        /**
110         * Uses the JAXB data format
111         */
112        public T jaxb() {
113            return dataFormat(new JaxbDataFormat());
114        }
115    
116        /**
117         * Uses the JAXB data format turning pretty printing on or off
118         */
119        public T jaxb(boolean prettyPrint) {
120            return dataFormat(new JaxbDataFormat(prettyPrint));
121        }
122    
123        /**
124         * Uses the Java Serialization data format
125         */
126        public T serialization() {
127            return dataFormat(new SerializationDataFormat());
128        }
129    
130        /**
131         * Uses the String data format
132         */
133        public T string() {
134            return string(null);
135        }
136    
137        /**
138         * Uses the String data format supporting encoding using given charset
139         */
140        public T string(String charset) {
141            StringDataFormat sdf = new StringDataFormat();
142            sdf.setCharset(charset);
143            return dataFormat(sdf);
144        }
145    
146        /**
147         * Uses the JAXB data format
148         */
149        public T xmlBeans() {
150            return dataFormat(new XMLBeansDataFormat());
151        }
152    
153        /**
154         * Uses the XStream data format
155         */
156        public T xstream() {
157            return dataFormat(new XStreamDataFormat());
158        }
159        
160        /**
161         * Uses the JSON data format
162         */
163        public T json() {
164            return dataFormat(new JsonDataFormat());
165        }
166    
167        private T dataFormat(DataFormatType dataFormatType) {
168            switch (operation) {
169            case Unmarshal:
170                return (T)processorType.unmarshal(dataFormatType);
171            case Marshal:
172                return (T)processorType.marshal(dataFormatType);
173            default:
174                throw new IllegalArgumentException("Unknown DataFormat operation: " + operation);
175            }
176        }
177    
178    }