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.Arrays;
020    
021    import org.apache.camel.Exchange;
022    import org.apache.camel.Expression;
023    import org.apache.camel.Processor;
024    
025    /**
026     * A builder of a number of different {@link Processor} implementations
027     *
028     * @version 
029     */
030    public final class ProcessorBuilder {
031    
032        /**
033         * Utility classes should not have a public constructor.
034         */
035        private ProcessorBuilder() {
036        }
037    
038        /**
039         * Creates a processor which sets the body of the message to the value of the expression
040         */
041        public static Processor setBody(final Expression expression) {
042            return new Processor() {
043                public void process(Exchange exchange) {
044                    Object newBody = expression.evaluate(exchange, Object.class);
045                    if (exchange.hasOut()) {
046                        exchange.getOut().setBody(newBody);
047                    } else {
048                        exchange.getIn().setBody(newBody);
049                    }
050                }
051    
052                @Override
053                public String toString() {
054                    return "setBody(" + expression + ")";
055                }
056            };
057        }
058    
059        /**
060         * Creates a processor which sets the body of the OUT message to the value of the expression
061         *
062         * @deprecated use {@link #setBody(org.apache.camel.Expression)}
063         */
064        @Deprecated
065        public static Processor setOutBody(final Expression expression) {
066            return new Processor() {
067                public void process(Exchange exchange) {
068                    Object newBody = expression.evaluate(exchange, Object.class);
069                    exchange.getOut().setBody(newBody);
070                }
071    
072                @Override
073                public String toString() {
074                    return "setOutBody(" + expression + ")";
075                }
076            };
077        }
078    
079        /**
080         * Creates a processor which sets the body of the FAULT message (FAULT must be OUT) to the value of the expression
081         */
082        public static Processor setFaultBody(final Expression expression) {
083            return new Processor() {
084                public void process(Exchange exchange) {
085                    Object newBody = expression.evaluate(exchange, Object.class);
086                    exchange.getOut().setFault(true);
087                    exchange.getOut().setBody(newBody);
088                }
089    
090                @Override
091                public String toString() {
092                    return "setFaultBody(" + expression + ")";
093                }
094            };
095        }
096    
097        /**
098         * Sets the header on the message.
099         */
100        public static Processor setHeader(final String name, final Expression expression) {
101            return new Processor() {
102                public void process(Exchange exchange) {
103                    Object value = expression.evaluate(exchange, Object.class);
104                    if (exchange.hasOut()) {
105                        exchange.getOut().setHeader(name, value);
106                    } else {
107                        exchange.getIn().setHeader(name, value);
108                    }
109                }
110    
111                @Override
112                public String toString() {
113                    return "setHeader(" + name + ", " + expression + ")";
114                }
115            };
116        }
117    
118        /**
119         * Sets the header on the OUT message
120         *
121         * @deprecated use {@link #setHeader(String, org.apache.camel.Expression)}
122         */
123        @Deprecated
124        public static Processor setOutHeader(final String name, final Expression expression) {
125            return new Processor() {
126                public void process(Exchange exchange) {
127                    Object value = expression.evaluate(exchange, Object.class);
128                    exchange.getOut().setHeader(name, value);
129                }
130    
131                @Override
132                public String toString() {
133                    return "setOutHeader(" + name + ", " + expression + ")";
134                }
135            };
136        }
137    
138        /**
139         * Sets the header on the FAULT message (FAULT must be OUT)
140         */
141        public static Processor setFaultHeader(final String name, final Expression expression) {
142            return new Processor() {
143                public void process(Exchange exchange) {
144                    Object value = expression.evaluate(exchange, Object.class);
145                    exchange.getOut().setFault(true);
146                    exchange.getOut().setHeader(name, value);
147                }
148    
149                @Override
150                public String toString() {
151                    return "setFaultHeader(" + name + ", " + expression + ")";
152                }
153            };
154        }
155    
156        /**
157         * Sets the property on the exchange
158         */
159        public static Processor setProperty(final String name, final Expression expression) {
160            return new Processor() {
161                public void process(Exchange exchange) {
162                    Object value = expression.evaluate(exchange, Object.class);
163                    exchange.setProperty(name, value);
164                }
165    
166                @Override
167                public String toString() {
168                    return "setProperty(" + name + ", " + expression + ")";
169                }
170            };
171        }
172    
173        /**
174         * Removes the header on the message.
175         */
176        public static Processor removeHeader(final String name) {
177            return new Processor() {
178                public void process(Exchange exchange) {
179                    if (exchange.hasOut()) {
180                        exchange.getOut().removeHeader(name);
181                    } else {
182                        exchange.getIn().removeHeader(name);
183                    }
184                }
185    
186                @Override
187                public String toString() {
188                    return "removeHeader(" + name +  ")";
189                }
190            };
191        }
192    
193        /**
194         * Removes the headers on the message
195         */
196        public static Processor removeHeaders(final String pattern) {
197            return new Processor() {
198                public void process(Exchange exchange) {
199                    if (exchange.hasOut()) {
200                        exchange.getOut().removeHeaders(pattern);
201                    } else {
202                        exchange.getIn().removeHeaders(pattern);
203                    }
204                }
205    
206                @Override
207                public String toString() {
208                    return "removeHeaders(" + pattern +  ")";
209                }
210            };
211        }
212        
213        /**
214         * Removes all headers on the message, except for the ones provided in the <tt>names</tt> parameter
215         */
216        public static Processor removeHeaders(final String pattern, final String... exceptionPatterns) {
217            return new Processor() {
218                public void process(Exchange exchange) {
219                    if (exchange.hasOut()) {
220                        exchange.getOut().removeHeaders(pattern, exceptionPatterns);
221                    } else {
222                        exchange.getIn().removeHeaders(pattern, exceptionPatterns);
223                    }
224                }
225    
226                @Override
227                public String toString() {
228                    return "removeHeaders(" + pattern + ", " + Arrays.toString(exceptionPatterns) + ")";
229                }
230            };
231        }
232    
233        /**
234         * Removes the header on the FAULT message (FAULT must be OUT)
235         * @deprecated will be removed in the near future. Instead use {@link #removeHeader(String)}
236         */
237        @Deprecated
238        public static Processor removeFaultHeader(final String name) {
239            return new Processor() {
240                public void process(Exchange exchange) {
241                    exchange.getOut().setFault(true);
242                    exchange.getOut().removeHeader(name);
243                }
244    
245                @Override
246                public String toString() {
247                    return "removeFaultHeader(" + name +  ")";
248                }
249            };
250        }
251    
252        /**
253         * Removes the property on the exchange
254         */
255        public static Processor removeProperty(final String name) {
256            return new Processor() {
257                public void process(Exchange exchange) {
258                    exchange.removeProperty(name);
259                }
260    
261                @Override
262                public String toString() {
263                    return "removeProperty(" + name +  ")";
264                }
265            };
266        }
267    
268        /**
269         * Throws an exception
270         */
271        public static Processor throwException(final Exception ex) {
272            return new Processor() {
273                public void process(Exchange exchange) throws Exception {
274                    throw ex;
275                }
276    
277                @Override
278                public String toString() {
279                    return "throwException(" + ex.toString() +  ")";
280                }
281            };
282        }
283    }