001    package org.apache.camel.language.simple;
002    
003    import java.io.IOException;
004    import java.text.SimpleDateFormat;
005    import java.util.Date;
006    
007    import org.apache.camel.Expression;
008    import org.apache.camel.RuntimeCamelException;
009    import org.apache.camel.component.file.FileExchange;
010    import org.apache.camel.language.bean.BeanLanguage;
011    
012    /**
013     * A helper class for working with <a href="http://activemq.apache.org/camel/expression.html">expressions</a> based
014     * on FileExchange.
015     */
016    public class FileExpressionBuilder {
017    
018        public static <E extends FileExchange> Expression<E> fileNameExpression() {
019            return new Expression<E>() {
020                public Object evaluate(E exchange) {
021                    if (exchange.getFile() == null) {
022                        return null;
023                    }
024                    return exchange.getFile().getName();
025                }
026    
027                @Override
028                public String toString() {
029                    return "file:name";
030                }
031            };
032        }
033    
034        public static <E extends FileExchange> Expression<E> fileNameNoExtensionExpression() {
035            return new Expression<E>() {
036                public Object evaluate(E exchange) {
037                    if (exchange.getFile() == null) {
038                        return null;
039                    }
040                    String name = exchange.getFile().getName();
041                    return name.substring(0, name.lastIndexOf('.'));
042                }
043    
044                @Override
045                public String toString() {
046                    return "file:name.noext";
047                }
048            };
049        }
050    
051        public static <E extends FileExchange> Expression<E> fileParentExpression() {
052            return new Expression<E>() {
053                public Object evaluate(E exchange) {
054                    if (exchange.getFile() == null) {
055                        return null;
056                    }
057                    return exchange.getFile().getParent();
058                }
059    
060                @Override
061                public String toString() {
062                    return "file:parent";
063                }
064            };
065        }
066    
067        public static <E extends FileExchange> Expression<E> filePathExpression() {
068            return new Expression<E>() {
069                public Object evaluate(E exchange) {
070                    if (exchange.getFile() == null) {
071                        return null;
072                    }
073                    return exchange.getFile().getPath();
074                }
075    
076                @Override
077                public String toString() {
078                    return "file:path";
079                }
080            };
081        }
082    
083        public static <E extends FileExchange> Expression<E> fileAbsoluteExpression() {
084            return new Expression<E>() {
085                public Object evaluate(E exchange) {
086                    if (exchange.getFile() == null) {
087                        return null;
088                    }
089                    return exchange.getFile().getAbsolutePath();
090                }
091    
092                @Override
093                public String toString() {
094                    return "file:absolute";
095                }
096            };
097        }
098    
099        public static <E extends FileExchange> Expression<E> fileCanoicalPathExpression() {
100            return new Expression<E>() {
101                public Object evaluate(E exchange) {
102                    if (exchange.getFile() == null) {
103                        return null;
104                    }
105                    try {
106                        return exchange.getFile().getCanonicalPath();
107                    } catch (IOException e) {
108                        throw new RuntimeCamelException("Could not get the canonical path for file: " + exchange.getFile(), e);
109                    }
110                }
111    
112                @Override
113                public String toString() {
114                    return "file:canonical.path";
115                }
116            };
117        }
118    
119        public static <E extends FileExchange> Expression<E> dateExpression(final String command, final String pattern) {
120            return new Expression<E>() {
121                public Object evaluate(E exchange) {
122                    Date date;
123                    if ("file".equals(command)) {
124                        if (exchange.getFile() == null) {
125                            return null;
126                        }
127                        date = new Date(exchange.getFile().lastModified());
128                    } else if ("now".equals(command)) {
129                        date = new Date();
130                    } else if (command.startsWith("header.") || command.startsWith("in.header.")) {
131                        String key = command.substring(command.lastIndexOf(".") + 1);
132                        date = exchange.getIn().getHeader(key, Date.class);
133                        if (date == null) {
134                            throw new IllegalArgumentException("Could not find java.util.Date object at " + command);
135                        }
136                    } else if (command.startsWith("out.header.")) {
137                        String key = command.substring(command.lastIndexOf(".") + 1);
138                        date = exchange.getOut().getHeader(key, Date.class);
139                        if (date == null) {
140                            throw new IllegalArgumentException("Could not find java.util.Date object at " + command);
141                        }
142                    } else {
143                        throw new IllegalArgumentException("Command not supported for dateExpression: " + command);
144                    }
145    
146                    SimpleDateFormat df = new SimpleDateFormat(pattern);
147                    return df.format(date);
148                }
149    
150                @Override
151                public String toString() {
152                    return "date(" + command + ":" + pattern + ")";
153                }
154            };
155        }
156    
157        public static <E extends FileExchange> Expression<E> simpleExpression(final String simple) {
158            return new Expression<E>() {
159                public Object evaluate(E exchange) {
160                    // must call evalute to return the nested langauge evaluate when evaluating
161                    // stacked expressions
162                    return SimpleLanguage.simple(simple).evaluate(exchange);
163                }
164    
165                @Override
166                public String toString() {
167                    return "simple(" + simple + ")";
168                }
169            };
170        }
171    
172        public static <E extends FileExchange> Expression<E> beanExpression(final String bean) {
173            return new Expression<E>() {
174                public Object evaluate(E exchange) {
175                    // must call evalute to return the nested langauge evaluate when evaluating
176                    // stacked expressions
177                    return BeanLanguage.bean(bean).evaluate(exchange);
178                }
179    
180                @Override
181                public String toString() {
182                    return "bean(" + bean + ")";
183                }
184            };
185        }
186    
187    }