01: /*
02: * $Id: ExpressionFilenameParser.java 11232 2008-03-06 22:22:30Z rossmason $
03: * --------------------------------------------------------------------------------------
04: * Copyright (c) MuleSource, Inc. All rights reserved. http://www.mulesource.com
05: *
06: * The software in this package is published under the terms of the CPAL v1.0
07: * license, a copy of which has been included with this distribution in the
08: * LICENSE.txt file.
09: */
10:
11: package org.mule.transport.file;
12:
13: import org.mule.api.transport.MessageAdapter;
14: import org.mule.util.TemplateParser;
15: import org.mule.util.expression.ExpressionEvaluatorManager;
16:
17: /**
18: * <code>ExpressionFilenameParser</code> can use any expression language supported by Mule
19: * to construct a file name for the current message. Expressions can be xpath, xquery, ognl, mvel, header, function
20: * and more. For more information see http://muledocs.org/v2/Expressions.
21: * <p/>
22: * For example an xpath expression can be defined to pull a message id out of an xml message and use that as the file name -
23: * <code>
24: * ${xpath:/message/header/@id}
25: * </code>
26: * <p/>
27: * This parser superseeds the {@link org.mule.transport.file.SimpleFilenameParser} which has been kept in Mule 2 for
28: * compatibility. The following demonstrates how to achieve the same results when using the <code>ExpressionFilenameParser</code>
29: * over the {@link org.mule.transport.file.SimpleFilenameParser}.
30: * <ul>
31: * <li>${DATE} : ${function:dateStamp}</li>
32: * <li>${DATE:yy-MM-dd} : ${function:dateStamp(yy-MM-dd)}</li>
33: * <li>${SYSTIME} : ${function:systime}</li>
34: * <li>${UUID} : ${function:uuid}</li>
35: * <li>${ORIGINALNAME} : ${header:originalFilename}</li>
36: * <li>${COUNT} : ${function:counter} - note that this is a global counter. If you want a local counter per file connector then you should use the {@link org.mule.transport.file.SimpleFilenameParser}.</li>
37: * <li>${<Message Property Name>} : ${header:<Message Property Name>}</li>
38: * </ul>
39: */
40:
41: public class ExpressionFilenameParser implements FilenameParser {
42: public static final String DEFAULT_DATE_FORMAT = "dd-MM-yy_HH-mm-ss.SSS";
43: public static final String DEFAULT_EXPRESSION = "${function:uuid}.dat";
44:
45: private final TemplateParser antParser = TemplateParser
46: .createAntStyleParser();
47: private final TemplateParser squareParser = TemplateParser
48: .createSquareBracesStyleParser();
49:
50: public String getFilename(MessageAdapter adapter, String expression) {
51: if (expression == null) {
52: return expression = DEFAULT_EXPRESSION;
53: }
54:
55: if (expression
56: .indexOf(ExpressionEvaluatorManager.DEFAULT_EXPRESSION_PREFIX) > -1) {
57: return getFilename(adapter, expression, antParser);
58: } else {
59: return getFilename(adapter, expression, squareParser);
60: }
61: }
62:
63: protected String getFilename(final MessageAdapter adapter,
64: String expression, TemplateParser parser) {
65: return parser.parse(new TemplateParser.TemplateCallback() {
66: public Object match(String token) {
67: return ExpressionEvaluatorManager.evaluate(token,
68: adapter);
69: }
70: }, expression);
71: }
72: }
|