You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by jo...@apache.org on 2015/01/31 04:44:19 UTC

[42/62] [abbrv] [partial] incubator-nifi git commit: NIFI-270 Made all changes identified by adam, mark, joey to prep for a cleaner build

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
----------------------------------------------------------------------
diff --git a/nifi/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java b/nifi/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
deleted file mode 100644
index 8dfbaf1..0000000
--- a/nifi/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
+++ /dev/null
@@ -1,1143 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.attribute.expression.language;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.nifi.attribute.expression.language.Query.Range;
-import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
-import org.apache.nifi.attribute.expression.language.exception.AttributeExpressionLanguageException;
-import org.apache.nifi.attribute.expression.language.exception.AttributeExpressionLanguageParsingException;
-import org.apache.nifi.expression.AttributeExpression.ResultType;
-import org.apache.nifi.flowfile.FlowFile;
-import org.antlr.runtime.tree.Tree;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-public class TestQuery {
-
-    @Test
-    public void testCompilation() {
-        assertInvalid("${attr:uuid()}");
-        assertInvalid("${attr:indexOf(length())}");
-        assertValid("${UUID()}");
-        assertInvalid("${UUID():nextInt()}");
-        assertValid("${nextInt()}");
-        assertValid("${now():format('yyyy/MM/dd')}");
-        assertInvalid("${attr:times(3)}");
-        assertValid("${attr:toNumber():multiply(3)}");
-        // left here because it's convenient for looking at the output
-        //System.out.println(Query.compile("").evaluate(null));
-    }
-    
-    private void assertValid(final String query) {
-        try {
-            Query.compile(query);
-        } catch (final Exception e) {
-            e.printStackTrace();
-            Assert.fail("Expected query to be valid, but it failed to compile due to " + e);
-        }
-    }
-    
-    private void assertInvalid(final String query) {
-        try {
-            Query.compile(query);
-            Assert.fail("Expected query to be invalid, but it did compile");
-        } catch (final Exception e) {
-        }
-    }
-    
-    @Test
-    public void testIsValidExpression() {
-        Query.validateExpression("${abc:substring(${xyz:length()})}", false);
-        Query.isValidExpression("${now():format('yyyy-MM-dd')}");
-        
-        
-        try {
-            Query.validateExpression("$${attr}", false);
-            Assert.fail("invalid query validated");
-        } catch (final AttributeExpressionLanguageParsingException e) {
-        }
-        
-        Query.validateExpression("$${attr}", true);
-        
-        Query.validateExpression("${filename:startsWith('T8MTXBC')\n" 
-            + ":or( ${filename:startsWith('C4QXABC')} )\n"
-            + ":or( ${filename:startsWith('U6CXEBC')} )"
-            + ":or( ${filename:startsWith('KYM3ABC')} )}", false);
-    }
-
-    
-    @Test
-    public void testCompileEmbedded() {
-        final String expression = "${x:equals( ${y} )}";
-        final Query query = Query.compile(expression);
-        final Tree tree = query.getTree();
-        System.out.println( printTree(tree) );
-        
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("x", "x");
-        attributes.put("y", "x");
-        final String result = Query.evaluateExpressions(expression, attributes, null);
-        assertEquals("true", result);
-        
-        Query.validateExpression(expression, false);
-    }
-    
-    private String printTree(final Tree tree) {
-        final StringBuilder sb = new StringBuilder();
-        printTree(tree, 0, sb);
-        
-        return sb.toString();
-    }
-    
-    private void printTree(final Tree tree, final int spaces, final StringBuilder sb) {
-        for (int i=0; i < spaces; i++) {
-            sb.append(" ");
-        }
-        
-        if ( tree.getText().trim().isEmpty() ) {
-            sb.append(tree.toString()).append("\n");
-        } else {
-            sb.append(tree.getText()).append("\n");
-        }
-        
-        for (int i=0; i < tree.getChildCount(); i++) {
-            printTree(tree.getChild(i), spaces + 2, sb);
-        }
-    }
-
-    @Test
-    public void testEscape() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "My Value");
-        attributes.put("${xx}", "hello");
-        
-        assertEquals("My Value", evaluateQueryForEscape("${attr}", attributes));
-        assertEquals("${attr}", evaluateQueryForEscape("$${attr}", attributes));
-        assertEquals("$My Value", evaluateQueryForEscape("$$${attr}", attributes));
-        assertEquals("$${attr}", evaluateQueryForEscape("$$$${attr}", attributes));
-        assertEquals("$$My Value", evaluateQueryForEscape("$$$$${attr}", attributes));
-    }
-
-    @Test
-    public void testWithBackSlashes() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("x", "C:\\test\\1.txt");
-        attributes.put("y", "y\ny");
-        
-        final String query = "${x:substringAfterLast( '/' ):substringAfterLast( '\\\\' )}";
-        verifyEquals(query, attributes, "1.txt");
-        attributes.put("x", "C:/test/1.txt");
-        verifyEquals(query, attributes, "1.txt");
-        
-        verifyEquals("${y:equals('y\\ny')}", attributes, Boolean.TRUE);
-    }
-    
-    @Test
-    public void testWithTicksOutside() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "My Value");
-
-        assertEquals(1, Query.extractExpressionRanges("\"${attr}").size());
-        assertEquals(1, Query.extractExpressionRanges("'${attr}").size());
-        assertEquals(1, Query.extractExpressionRanges("'${attr}'").size());
-        assertEquals(1, Query.extractExpressionRanges("${attr}").size());
-
-        assertEquals("'My Value'", Query.evaluateExpressions("'${attr}'", attributes, null));
-        assertEquals("'My Value", Query.evaluateExpressions("'${attr}", attributes, null));
-    }
-
-    
-    @Test
-    @Ignore("Depends on TimeZone")
-    public void testDateToNumber() {
-        final Query query = Query.compile("${dateTime:toDate('yyyy/MM/dd HH:mm:ss.SSS'):toNumber()}");
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("dateTime", "2013/11/18 10:22:27.678");
-        
-        final QueryResult<?> result = query.evaluate(attributes);
-        assertEquals(ResultType.NUMBER, result.getResultType());
-        assertEquals(1384788147678L, result.getValue());
-    }
-
-    @Test
-    public void testAddOneDayToDate() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("dateTime", "2013/11/18 10:22:27.678");
-
-        verifyEquals("${dateTime:toDate('yyyy/MM/dd HH:mm:ss.SSS'):toNumber():plus(86400000):toDate():format('yyyy/MM/dd HH:mm:ss.SSS')}", attributes, "2013/11/19 10:22:27.678");
-        verifyEquals("${dateTime:toDate('yyyy/MM/dd HH:mm:ss.SSS'):plus(86400000):format('yyyy/MM/dd HH:mm:ss.SSS')}", attributes, "2013/11/19 10:22:27.678");
-    }
-
-    @Test
-    @Ignore("Requires specific locale")
-    public void implicitDateConversion() {
-        final Date date = new Date();
-        final Query query = Query.compile("${dateTime:format('yyyy/MM/dd HH:mm:ss.SSS')}");
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("dateTime", date.toString());
-        
-        // the date.toString() above will end up truncating the milliseconds. So remove millis from the Date before
-        // formatting it
-        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS", Locale.US);
-        final long millis = date.getTime() % 1000L;
-        final Date roundedToNearestSecond = new Date(date.getTime() - millis);
-        final String formatted = sdf.format(roundedToNearestSecond);
-        
-        final QueryResult<?> result = query.evaluate(attributes);
-        assertEquals(ResultType.STRING, result.getResultType());
-        assertEquals(formatted, result.getValue());
-    }
-
-    
-    @Test
-    public void testEmbeddedExpressionsAndQuotes() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("x", "abc");
-        attributes.put("a", "abc");
-        
-        verifyEquals("${x:equals(${a})}", attributes, true);
-        
-        Query.validateExpression("${x:equals('${a}')}", false);
-        assertEquals("true", Query.evaluateExpressions("${x:equals('${a}')}", attributes, null));
-        
-        Query.validateExpression("${x:equals(\"${a}\")}", false);
-        assertEquals("true", Query.evaluateExpressions("${x:equals(\"${a}\")}", attributes, null));
-    }
-    
-    @Test
-    public void testJoin() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("a.a", "a");
-        attributes.put("a.b", "b");
-        attributes.put("a.c", "c");
-        verifyEquals("${allAttributes( 'a.a', 'a.b', 'a.c' ):join(', ')}", attributes, "a, b, c");
-        verifyEquals("${x:join(', ')}", attributes, "");
-        verifyEquals("${a.a:join(', ')}", attributes, "a");
-        verifyEquals("${allAttributes( 'x', 'y' ):join(',')}", attributes, ",");
-    }
-    
-    @Test(expected=AttributeExpressionLanguageException.class)
-    public void testCannotCombineWithNonReducingFunction() {
-        Query.compileTree("${allAttributes( 'a.1' ):plus(1)}");
-    }
-
-
-    @Test
-    public void testIsEmpty() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("a", "a");
-        attributes.put("b", "");
-        attributes.put("c", "        \n");
-
-        verifyEquals("${a:isEmpty()}", attributes, false);
-        verifyEquals("${b:isEmpty()}", attributes, true);
-        verifyEquals("${c:isEmpty()}", attributes, true);
-        verifyEquals("${d:isEmpty()}", attributes, true);
-    }
-
-
-    @Test
-    public void testReplaceEmpty() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("a", "a");
-        attributes.put("b", "");
-        attributes.put("c", "        \n");
-            
-        verifyEquals("${a:replaceEmpty('c')}", attributes, "a");
-        verifyEquals("${b:replaceEmpty('c')}", attributes, "c");
-        verifyEquals("${c:replaceEmpty('c')}", attributes, "c");
-        verifyEquals("${d:replaceEmpty('c')}", attributes, "c");
-    }
-
-
-
-    @Test
-    public void testCount() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("a", "a");
-        attributes.put("b", "abc");
-        attributes.put("c", "        \n");
-        attributes.put("n1", "111");
-        attributes.put("n2", "222");
-        attributes.put("n3", "333333");
-
-        verifyEquals("${allMatchingAttributes( '.*' ):count()}", attributes, 6L);
-        verifyEquals("${allMatchingAttributes( '.*' ):length():gt(2):count()}", attributes, 5L);
-        verifyEquals("${allMatchingAttributes( 'n.*' ):plus(1):count()}", attributes, 3L );
-    }
-    
-    
-    @Test
-    public void testCurlyBracesInQuotes() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "My Valuee");
-        
-        assertEquals("Val", evaluateQueryForEscape("${attr:replaceAll('My (Val)ue{1,2}', '$1')}", attributes));
-        assertEquals("Val", evaluateQueryForEscape("${attr:replaceAll(\"My (Val)ue{1,2}\", '$1')}", attributes));
-    }
-    
-    
-    private String evaluateQueryForEscape(final String queryString, final Map<String, String> attributes) {
-        FlowFile mockFlowFile = Mockito.mock(FlowFile.class);
-        Mockito.when(mockFlowFile.getAttributes()).thenReturn(attributes);
-        Mockito.when(mockFlowFile.getId()).thenReturn(1L);
-        Mockito.when(mockFlowFile.getEntryDate()).thenReturn(System.currentTimeMillis());
-        Mockito.when(mockFlowFile.getSize()).thenReturn(1L);
-        Mockito.when(mockFlowFile.getLineageIdentifiers()).thenReturn(new HashSet<String>());
-        Mockito.when(mockFlowFile.getLineageStartDate()).thenReturn(System.currentTimeMillis());
-        return Query.evaluateExpressions(queryString, mockFlowFile);
-    }
-    
-    
-    @Test
-    public void testGetAttributeValue() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "My Value");
-        verifyEquals("${attr}", attributes, "My Value");
-    }
-    
-    @Test
-    public void testGetAttributeValueEmbedded() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "XX ");
-        attributes.put("XX", "My Value");
-        verifyEquals("${${attr:trim()}}", attributes, "My Value");
-    }
-    
-    @Test
-    public void testSimpleSubstring() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "My Value");
-        verifyEquals("${attr:substring(2, 5)}", attributes, " Va");
-    }
-    
-    @Test
-    public void testCallToFunctionWithSubjectResultOfAnotherFunctionCall() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "   My Value   ");
-        verifyEquals("${attr:trim():substring(2, 5)}", attributes, " Va");
-    }
-
-    @Test
-    public void testProblematic1() {
-        // There was a bug that prevented this expression from compiling. This test just verifies that it now compiles.
-        final String queryString = "${xx:append( \"120101\" ):toDate( 'yyMMddHHmmss' ):format( \"yy-MM-dd’T’HH:mm:ss\") }";
-        Query.compile(queryString);
-    }
-
-    @Test
-    public void testEquals() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", " XX    ");
-        verifyEquals("${attr:trim():equals('XX')}", attributes, true);
-    }
-    
-    @Test
-    public void testDeeplyEmbedded() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("x", "false");
-        attributes.put("abc", "a");
-        attributes.put("a", "a");
-        
-        verifyEquals("${x:or( ${${abc}:length():equals(1)} )}", attributes, true);
-    }
-    
-    
-    @Test
-    public void testExtractExpressionRanges() {
-        List<Range> ranges = Query.extractExpressionRanges("hello");
-        assertTrue(ranges.isEmpty());
-        
-        ranges = Query.extractExpressionRanges("${hello");
-        assertTrue(ranges.isEmpty());
-        
-        ranges = Query.extractExpressionRanges("hello}");
-        assertTrue(ranges.isEmpty());
-        
-        ranges = Query.extractExpressionRanges("$${hello");
-        assertTrue(ranges.isEmpty());
-
-        ranges = Query.extractExpressionRanges("$he{ll}o");
-        assertTrue(ranges.isEmpty());
-
-        ranges = Query.extractExpressionRanges("${hello}");
-        assertEquals(1, ranges.size());
-        Range range = ranges.get(0);
-        assertEquals(0, range.getStart());
-        assertEquals(7, range.getEnd());
-        
-        ranges = Query.extractExpressionRanges("${hello:equals( ${goodbye} )}");
-        assertEquals(1, ranges.size());
-        range = ranges.get(0);
-        assertEquals(0, range.getStart());
-        assertEquals(28, range.getEnd());
-        
-        ranges = Query.extractExpressionRanges("${hello:equals( $${goodbye} )}");
-        assertEquals(1, ranges.size());
-        range = ranges.get(0);
-        assertEquals(0, range.getStart());
-        assertEquals(29, range.getEnd());
-        
-        ranges = Query.extractExpressionRanges("${hello:equals( $${goodbye} )} or just hi, ${bob:or(${jerry})}");
-        assertEquals(2, ranges.size());
-        range = ranges.get(0);
-        assertEquals(0, range.getStart());
-        assertEquals(29, range.getEnd());
-        
-        range = ranges.get(1);
-        assertEquals(43, range.getStart());
-        assertEquals(61, range.getEnd());
-        
-        
-        ranges = Query.extractExpressionRanges("${hello:equals( ${goodbye} )} or just hi, ${bob}, are you ${bob.age:toNumber()} yet? $$$${bob}");
-        assertEquals(3, ranges.size());
-        range = ranges.get(0);
-        assertEquals(0, range.getStart());
-        assertEquals(28, range.getEnd());
-        
-        range = ranges.get(1);
-        assertEquals(42, range.getStart());
-        assertEquals(47, range.getEnd());
-        
-        range = ranges.get(2);
-        assertEquals(58, range.getStart());
-        assertEquals(78, range.getEnd());
-        
-        ranges = Query.extractExpressionRanges("${x:matches( '.{4}' )}");
-        assertEquals(1, ranges.size());
-        range = ranges.get(0);
-        assertEquals(0, range.getStart());
-        assertEquals(21, range.getEnd());
-    }
-    
-    
-    @Test
-    public void testExtractExpressionTypes() {
-        List<ResultType> types = Query.extractResultTypes("${hello:equals( ${goodbye} )} or just hi, ${bob}, are you ${bob.age:toNumber()} yet? $$$${bob}");
-        assertEquals(3, types.size());
-        assertEquals(ResultType.BOOLEAN, types.get(0));
-        assertEquals(ResultType.STRING, types.get(1));
-        assertEquals(ResultType.NUMBER, types.get(2));
-    }
-    
-    
-    @Test
-    public void testEqualsEmbedded() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("x", "hello");
-        attributes.put("y", "good-bye");
-        
-        verifyEquals("${x:equals( ${y} )}", attributes, false);
-        
-        attributes.put("y", "hello");
-        verifyEquals("${x:equals( ${y} )}", attributes, true);
-        
-        attributes.put("x", "4");
-        attributes.put("y", "3");
-        attributes.put("z", "1");
-        attributes.put("h", "100");
-        verifyEquals("${x:toNumber():lt( ${y:toNumber():plus( ${h:toNumber()} )} )}", attributes, true);
-        verifyEquals("${h:toNumber():ge( ${y:toNumber():plus( ${z:toNumber()} )} )}", attributes, true);
-        verifyEquals("${x:toNumber():equals( ${y:toNumber():plus( ${z:toNumber()} )} )}", attributes, true);
-
-        attributes.put("x", "88");
-        verifyEquals("${x:toNumber():gt( ${y:toNumber():plus( ${z:toNumber()} )} )}", attributes, true);
-
-        attributes.put("y", "88");
-        assertEquals("true", Query.evaluateExpressions("${x:equals( '${y}' )}", attributes, null));
-    }
-    
-    
-    @Test
-    public void testComplicatedEmbeddedExpressions() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("fox", "quick, brown");
-        attributes.put("dog", "lazy");
-        
-        verifyEquals("${fox:substring( ${ 'dog' :substring(2):length()}, 5 ):equals( 'ick' )}", attributes, true);
-        verifyEquals("${fox:substring( ${ 'dog' :substring(2):length()}, 5 ):equals( 'ick' )}", attributes, true);
-    }
-    
-    @Test
-    public void testQuotingQuotes() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("xx", "say 'hi'");
-
-        String query = "${xx:replaceAll( \"'.*'\", '\\\"hello\\\"' )}";
-        verifyEquals(query, attributes, "say \"hello\"");
-
-        query = "${xx:replace( \"'\", '\"')}";
-        verifyEquals(query, attributes, "say \"hi\"");
-
-        query = "${xx:replace( '\\'', '\"')}";
-        System.out.println(query);
-        verifyEquals(query, attributes, "say \"hi\"");
-    }
-    
-    @Test
-    public void testDoubleQuotesWithinSingleQuotes() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("xx", "say 'hi'");
-
-        String query = "${xx:replace( \"'hi'\", '\\\"hello\\\"' )}";
-        System.out.println(query);
-        verifyEquals(query, attributes, "say \"hello\"");
-    }
-    
-    @Test
-    public void testEscapeQuotes() {
-        final long timestamp = 1403620278642L;
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("date", String.valueOf(timestamp));
-        
-        final String format = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
-        
-        final String query = "startDateTime=\"${date:toNumber():toDate():format(\"" + format + "\")}\"";
-        final String result = Query.evaluateExpressions(query, attributes, null);
-        
-        final String expectedTime = new SimpleDateFormat(format, Locale.US).format(timestamp);
-        assertEquals("startDateTime=\"" + expectedTime + "\"", result);
-        
-        final List<Range> ranges = Query.extractExpressionRanges(query);
-        assertEquals(1, ranges.size());
-    }
-    
-    @Test
-    public void testDateConversion() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("date", "1403620278642");
-        
-        verifyEquals("${date:format('yyyy')}", attributes, "2014");
-        verifyEquals("${date:toDate():format('yyyy')}", attributes, "2014");
-        verifyEquals("${date:toNumber():format('yyyy')}", attributes, "2014");
-        verifyEquals("${date:toNumber():toDate():format('yyyy')}", attributes, "2014");
-        verifyEquals("${date:toDate():toNumber():format('yyyy')}", attributes, "2014");
-        verifyEquals("${date:toDate():toNumber():toDate():toNumber():toDate():toNumber():format('yyyy')}", attributes, "2014");
-    }
-    
-    @Test
-    public void testSingleLetterAttribute() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("A", "0123456789");
-        
-        verifyEquals("${A}", attributes, "0123456789");
-        verifyEquals("${'A'}", attributes, "0123456789");
-    }
-
-    
-    @Test
-    public void testImplicitConversions() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("A", "0123456789");
-        attributes.put("b", "true");
-        attributes.put("c", "false");
-        attributes.put("d", "Quick Brown Fox");
-        attributes.put("F", "-48");
-        attributes.put("n", "2014/04/04 00:00:00");
-        
-        final Calendar cal = Calendar.getInstance();
-        cal.set(Calendar.YEAR, 2014);
-        cal.set(Calendar.MONTH, 3);
-        cal.set(Calendar.DAY_OF_MONTH, 4);
-        cal.set(Calendar.HOUR, 0);
-        cal.set(Calendar.MINUTE, 0);
-        cal.set(Calendar.SECOND, 45);
-        
-        final String dateString = cal.getTime().toString();
-        attributes.put("z", dateString);
-
-        
-        verifyEquals("${A:plus(4)}", attributes, 123456793L);
-        verifyEquals("${A:plus( ${F} )}", attributes, 123456741L);
-
-        verifyEquals("${F:lt( ${A} )}", attributes, true);
-        verifyEquals("${A:substring(2,3):plus(21):substring(1,2):plus(0)}", attributes, 3L);
-        verifyEquals("${n:format( 'yyyy' )}", attributes, "2014");
-        verifyEquals("${z:format( 'yyyy' )}", attributes, "2014");
-        
-        attributes.put("n", "2014/04/04 00:00:00.045");
-        verifyEquals("${n:format( 'yyyy' ):append(','):append( ${n:format( 'SSS' )} )}", attributes, "2014,045");
-    }
-    
-    @Test
-    public void testNewLinesAndTabsInQuery() {
-        final String query = "${ abc:equals('abc'):or( \n\t${xx:isNull()}\n) }";
-        assertEquals(ResultType.BOOLEAN, Query.getResultType(query));
-        Query.validateExpression(query, false);
-        assertEquals("true", Query.evaluateExpressions(query));
-    }
-    
-    @Test
-    public void testAttributeReferencesWithWhiteSpace() {
-        final Map<String, String> attrs = new HashMap<>();
-        attrs.put("a b c,d", "abc");
-        
-        final String query = "${ 'a b c,d':equals('abc') }";
-        verifyEquals(query, attrs, true);
-    }
-
-    @Test
-    public void testComments() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "xyz");
-
-        final String expression = 
-            "# hello, world\n" + 
-            "${# ref attr\n" +
-            "\t" +
-                "abc" +
-            "\t" +
-                "#end ref attr\n" +
-            "}";
-
-        Query query = Query.compile(expression);
-        QueryResult<?> result = query.evaluate(attributes);
-        assertEquals(ResultType.STRING, result.getResultType());
-        assertEquals("xyz", result.getValue());
-        
-        query = Query.compile("${abc:append('# hello') #good-bye \n}");
-        result = query.evaluate(attributes);
-        assertEquals(ResultType.STRING, result.getResultType());
-        assertEquals("xyz# hello", result.getValue());
-    }
-    
-    @Test
-    public void testAppendPrepend() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "XX");
-        attributes.put("YXXX", "bingo");
-        
-        verifyEquals("${${attr:append('X'):prepend('Y')}}", attributes, "bingo");
-    }
-    
-    @Test
-    public void testIsNull() {
-        final Map<String, String> attributes = new HashMap<>();
-        verifyEquals("${attr:isNull()}", attributes, true);
-    }
-    
-    @Test
-    public void testNotNull() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "");
-        
-        verifyEquals("${attr:notNull()}", attributes, true);
-    }
-    
-    @Test
-    public void testIsNullOrLengthEquals0() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "");
-        attributes.put("xyz", "xyz");
-        attributes.put("xx", "  ");
-        
-        verifyEquals("${abc:isNull():or( ${abc:length():equals(0)} )}", attributes, true);
-        verifyEquals("${xyz:isNull():or( ${xyz:length():equals(0)} )}", attributes, false);
-        verifyEquals("${none:isNull():or( ${none:length():equals(0)} )}", attributes, true);
-        verifyEquals("${xx:isNull():or( ${xx:trim():length():equals(0)} )}", attributes, true);
-    }
-    
-    @Test
-    public void testReplaceNull() {
-        final Map<String, String> attributes = new HashMap<>();
-        verifyEquals("${attr:replaceNull('hello')}", attributes, "hello");
-    }
-    
-    @Test
-    public void testReplace() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "hello");
-        verifyEquals("${attr:replace('hell', 'yell')}", attributes, "yello");
-    }
-
-    @Test
-    public void testReplaceAll() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "hello");
-        attributes.put("xyz", "00-00TEST.2014_01_01_000000_value");
-        
-        verifyEquals("${xyz:replaceAll(\"^([^.]+)\\.([0-9]{4})_([0-9]{2})_([0-9]{2}).*$\", \"$3\")}", attributes, "01");
-        verifyEquals("${attr:replaceAll('l+', 'r')}", attributes, "hero");
-        
-        attributes.clear();
-        attributes.put("filename1", "abc.gz");
-        attributes.put("filename2", "abc.g");
-        attributes.put("filename3", "abc.gz.gz");
-        attributes.put("filename4", "abc.gz.g");
-        attributes.put("abc", "hello world");
-
-        verifyEquals("${filename3:replaceAll('\\\\\\.gz$', '')}", attributes, "abc.gz.gz");
-        verifyEquals("${filename3:replaceAll('\\\\\\\\.gz$', '')}", attributes, "abc.gz.gz");
-        verifyEquals("${filename1:replaceAll('\\.gz$', '')}", attributes, "abc");
-        verifyEquals("${filename2:replaceAll('\\.gz$', '')}", attributes, "abc.g");
-        verifyEquals("${filename4:replaceAll('\\\\.gz$', '')}", attributes, "abc.gz.g");
-
-        verifyEquals("${abc:replaceAll( 'lo wor(ld)', '$0')}", attributes, "hello world");
-        verifyEquals("${abc:replaceAll( 'he(llo) world', '$1')}", attributes, "llo");
-        verifyEquals("${abc:replaceAll( 'xx', '$0')}", attributes, "hello world");
-        verifyEquals("${abc:replaceAll( '(xx)', '$1')}", attributes, "hello world");
-        verifyEquals("${abc:replaceAll( 'lo wor(ld)', '$1')}", attributes, "helld");
-        
-    }
-    
-    
-    @Test
-    public void testReplaceAllWithOddNumberOfBackslashPairs() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("filename", "C:\\temp\\.txt");
-
-        verifyEquals("${filename:replace('\\\\', '/')}", attributes, "C:/temp/.txt");
-        verifyEquals("${filename:replaceAll('\\\\\\\\', '/')}", attributes, "C:/temp/.txt");
-        verifyEquals("${filename:replaceAll('\\\\\\.txt$', '')}", attributes, "C:\\temp");
-    }
-    
-    @Test
-    public void testReplaceAllWithMatchingGroup() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "hello");
-        
-        verifyEquals("${attr:replaceAll('.*?(l+).*', '$1')}", attributes, "ll");
-    }
-    
-    @Test
-    public void testMathOperations() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("one", "1");
-        attributes.put("two", "2");
-        attributes.put("three", "3");
-        attributes.put("four", "4");
-        attributes.put("five", "5");
-        attributes.put("hundred", "100");
-
-        verifyEquals("${hundred:toNumber():multiply(2):divide(3):plus(1):mod(5)}", attributes, 2L);
-    }
-
-    @Test
-    public void testIndexOf() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("attr", "https://abc.go");
-        verifyEquals("${attr:indexOf('/')}", attributes, 6L);
-    }
-    
-    @Test
-    public void testDate() {
-        final Calendar now = Calendar.getInstance();
-        final int year = now.get(Calendar.YEAR);
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("entryDate", String.valueOf(now.getTimeInMillis()));
-        
-        verifyEquals("${entryDate:toNumber():toDate():format('yyyy')}", attributes, String.valueOf(year));
-        
-        attributes.clear();
-        attributes.put("month", "3");
-        attributes.put("day", "4");
-        attributes.put("year", "2013");
-        assertEquals("63", Query.evaluateExpressions("${year:append('/'):append(${month}):append('/'):append(${day}):toDate('yyyy/MM/dd'):format('D')}", attributes, null));
-        assertEquals("63", Query.evaluateExpressions("${year:append('/'):append('${month}'):append('/'):append('${day}'):toDate('yyyy/MM/dd'):format('D')}", attributes, null));
-
-        verifyEquals("${year:append('/'):append(${month}):append('/'):append(${day}):toDate('yyyy/MM/dd'):format('D')}", attributes, "63");
-    }
-    
-    @Test
-    public void testSystemProperty() {
-        System.setProperty("hello", "good-bye");
-        assertEquals("good-bye", Query.evaluateExpressions("${hello}"));
-        assertEquals("good-bye", Query.compile("${hello}").evaluate().getValue());
-    }
-    
-    @Test
-    public void testAnyAttribute() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "zzz");
-        attributes.put("xyz", "abc");
-        
-        verifyEquals("${anyAttribute('abc', 'xyz', 'missingAttr'):substring(1,2):equals('b')}", attributes, true);
-        verifyEquals("${anyAttribute('abc', 'xyz'):substring(1,2):equals('b')}", attributes, true);
-        verifyEquals("${anyAttribute('xyz', 'abc'):substring(1,2):equals('b')}", attributes, true);
-        verifyEquals("${anyAttribute('zz'):substring(1,2):equals('b')}", attributes, false);
-        verifyEquals("${anyAttribute('abc', 'zz'):isNull()}", attributes, true);
-    }
-    
-    @Test
-    public void testAnyMatchingAttribute() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "zzz");
-        attributes.put("xyz", "abc");
-        attributes.put("123.cba", "hello");
-        
-        verifyEquals("${anyMatchingAttribute('.{2}x', '.{2}z'):substring(1,2):equals('b')}", attributes, true);
-        verifyEquals("${anyMatchingAttribute('.*'):substring(1,2):equals('b')}", attributes, true);
-        verifyEquals("${anyMatchingAttribute('x{44}'):substring(1,2):equals('b')}", attributes, false);
-        verifyEquals("${anyMatchingAttribute('abc'):substring(1,2):equals('b')}", attributes, false);
-        verifyEquals("${anyMatchingAttribute('xyz'):substring(1,2):equals('b')}", attributes, true);
-        verifyEquals("${anyMatchingAttribute('xyz'):notNull()}", attributes, true);
-        verifyEquals("${anyMatchingAttribute('xyz'):isNull()}", attributes, false);
-        verifyEquals("${anyMatchingAttribute('xxxxxxxxx'):notNull()}", attributes, false);
-        verifyEquals("${anyMatchingAttribute('123\\.c.*'):matches('hello')}", attributes, true);
-        verifyEquals("${anyMatchingAttribute('123\\.c.*|a.c'):matches('zzz')}", attributes, true);
-    }
-    
-    
-    @Test
-    public void testAnyDelineatedValue() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "a,b,c");
-        attributes.put("xyz", "abc");
-        
-        final String query = "${anyDelineatedValue('${abc}', ','):equals('b')}";
-        assertEquals(ResultType.BOOLEAN, Query.getResultType(query));
-        
-        assertEquals("true", Query.evaluateExpressions(query, attributes, null));
-        assertEquals("true", Query.evaluateExpressions("${anyDelineatedValue('${abc}', ','):equals('a')}", attributes, null));
-        assertEquals("true", Query.evaluateExpressions("${anyDelineatedValue('${abc}', ','):equals('c')}", attributes, null));
-        assertEquals("false", Query.evaluateExpressions("${anyDelineatedValue('${abc}', ','):equals('d')}", attributes, null));
-        
-        verifyEquals("${anyDelineatedValue(${abc}, ','):equals('b')}", attributes, true);
-        verifyEquals("${anyDelineatedValue(${abc}, ','):equals('a')}", attributes, true);
-        verifyEquals("${anyDelineatedValue(${abc}, ','):equals('c')}", attributes, true);
-        verifyEquals("${anyDelineatedValue(${abc}, ','):equals('d')}", attributes, false);
-    }
-    
-    @Test
-    public void testAllDelineatedValues() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "a,b,c");
-        attributes.put("xyz", "abc");
-        
-        final String query = "${allDelineatedValues('${abc}', ','):matches('[abc]')}";
-        
-        assertEquals(ResultType.BOOLEAN, Query.getResultType(query));
-        assertEquals("true", Query.evaluateExpressions(query, attributes, null));
-        assertEquals("true", Query.evaluateExpressions(query, attributes, null));
-        assertEquals("false", Query.evaluateExpressions("${allDelineatedValues('${abc}', ','):matches('[abd]')}", attributes, null));
-        assertEquals("false", Query.evaluateExpressions("${allDelineatedValues('${abc}', ','):equals('a'):not()}", attributes, null));
-        
-        verifyEquals("${allDelineatedValues(${abc}, ','):matches('[abc]')}", attributes, true);
-        verifyEquals("${allDelineatedValues(${abc}, ','):matches('[abd]')}", attributes, false);
-        verifyEquals("${allDelineatedValues(${abc}, ','):equals('a'):not()}", attributes, false);
-    }
-    
-    
-    @Test
-    public void testAllAttributes() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "1234");
-        attributes.put("xyz", "4132");
-        attributes.put("hello", "world!");
-
-        verifyEquals("${allAttributes('abc', 'xyz'):matches('\\d+')}", attributes, true);
-        verifyEquals("${allAttributes('abc', 'xyz'):toNumber():lt(99999)}", attributes, true);
-        verifyEquals("${allAttributes('abc', 'hello'):length():gt(3)}", attributes, true);
-        verifyEquals("${allAttributes('abc', 'hello'):length():equals(4)}", attributes, false);
-        verifyEquals("${allAttributes('abc', 'xyz'):length():equals(4)}", attributes, true);
-        verifyEquals("${allAttributes('abc', 'xyz', 'other'):isNull()}", attributes, false);
-        
-        try {
-            Query.compile("${allAttributes('#ah'):equals('hello')");
-            Assert.fail("Was able to compile with allAttributes and an invalid attribute name");
-        } catch (final AttributeExpressionLanguageParsingException e) {
-            // expected behavior
-        }
-    }
-    
-    
-    @Test
-    public void testMathOperators() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "1234");
-        attributes.put("xyz", "4132");
-        attributes.put("hello", "world!");
-
-        verifyEquals("${xyz:toNumber():gt( ${abc:toNumber()} )}", attributes, true);
-    }
-    
-    @Test
-    public void testAllMatchingAttributes() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "1234");
-        attributes.put("xyz", "4132");
-        attributes.put("hello", "world!");
-        attributes.put("123.cba", "hell.o");
-
-        System.out.println( printTree(Query.compile("${allMatchingAttributes('(abc|xyz)'):matches('\\\\d+')}").getTree()) );
-        
-        verifyEquals("${'123.cba':matches('hell\\.o')}", attributes, true);
-        verifyEquals("${allMatchingAttributes('123\\.cba'):equals('hell.o')}", attributes, true);
-        verifyEquals("${allMatchingAttributes('(abc|xyz)'):matches('\\d+')}", attributes, true);
-        verifyEquals("${allMatchingAttributes('[ax].*'):toNumber():lt(99999)}", attributes, true);
-        verifyEquals("${allMatchingAttributes('hell.'):length():gt(3)}", attributes, true);
-        
-        verifyEquals("${allMatchingAttributes('123\\.cba'):equals('no')}", attributes, false);
-    }
-    
-    @Test
-    public void testMatches() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "1234xyz4321");
-        attributes.put("end", "xyz");
-        attributes.put("xyz", "4132");
-        attributes.put("hello", "world!");
-        attributes.put("dotted", "abc.xyz");
-
-        final String evaluated = Query.evaluateExpressions("${abc:matches('1234${end}4321')}", attributes, null);
-        assertEquals("true", evaluated);
-        
-        attributes.put("end", "888");
-        final String secondEvaluation = Query.evaluateExpressions("${abc:matches('1234${end}4321')}", attributes, null);
-        assertEquals("false", secondEvaluation);
-        
-        verifyEquals("${dotted:matches('abc\\.xyz')}", attributes, true);
-   }
-    
-    
-    @Test
-    public void testFind() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "1234xyz4321");
-        attributes.put("end", "xyz");
-        attributes.put("xyz", "4132");
-        attributes.put("hello", "world!");
-        attributes.put("dotted", "abc.xyz");
-
-        final String evaluated = Query.evaluateExpressions("${abc:find('1234${end}4321')}", attributes, null);
-        assertEquals("true", evaluated);
-        
-        attributes.put("end", "888");
-        final String secondEvaluation = Query.evaluateExpressions("${abc:find('${end}4321')}", attributes, null);
-        assertEquals("false", secondEvaluation);
-        
-        verifyEquals("${dotted:find('\\.')}", attributes, true);
-   }
-    
-    @Test
-    public void testSubstringAfter() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("filename", "file-255");
-        
-        verifyEquals("${filename:substringAfter('')}", attributes, "file-255");
-        verifyEquals("${filename:substringAfterLast('')}", attributes, "file-255");
-        verifyEquals("${filename:substringBefore('')}", attributes, "file-255");
-        verifyEquals("${filename:substringBeforeLast('')}", attributes, "file-255");
-        verifyEquals("${filename:substringBefore('file')}", attributes, "");
-        
-        attributes.put("uri", "sftp://some.uri");
-        verifyEquals("${uri:substringAfter('sftp')}", attributes, "://some.uri");
-    }
-    
-    @Test
-    public void testSubstringAfterLast() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("filename", "file-file-255");
-        
-        verifyEquals("${filename:substringAfterLast('file-')}", attributes, "255");
-        verifyEquals("${filename:substringAfterLast('5')}", attributes, "");
-        verifyEquals("${filename:substringAfterLast('x')}", attributes, "file-file-255");
-    }
-    
-    @Test
-    public void testSubstringBefore() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("something", "some {} or other");
-        
-        verifyEquals("${something:substringBefore('}')}", attributes, "some {");
-    }
-    
-    @Test
-    public void testSubstring() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("filename", "file-255");
-        
-        verifyEquals("${filename:substring(1, 2)}", attributes, "i");
-        verifyEquals("${filename:substring(4)}", attributes, "-255");
-    }
-    
-    @Test
-    public void testToRadix() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("filename", "file-255");
-        attributes.put("filename2", "file-99999");
-
-
-        verifyEquals("${filename:substringAfter('-'):toNumber():toRadix(16):toUpper()}", attributes, "FF");
-        verifyEquals("${filename:substringAfter('-'):toNumber():toRadix(16, 4):toUpper()}", attributes, "00FF");
-        verifyEquals("${filename:substringAfter('-'):toNumber():toRadix(36, 3):toUpper()}", attributes, "073");
-    }
-    
-    @Test
-    public void testDateFormatConversion() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("blue", "20130917162643");
-        verifyEquals("${blue:toDate('yyyyMMddHHmmss'):format(\"yyyy/MM/dd HH:mm:ss.SSS'Z'\")}", attributes, "2013/09/17 16:26:43.000Z");
-    }
-
-    
-    @Test
-    public void testNot() {
-        verifyEquals("${ab:notNull():not()}", new HashMap<String, String>(), true);
-    }
-    
-    @Test
-    public void testAttributesWithSpaces() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("ab", "abc");
-        attributes.put("a  b", "abc");
-        
-        verifyEquals("${ab}", attributes, "abc");
-        verifyEquals("${'a  b'}", attributes, "abc");
-        verifyEquals("${'a b':replaceNull('')}", attributes, "");
-    }
-    
-    @Test
-    public void testOr() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("filename1", "xabc");
-        attributes.put("filename2", "yabc");
-        attributes.put("filename3", "abcxy");
-
-        verifyEquals("${filename1:startsWith('x'):or(true)}", attributes, true);
-        verifyEquals("${filename1:startsWith('x'):or( ${filename1:startsWith('y')} )}", attributes, true);
-        verifyEquals("${filename2:startsWith('x'):or( ${filename2:startsWith('y')} )}", attributes, true);
-        verifyEquals("${filename3:startsWith('x'):or( ${filename3:startsWith('y')} )}", attributes, false);
-        verifyEquals("${filename1:startsWith('x'):or( ${filename2:startsWith('y')} )}", attributes, true);
-        verifyEquals("${filename2:startsWith('x'):or( ${filename1:startsWith('y')} )}", attributes, false);
-    }
-    
-    @Test
-    public void testAnd() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("filename1", "xabc");
-        attributes.put("filename2", "yabc");
-        attributes.put("filename 3", "abcxy");
-
-        verifyEquals("${filename1:startsWith('x'):and(true)}", attributes, true);
-        verifyEquals("${filename1:startsWith('x') : and( false )}", attributes, false);
-        verifyEquals("${filename1:startsWith('x'):and( ${filename1:startsWith('y')} )}", attributes, false);
-        verifyEquals("${filename2:startsWith('x'):and( ${filename2:startsWith('y')} )}", attributes, false);
-        verifyEquals("${filename3:startsWith('x'):and( ${filename3:startsWith('y')} )}", attributes, false);
-        verifyEquals("${filename1:startsWith('x'):and( ${filename2:startsWith('y')} )}", attributes, true);
-        verifyEquals("${filename2:startsWith('x'):and( ${filename1:startsWith('y')} )}", attributes, false);
-        verifyEquals("${filename1:startsWith('x'):and( ${'filename 3':endsWith('y')} )}", attributes, true);
-    }
-    
-    @Test
-    public void testAndOrNot() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("filename1", "xabc");
-        attributes.put("filename2", "yabc");
-        attributes.put("filename 3", "abcxy");
-
-        final String query = 
-            "${" +
-            "     'non-existing':notNull():not():and(" +                                        // true AND (
-            "     ${filename1:startsWith('y')" +                                                    // false
-            "     :or(" +                                                                           // or
-            "       ${ filename1:startsWith('x'):and(false) }" +                                    // false
-            "     ):or(" +                                                                          // or
-            "       ${ filename2:endsWith('xxxx'):or( ${'filename 3':length():gt(1)} ) }" +         // true )
-            "     )}" +
-            "     )" +
-            "}";
-        
-        System.out.println(query);
-        verifyEquals(query, attributes, true);
-    }
-    
-    @Test
-    public void testAndOrLogicWithAnyAll() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("filename1", "xabc");
-        attributes.put("filename2", "yabc");
-        attributes.put("filename 3", "abcxy");
-        
-        verifyEquals("${anyMatchingAttribute('filename.*'):contains('abc'):and( ${filename2:equals('yabc')} )}", attributes, true);
-        verifyEquals("${anyMatchingAttribute('filename.*'):contains('abc'):and( ${filename2:equals('xabc')} )}", attributes, false);
-        verifyEquals("${anyMatchingAttribute('filename.*'):contains('abc'):not():or( ${filename2:equals('yabc')} )}", attributes, true);
-        verifyEquals("${anyMatchingAttribute('filename.*'):contains('abc'):not():or( ${filename2:equals('xabc')} )}", attributes, false);
-    }
-    
-    @Test
-    public void testKeywords() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("UUID", "123");
-        verifyEquals("${ 'UUID':toNumber():equals(123) }", attributes, true);
-    }
-    
-    @Test
-    public void testEqualsNumber() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("abc", "123");
-        verifyEquals("${ abc:toNumber():equals(123) }", attributes, true);
-    }
-    
-    @Test
-    public void testSubjectAsEmbeddedExpressionWithSurroundChars() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("b", "x");
-        attributes.put("abcxcba", "hello");
-        
-        final String evaluated = Query.evaluateExpressions("${ 'abc${b}cba':substring(0, 1) }", attributes, null);
-        assertEquals("h", evaluated);
-    }
-    
-    @Test
-    public void testToNumberFunctionReturnsNumberType() {
-        assertEquals(ResultType.NUMBER, Query.getResultType("${header.size:toNumber()}"));
-    }
-    
-    @Test
-    public void testAnyAttributeEmbedded() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("a1", "test1");
-        attributes.put("b2", "2test");
-        attributes.put("c3", "3test3");
-        
-        final String query = "${a1:equals('test1'):and( ${anyAttribute('a1','b2','c3'):contains('2')})}";
-        verifyEquals(query, attributes, true);
-    }
-    
-    private void verifyEquals(final String expression, final Map<String, String> attributes, final Object expectedResult) {
-        Query.validateExpression(expression, false);
-        assertEquals(String.valueOf(expectedResult), Query.evaluateExpressions(expression, attributes, null));
-        
-        Query query = Query.compile(expression);
-        QueryResult<?> result = query.evaluate(attributes);
-        
-        if ( expectedResult instanceof Number ) {
-            assertEquals(ResultType.NUMBER, result.getResultType());
-        } else if ( expectedResult instanceof Boolean ) {
-            assertEquals(ResultType.BOOLEAN, result.getResultType());
-        } else {
-            assertEquals(ResultType.STRING, result.getResultType());
-        }
-        
-        assertEquals(expectedResult, result.getValue());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
----------------------------------------------------------------------
diff --git a/nifi/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java b/nifi/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
deleted file mode 100644
index 398a23b..0000000
--- a/nifi/commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.attribute.expression.language;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class TestStandardPreparedQuery {
-
-    @Test
-    public void testSimpleReference() {
-        final Map<String, String> attrs = new HashMap<>();
-        attrs.put("xx", "world");
-        
-        assertEquals("world", evaluate("${xx}", attrs));
-        assertEquals("hello, world!", evaluate("hello, ${xx}!", attrs));
-    }
-    
-    @Test
-    public void testEmbeddedReference() {
-        final Map<String, String> attrs = new HashMap<>();
-        attrs.put("xx", "yy");
-        attrs.put("yy", "world");
-        
-        assertEquals("world", evaluate("${${xx}}", attrs));
-    }
-    
-    @Test
-    public void test10MIterations() {
-        final Map<String, String> attrs = new HashMap<>();
-        attrs.put("xx", "world");
-        
-        final StandardPreparedQuery prepared = (StandardPreparedQuery) Query.prepare("${xx}");
-        final long start = System.nanoTime();
-        for (int i=0; i < 10000000; i++) {
-            assertEquals( "world", prepared.evaluateExpressions(attrs, null) );
-        }
-        final long nanos = System.nanoTime() - start;
-        System.out.println(TimeUnit.NANOSECONDS.toMillis(nanos));
-    }
-    
-    @Test
-    @Ignore("Takes too long")
-    public void test10MIterationsWithQuery() {
-        final Map<String, String> attrs = new HashMap<>();
-        attrs.put("xx", "world");
-
-        final long start = System.nanoTime();
-        for (int i=0; i < 10000000; i++) {
-            assertEquals( "world", Query.evaluateExpressions("${xx}", attrs) );
-        }
-        final long nanos = System.nanoTime() - start;
-        System.out.println(TimeUnit.NANOSECONDS.toMillis(nanos));
-
-    }
-    
-    @Test
-    public void testSeveralSequentialExpressions() {
-        final Map<String, String> attributes = new HashMap<>();
-        attributes.put("audience", "World");
-        attributes.put("comma", ",");
-        attributes.put("question", " how are you?");
-        assertEquals("Hello, World, how are you?!", evaluate("Hello, ${audience}${comma}${question}!", attributes));
-
-    }
-    
-    private String evaluate(final String query, final Map<String, String> attrs) {
-        final String evaluated = ((StandardPreparedQuery) Query.prepare(query)).evaluateExpressions(attrs, null);
-        return evaluated;
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-logging-utils/pom.xml
----------------------------------------------------------------------
diff --git a/nifi/commons/nifi-logging-utils/pom.xml b/nifi/commons/nifi-logging-utils/pom.xml
deleted file mode 100644
index febcceb..0000000
--- a/nifi/commons/nifi-logging-utils/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-      http://www.apache.org/licenses/LICENSE-2.0
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-commons-parent</artifactId>
-        <version>0.0.1-incubating-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>nifi-logging-utils</artifactId>
-    <version>0.0.1-incubating-SNAPSHOT</version>
-    <name>NiFi Logging Utils</name>
-    <description>Utilities for logging</description>
-    
-    <dependencies>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-        </dependency>
-    </dependencies>
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-logging-utils/src/main/java/org/apache/nifi/logging/NiFiLog.java
----------------------------------------------------------------------
diff --git a/nifi/commons/nifi-logging-utils/src/main/java/org/apache/nifi/logging/NiFiLog.java b/nifi/commons/nifi-logging-utils/src/main/java/org/apache/nifi/logging/NiFiLog.java
deleted file mode 100644
index 7c71d85..0000000
--- a/nifi/commons/nifi-logging-utils/src/main/java/org/apache/nifi/logging/NiFiLog.java
+++ /dev/null
@@ -1,367 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.nifi.logging;
-
-import org.slf4j.Logger;
-import org.slf4j.Marker;
-
-/**
- *
- * @author unattributed
- */
-public class NiFiLog implements Logger {
-
-    private final Logger logger;
-
-    public NiFiLog(final Logger logger) {
-        this.logger = logger;
-    }
-
-    public Logger getWrappedLog() {
-        return logger;
-    }
-
-    @Override
-    public void warn(Marker marker, String string, Throwable thrwbl) {
-        if (logger.isDebugEnabled()) {
-            logger.warn(marker, string, thrwbl);
-        } else {
-            logger.warn(marker, string);
-        }
-    }
-
-    @Override
-    public void warn(Marker marker, String string, Object[] os) {
-        logger.warn(marker, string, os);
-    }
-
-    @Override
-    public void warn(Marker marker, String string, Object o, Object o1) {
-        logger.warn(marker, string, o, o1);
-    }
-
-    @Override
-    public void warn(Marker marker, String string, Object o) {
-        logger.warn(marker, string, o);
-    }
-
-    @Override
-    public void warn(Marker marker, String string) {
-        logger.warn(marker, string);
-    }
-
-    @Override
-    public void warn(String string, Throwable thrwbl) {
-        if (logger.isDebugEnabled()) {
-            logger.warn(string, thrwbl);
-        } else {
-            logger.warn(string);
-        }
-    }
-
-    @Override
-    public void warn(String string, Object o, Object o1) {
-        logger.warn(string, o, o1);
-    }
-
-    @Override
-    public void warn(String string, Object[] os) {
-        logger.warn(string, os);
-    }
-
-    @Override
-    public void warn(String string, Object o) {
-        logger.warn(string, o);
-    }
-
-    @Override
-    public void warn(String string) {
-        logger.warn(string);
-    }
-
-    @Override
-    public void trace(Marker marker, String string, Throwable thrwbl) {
-        logger.trace(marker, string, thrwbl);
-    }
-
-    @Override
-    public void trace(Marker marker, String string, Object[] os) {
-        logger.trace(marker, string, os);
-    }
-
-    @Override
-    public void trace(Marker marker, String string, Object o, Object o1) {
-        logger.trace(marker, string, o, o1);
-    }
-
-    @Override
-    public void trace(Marker marker, String string, Object o) {
-        logger.trace(marker, string, o);
-    }
-
-    @Override
-    public void trace(Marker marker, String string) {
-        logger.trace(marker, string);
-    }
-
-    @Override
-    public void trace(String string, Throwable thrwbl) {
-        logger.trace(string, thrwbl);
-    }
-
-    @Override
-    public void trace(String string, Object[] os) {
-        logger.trace(string, os);
-    }
-
-    @Override
-    public void trace(String string, Object o, Object o1) {
-        logger.trace(string, o, o1);
-    }
-
-    @Override
-    public void trace(String string, Object o) {
-        logger.trace(string, o);
-    }
-
-    @Override
-    public void trace(String string) {
-        logger.trace(string);
-    }
-
-    @Override
-    public boolean isWarnEnabled(Marker marker) {
-        return logger.isWarnEnabled(marker);
-    }
-
-    @Override
-    public boolean isWarnEnabled() {
-        return logger.isWarnEnabled();
-    }
-
-    @Override
-    public boolean isTraceEnabled(Marker marker) {
-        return logger.isTraceEnabled(marker);
-    }
-
-    @Override
-    public boolean isTraceEnabled() {
-        return logger.isTraceEnabled();
-    }
-
-    @Override
-    public boolean isInfoEnabled(Marker marker) {
-        return logger.isInfoEnabled(marker);
-    }
-
-    @Override
-    public boolean isInfoEnabled() {
-        return logger.isInfoEnabled();
-    }
-
-    @Override
-    public boolean isErrorEnabled(Marker marker) {
-        return logger.isErrorEnabled(marker);
-    }
-
-    @Override
-    public boolean isErrorEnabled() {
-        return logger.isErrorEnabled();
-    }
-
-    @Override
-    public boolean isDebugEnabled(Marker marker) {
-        return logger.isDebugEnabled(marker);
-    }
-
-    @Override
-    public boolean isDebugEnabled() {
-        return logger.isDebugEnabled();
-    }
-
-    @Override
-    public void info(Marker marker, String string, Throwable thrwbl) {
-        if (logger.isDebugEnabled()) {
-            logger.info(marker, string, thrwbl);
-        } else {
-            logger.info(marker, string);
-        }
-    }
-
-    @Override
-    public void info(Marker marker, String string, Object[] os) {
-        logger.info(marker, string, os);
-    }
-
-    @Override
-    public void info(Marker marker, String string, Object o, Object o1) {
-        logger.info(marker, string, o, o1);
-    }
-
-    @Override
-    public void info(Marker marker, String string, Object o) {
-        logger.info(marker, string, o);
-    }
-
-    @Override
-    public void info(Marker marker, String string) {
-        logger.info(marker, string);
-    }
-
-    @Override
-    public void info(String string, Throwable thrwbl) {
-        if (logger.isDebugEnabled()) {
-            logger.info(string, thrwbl);
-        } else {
-            logger.info(string);
-        }
-    }
-
-    @Override
-    public void info(String string, Object[] os) {
-        logger.info(string, os);
-    }
-
-    @Override
-    public void info(String string, Object o, Object o1) {
-        logger.info(string, o, o1);
-    }
-
-    @Override
-    public void info(String string, Object o) {
-        logger.info(string, o);
-    }
-
-    @Override
-    public void info(String string) {
-        logger.info(string);
-    }
-
-    @Override
-    public String getName() {
-        return logger.getName();
-    }
-
-    @Override
-    public void error(Marker marker, String string, Throwable thrwbl) {
-        if (logger.isDebugEnabled()) {
-            logger.error(marker, string, thrwbl);
-        } else {
-            logger.error(marker, string);
-        }
-    }
-
-    @Override
-    public void error(Marker marker, String string, Object[] os) {
-        logger.error(marker, string, os);
-    }
-
-    @Override
-    public void error(Marker marker, String string, Object o, Object o1) {
-        logger.error(marker, string, o, o1);
-    }
-
-    @Override
-    public void error(Marker marker, String string, Object o) {
-        logger.error(marker, string, o);
-    }
-
-    @Override
-    public void error(Marker marker, String string) {
-        logger.error(marker, string);
-    }
-
-    @Override
-    public void error(String string, Throwable thrwbl) {
-        if (logger.isDebugEnabled()) {
-            logger.error(string, thrwbl);
-        } else {
-            logger.error(string);
-        }
-    }
-
-    @Override
-    public void error(String string, Object[] os) {
-        logger.error(string, os);
-    }
-
-    @Override
-    public void error(String string, Object o, Object o1) {
-        logger.error(string, o, o1);
-    }
-
-    @Override
-    public void error(String string, Object o) {
-        logger.error(string, o);
-    }
-
-    @Override
-    public void error(String string) {
-        logger.error(string);
-    }
-
-    @Override
-    public void debug(Marker marker, String string, Throwable thrwbl) {
-        logger.debug(marker, string, thrwbl);
-    }
-
-    @Override
-    public void debug(Marker marker, String string, Object[] os) {
-        logger.debug(marker, string, os);
-    }
-
-    @Override
-    public void debug(Marker marker, String string, Object o, Object o1) {
-        logger.debug(marker, string, o, o1);
-    }
-
-    @Override
-    public void debug(Marker marker, String string, Object o) {
-        logger.debug(marker, string, o);
-    }
-
-    @Override
-    public void debug(Marker marker, String string) {
-        logger.debug(marker, string);
-    }
-
-    @Override
-    public void debug(String string, Throwable thrwbl) {
-        logger.debug(string, thrwbl);
-    }
-
-    @Override
-    public void debug(String string, Object[] os) {
-        logger.debug(string, os);
-    }
-
-    @Override
-    public void debug(String string, Object o, Object o1) {
-        logger.debug(string, o, o1);
-    }
-
-    @Override
-    public void debug(String string, Object o) {
-        logger.debug(string, o);
-    }
-
-    @Override
-    public void debug(String string) {
-        logger.debug(string);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-properties/.gitignore
----------------------------------------------------------------------
diff --git a/nifi/commons/nifi-properties/.gitignore b/nifi/commons/nifi-properties/.gitignore
deleted file mode 100755
index 073c9fa..0000000
--- a/nifi/commons/nifi-properties/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target
-/target
-/target

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/f6d9354b/nifi/commons/nifi-properties/pom.xml
----------------------------------------------------------------------
diff --git a/nifi/commons/nifi-properties/pom.xml b/nifi/commons/nifi-properties/pom.xml
deleted file mode 100644
index 9d608a7..0000000
--- a/nifi/commons/nifi-properties/pom.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-      http://www.apache.org/licenses/LICENSE-2.0
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.nifi</groupId>
-        <artifactId>nifi-commons-parent</artifactId>
-        <version>0.0.1-incubating-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>nifi-properties</artifactId>
-    <version>0.0.1-incubating-SNAPSHOT</version>
-    <name>NiFi Properties</name>
-
-</project>