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
018 package org.apache.camel.builder;
019
020 import java.text.SimpleDateFormat;
021 import java.util.Date;
022
023 import org.apache.camel.Exchange;
024 import org.apache.camel.Expression;
025 import org.apache.camel.ExpressionIllegalSyntaxException;
026 import org.apache.camel.impl.ExpressionAdapter;
027 import org.apache.camel.spi.Language;
028
029 /**
030 * A helper class for working with <a href="http://camel.apache.org/expression.html">expressions</a> based
031 * on files.
032 * <p/>
033 * This expression expects the headers from the {@link org.apache.camel.language.simple.FileLanguage} on the <b>IN</b> message.
034 *
035 * @see org.apache.camel.language.simple.FileLanguage
036 */
037 public final class FileExpressionBuilder {
038
039 private FileExpressionBuilder() {
040 // Helper class
041 }
042
043 public static Expression fileNameExpression() {
044 return new ExpressionAdapter() {
045 public Object evaluate(Exchange exchange) {
046 return exchange.getIn().getHeader(Exchange.FILE_NAME, String.class);
047 }
048
049 @Override
050 public String toString() {
051 return "file:name";
052 }
053 };
054 }
055
056 public static Expression fileOnlyNameExpression() {
057 return new ExpressionAdapter() {
058 public Object evaluate(Exchange exchange) {
059 return exchange.getIn().getHeader(Exchange.FILE_NAME_ONLY, String.class);
060 }
061
062 @Override
063 public String toString() {
064 return "file:onlyname";
065 }
066 };
067 }
068
069 public static Expression fileNameNoExtensionExpression() {
070 return new ExpressionAdapter() {
071 public Object evaluate(Exchange exchange) {
072 String name = exchange.getIn().getHeader(Exchange.FILE_NAME, String.class);
073 if (name != null) {
074 int pos = name.lastIndexOf('.');
075 if (pos != -1) {
076 return name.substring(0, pos);
077 } else {
078 // name does not have extension
079 return name;
080 }
081 } else {
082 return null;
083 }
084 }
085
086 @Override
087 public String toString() {
088 return "file:name.noext";
089 }
090 };
091 }
092
093 public static Expression fileOnlyNameNoExtensionExpression() {
094 return new ExpressionAdapter() {
095 public Object evaluate(Exchange exchange) {
096 String name = exchange.getIn().getHeader(Exchange.FILE_NAME_ONLY, String.class);
097 if (name != null) {
098 int pos = name.lastIndexOf('.');
099 if (pos != -1) {
100 return name.substring(0, pos);
101 } else {
102 // name does not have extension
103 return name;
104 }
105 } else {
106 return null;
107 }
108 }
109
110 @Override
111 public String toString() {
112 return "file:onlyname.noext";
113 }
114 };
115 }
116
117 public static Expression fileExtensionExpression() {
118 return new ExpressionAdapter() {
119 public Object evaluate(Exchange exchange) {
120 String name = exchange.getIn().getHeader(Exchange.FILE_NAME, String.class);
121 if (name != null) {
122 return name.substring(name.lastIndexOf('.') + 1);
123 } else {
124 return null;
125 }
126 }
127
128 @Override
129 public String toString() {
130 return "file:ext";
131 }
132 };
133 }
134
135 public static Expression fileParentExpression() {
136 return new ExpressionAdapter() {
137 public Object evaluate(Exchange exchange) {
138 return exchange.getIn().getHeader("CamelFileParent", String.class);
139 }
140
141 @Override
142 public String toString() {
143 return "file:parent";
144 }
145 };
146 }
147
148 public static Expression filePathExpression() {
149 return new ExpressionAdapter() {
150 public Object evaluate(Exchange exchange) {
151 return exchange.getIn().getHeader("CamelFilePath", String.class);
152 }
153
154 @Override
155 public String toString() {
156 return "file:path";
157 }
158 };
159 }
160
161 public static Expression fileAbsolutePathExpression() {
162 return new ExpressionAdapter() {
163 public Object evaluate(Exchange exchange) {
164 return exchange.getIn().getHeader("CamelFileAbsolutePath", String.class);
165 }
166
167 @Override
168 public String toString() {
169 return "file:absolute.path";
170 }
171 };
172 }
173
174 public static Expression fileAbsoluteExpression() {
175 return new ExpressionAdapter() {
176 public Object evaluate(Exchange exchange) {
177 return exchange.getIn().getHeader("CamelFileAbsolute", Boolean.class);
178 }
179
180 @Override
181 public String toString() {
182 return "file:absolute";
183 }
184 };
185 }
186
187 public static Expression fileSizeExpression() {
188 return new ExpressionAdapter() {
189 public Object evaluate(Exchange exchange) {
190 return exchange.getIn().getHeader("CamelFileLength", Long.class);
191 }
192
193 @Override
194 public String toString() {
195 return "file:length";
196 }
197 };
198 }
199
200 public static Expression fileLastModifiedExpression() {
201 return new ExpressionAdapter() {
202 public Object evaluate(Exchange exchange) {
203 return exchange.getIn().getHeader("CamelFileLastModified", Date.class);
204 }
205
206 @Override
207 public String toString() {
208 return "file:modified";
209 }
210 };
211 }
212
213
214 public static Expression dateExpression(final String command, final String pattern) {
215 return new ExpressionAdapter() {
216 public Object evaluate(Exchange exchange) {
217 if ("file".equals(command)) {
218 Date date = exchange.getIn().getHeader("CamelFileLastModified", Date.class);
219 if (date != null) {
220 SimpleDateFormat df = new SimpleDateFormat(pattern);
221 return df.format(date);
222 } else {
223 return null;
224 }
225 }
226 // must call evaluate to return the nested language evaluate when evaluating
227 // stacked expressions
228 return ExpressionBuilder.dateExpression(command, pattern).evaluate(exchange);
229 }
230
231 @Override
232 public String toString() {
233 return "date(" + command + ":" + pattern + ")";
234 }
235 };
236 }
237
238 public static Expression simpleExpression(final String expression) {
239 return new ExpressionAdapter() {
240 public Object evaluate(Exchange exchange) {
241 // must call evaluate to return the nested language evaluate when evaluating
242 // stacked expressions
243 try {
244 Language simple = exchange.getContext().resolveLanguage("simple");
245 return simple.createExpression(expression).evaluate(exchange);
246 } catch (ExpressionIllegalSyntaxException e) {
247 // fallback to constant so end users can enter a fixed filename
248 Language constant = exchange.getContext().resolveLanguage("constant");
249 return constant.createExpression(expression).evaluate(exchange);
250 }
251 }
252
253 @Override
254 public String toString() {
255 return "simple(" + expression + ")";
256 }
257 };
258 }
259
260 }