View Javadoc

1   /*
2    * $Id: ExpressionFilenameParser.java 11232 2008-03-06 22:22:30Z rossmason $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
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  {
43      public static final String DEFAULT_DATE_FORMAT = "dd-MM-yy_HH-mm-ss.SSS";
44      public static final String DEFAULT_EXPRESSION = "${function:uuid}.dat";
45  
46      private final TemplateParser antParser = TemplateParser.createAntStyleParser();
47      private final TemplateParser squareParser = TemplateParser.createSquareBracesStyleParser();
48  
49      public String getFilename(MessageAdapter adapter, String expression)
50      {
51          if (expression == null)
52          {
53              return expression = DEFAULT_EXPRESSION;
54          }
55  
56          if (expression.indexOf(ExpressionEvaluatorManager.DEFAULT_EXPRESSION_PREFIX) > -1)
57          {
58              return getFilename(adapter, expression, antParser);
59          }
60          else
61          {
62              return getFilename(adapter, expression, squareParser);
63          }
64      }
65  
66  
67      protected String getFilename(final MessageAdapter adapter, String expression, TemplateParser parser)
68      {
69          return parser.parse(new TemplateParser.TemplateCallback()
70          {
71              public Object match(String token)
72              {
73                  return ExpressionEvaluatorManager.evaluate(token, adapter);
74              }
75          }, expression);
76      }
77  }