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.language.simple;
018    
019    import org.apache.camel.Expression;
020    import org.apache.camel.component.file.FileExchange;
021    import org.apache.camel.language.IllegalSyntaxException;
022    import org.apache.camel.util.ObjectHelper;
023    
024    /**
025     * File language is an extension to Simple language to add file specific expressions.
026     *
027     * Examples of supported file expressions are:
028     * <ul>
029     * <li>file:name to access the file name</li>
030     * <li>file:name.noext to access the file name with no extension</li>
031     * <li>file:parent to access the parent file name</li>
032     * <li>file:path to access the file path name</li>
033     * <li>file:absolute to access the absolute file name</li>
034     * <li>file:canonical.path to access the canonical path name</li>
035     * <li>date:&lt;command&gt;:&lt;pattern&gt; for date formatting using the {@link java.text.SimpleDateFormat} patterns.
036     * Supported commands are: <tt>now</tt> for current timestamp, <tt>file</tt> for the last modified timestamp of the file.
037     * <tt>in.header.xxx</tt> or <tt>header.xxx</tt> to use the Date object in the in header.
038     * <tt>out.header.xxx</tt> to use the Date object in the out header. </li>
039     * <li>bean:&lt;bean expression&gt; to invoke a bean using the
040     * {@link org.apache.camel.language.bean.BeanLanguage BeanLanguage}</li>
041     * <li>simple:&lt;simple expression&gt; to invoke the simple expression, however simple: can be obmitted as this language
042     * extends the simple language</li>
043     * </ul>
044     * All the simple expression is also available so you can eg use <tt>${in.header.foo}</tt> to access the foo header.
045     *
046     * @see org.apache.camel.language.simple.SimpleLanguage
047     * @see org.apache.camel.language.bean.BeanLanguage
048     */
049    public class FileLanguage extends AbstractSimpleLanguage {
050    
051        public static Expression file(String expression) {
052            FileLanguage language = new FileLanguage();
053            return language.createExpression(expression);
054        }
055    
056        protected Expression<FileExchange> createSimpleExpression(String expression) {
057    
058            // file: prefix
059            String remainder = ifStartsWithReturnRemainder("file:", expression);
060            if (remainder != null) {
061                if (ObjectHelper.equal(remainder, "name")) {
062                    return FileExpressionBuilder.fileNameExpression();
063                } else if (ObjectHelper.equal(remainder, "name.noext")) {
064                    return FileExpressionBuilder.fileNameNoExtensionExpression();
065                } else if (ObjectHelper.equal(remainder, "parent")) {
066                    return FileExpressionBuilder.fileParentExpression();
067                } else if (ObjectHelper.equal(remainder, "path")) {
068                    return FileExpressionBuilder.filePathExpression();
069                } else if (ObjectHelper.equal(remainder, "absolute")) {
070                    return FileExpressionBuilder.fileAbsoluteExpression();
071                } else if (ObjectHelper.equal(remainder, "canonical.path")) {
072                    return FileExpressionBuilder.fileCanoicalPathExpression();
073                }
074            }
075    
076            // date: prefix
077            remainder = ifStartsWithReturnRemainder("date:", expression);
078            if (remainder != null) {
079                String[] parts = remainder.split(":");
080                if (parts.length != 2) {
081                    throw new IllegalSyntaxException(this, expression + " ${date:command:pattern} is the correct syntax.");
082                }
083                String command = parts[0];
084                String pattern = parts[1];
085                return FileExpressionBuilder.dateExpression(command, pattern);
086            }
087    
088            // bean: prefix
089            remainder = ifStartsWithReturnRemainder("bean:", expression);
090            if (remainder != null) {
091                return FileExpressionBuilder.beanExpression(remainder);
092            }
093    
094            // simple: prefix
095            remainder = ifStartsWithReturnRemainder("simple:", expression);
096            if (remainder != null) {
097                return FileExpressionBuilder.simpleExpression(remainder);
098            }
099    
100            // fallback to simple language if not file specific
101            return FileExpressionBuilder.simpleExpression(expression);
102        }
103    
104    }