You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/01/14 17:41:39 UTC

[1/3] camel git commit: CAMEL-4725: Batch support and other options for Producer.

Repository: camel
Updated Branches:
  refs/heads/master f5116063b -> df5944fad


http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj
index ac138ad..617d24a 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj
@@ -66,14 +66,15 @@ InputParameter InputParameter() :
 {
      String sqlTypeAsStr;
      String name;
-     String valueSrcAsStr;
+     Token valueSrcToken;
 }
 {
-    (sqlTypeAsStr = ParameterSqlType() " " valueSrcAsStr =
+    (sqlTypeAsStr = ParameterSqlType() " " valueSrcToken =
     InputParameterSrc())
     {
         int sqlType = ParseHelper.parseSqlType(sqlTypeAsStr);
-        return new InputParameter(createNextParameterName(),sqlType,valueSrcAsStr,ParseHelper.sqlTypeToJavaType(sqlType,sqlTypeAsStr));
+        return new InputParameter(createNextParameterName(),sqlType,valueSrcToken,ParseHelper.sqlTypeToJavaType(sqlType,
+        sqlTypeAsStr));
     }
 }
 
@@ -112,26 +113,20 @@ String OutHeader():
         return token.toString();
     }
 }
-
-String InputParameterSrc():
+Token InputParameterSrc():
 {
-    String ret;
+    Token ret = null;
 }
 {
-    (ret = SimpleExpression())
+    (ret = <SIMPLE_EXP_TOKEN>)
     {
         return ret;
     }
-}
+    |
 
-String SimpleExpression() :
-{
- Token t = null;
-}
-{
-    (t = <SIMPLE_EXP_TOKEN>)
+    (ret = <PARAMETER_POS_TOKEN>)
     {
-    return t.toString();
+            return ret;
     }
 }
 
@@ -143,12 +138,20 @@ TOKEN: {
     <#LETTER: (["a"-"z","A"-"Z"])>
 }
 
+TOKEN: {
+    <#SPECIAL: (["#","_","-","'",".","$","{","}","\""])>
+}
+
+TOKEN : {
+    <SIMPLE_EXP_TOKEN: "${"(<LETTER>|<DIGIT> | <SPECIAL> | " ")+ "}">
+}
+
 TOKEN : {
-    <SIMPLE_EXP_TOKEN: "${"(<LETTER>|<DIGIT> | " " | "'" | "." )* "}">
+    <PARAMETER_POS_TOKEN: ":#"(<LETTER>|<DIGIT>|<SPECIAL> )+>
 }
 
 
 TOKEN : {
-    <IDENTIFIER: <LETTER>( <LETTER> | <DIGIT> | ".") *>
+    <IDENTIFIER: ( <LETTER> | <DIGIT> | <SPECIAL> )+ >
 }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java
new file mode 100644
index 0000000..33a95d5
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java
@@ -0,0 +1,99 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import java.sql.SQLException;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.sql.stored.template.TemplateParser;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+public class CallableStatementWrapperTest extends CamelTestSupport {
+
+    private TemplateParser templateParser;
+    private EmbeddedDatabase db;
+    private JdbcTemplate jdbcTemplate;
+    private CallableStatementWrapperFactory factory;
+
+    @Before
+    public void setUp() throws Exception {
+        db = new EmbeddedDatabaseBuilder()
+                .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build();
+        jdbcTemplate = new JdbcTemplate(db);
+        templateParser = new TemplateParser();
+        this.factory = new CallableStatementWrapperFactory(jdbcTemplate, templateParser);
+        super.setUp();
+    }
+
+
+    @Test
+    public void shouldExecuteStoredProcedure() throws Exception {
+
+        CallableStatementWrapper wrapper = new CallableStatementWrapper("SUBNUMBERS"
+                + "(INTEGER ${header.v1},INTEGER ${header.v2},OUT INTEGER resultofsub)", factory);
+
+        final Exchange exchange = createExchangeWithBody(null);
+        exchange.getIn().setHeader("v1", 1);
+        exchange.getIn().setHeader("v2", 2);
+
+        wrapper.call(new WrapperExecuteCallback() {
+            @Override
+            public void execute(StamentWrapper stamentWrapper) throws SQLException, DataAccessException {
+                stamentWrapper.populateStatement(null, exchange);
+
+                Map resultOfQuery = (Map) stamentWrapper.executeStatement();
+                Assert.assertEquals(Integer.valueOf(-1), ((Map) resultOfQuery).get("resultofsub"));
+            }
+        });
+    }
+
+    @Test
+    public void shouldExecuteNilacidProcedure() throws Exception {
+        CallableStatementWrapper wrapper = new CallableStatementWrapper("NILADIC()", factory);
+
+
+        wrapper.call(new WrapperExecuteCallback() {
+            @Override
+            public void execute(StamentWrapper stamentWrapper) throws SQLException, DataAccessException {
+
+                stamentWrapper.populateStatement(null, null);
+                Map result = (Map) stamentWrapper.executeStatement();
+                //no output parameter in stored procedure NILADIC()
+                //Spring sets #update-count-1
+                assertNotNull(result.get("#update-count-1"));
+
+            }
+        });
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        super.tearDown();
+        db.shutdown();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java
index 36ccc76..ffd92fb 100644
--- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java
@@ -18,9 +18,11 @@ package org.apache.camel.component.sql.stored;
 
 import java.math.BigInteger;
 import java.sql.Types;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.camel.Exchange;
-import org.apache.camel.component.sql.stored.template.TemplateStoredProcedureFactory;
+import org.apache.camel.component.sql.stored.template.TemplateParser;
 import org.apache.camel.component.sql.stored.template.ast.InputParameter;
 import org.apache.camel.component.sql.stored.template.ast.OutParameter;
 import org.apache.camel.component.sql.stored.template.ast.ParseRuntimeException;
@@ -31,7 +33,7 @@ import org.junit.Test;
 
 public class ParserTest extends CamelTestSupport {
 
-    TemplateStoredProcedureFactory parser = new TemplateStoredProcedureFactory(null);
+    TemplateParser parser = new TemplateParser();
 
     @Test
     public void shouldParseOk() {
@@ -39,29 +41,29 @@ public class ParserTest extends CamelTestSupport {
                 + "VARCHAR ${property.property1},BIGINT ${header.header2},OUT INTEGER header1)");
 
         Assert.assertEquals("addnumbers", template.getProcedureName());
-        Assert.assertEquals(3, template.getInputParameterList().size());
+        Assert.assertEquals(4, template.getParameterList().size());
 
         Exchange exchange = createExchangeWithBody(null);
         exchange.getIn().setHeader("header1", 1);
         exchange.setProperty("property1", "constant string");
         exchange.getIn().setHeader("header2", BigInteger.valueOf(2));
 
-        InputParameter param1 = template.getInputParameterList().get(0);
+        InputParameter param1 = (InputParameter) template.getParameterList().get(0);
         Assert.assertEquals("_0", param1.getName());
         Assert.assertEquals(Types.INTEGER, param1.getSqlType());
-        Assert.assertEquals(Integer.valueOf(1), param1.getValueExpression().evaluate(exchange, Integer.class));
+        Assert.assertEquals(Integer.valueOf(1), param1.getValueExtractor().eval(exchange, null));
 
-        InputParameter param2 = template.getInputParameterList().get(1);
+        InputParameter param2 = (InputParameter) template.getParameterList().get(1);
         Assert.assertEquals("_1", param2.getName());
         Assert.assertEquals(Types.VARCHAR, param2.getSqlType());
-        Assert.assertEquals("constant string", param2.getValueExpression().evaluate(exchange, String.class));
+        Assert.assertEquals("constant string", param2.getValueExtractor().eval(exchange, null));
 
-        InputParameter param3 = template.getInputParameterList().get(2);
+        InputParameter param3 = (InputParameter) template.getParameterList().get(2);
         Assert.assertEquals("_2", param3.getName());
         Assert.assertEquals(Types.BIGINT, param3.getSqlType());
-        Assert.assertEquals(BigInteger.valueOf(2), param3.getValueExpression().evaluate(exchange, BigInteger.class));
+        Assert.assertEquals(2L, param3.getValueExtractor().eval(exchange, null));
 
-        OutParameter sptpOutputNode = template.getOutParameterList().get(0);
+        OutParameter sptpOutputNode = (OutParameter) template.getParameterList().get(3);
         Assert.assertEquals("_3", sptpOutputNode.getName());
         Assert.assertEquals(Types.INTEGER, sptpOutputNode.getSqlType());
         Assert.assertEquals("header1", sptpOutputNode.getOutHeader());
@@ -80,6 +82,23 @@ public class ParserTest extends CamelTestSupport {
                 + "(XML VALUE1 ${header.v1},OUT INTEGER VALUE2 ${header.v2})");
     }
 
+    @Test
+    public void nestedSimpleExpression() {
+        Exchange exchange = createExchangeWithBody(1);
+        exchange.getIn().setHeader("body", "body");
+        Template template = parser.parseTemplate("ADDNUMBERS2(INTEGER ${${header.body}})");
+        assertEquals(1, ((InputParameter) template.getParameterList().get(0)).getValueExtractor().eval(exchange, null));
+    }
+
+    @Test
+    public void nableIssueSyntax() {
+        Map params = new HashMap<>();
+        params.put("P_STR_IN", "a");
+        Template template = parser.parseTemplate("IBS.\"Z$IMS_INTERFACE_WS\".TEST_STR(VARCHAR :#P_STR_IN,OUT VARCHAR P_STR_OUT)");
+        assertEquals("a", ((InputParameter) template.getParameterList().get(0)).getValueExtractor().eval(null, params));
+        assertEquals("IBS.\"Z$IMS_INTERFACE_WS\".TEST_STR", template.getProcedureName());
+    }
+
     @Test(expected = ParseRuntimeException.class)
     public void unmappedTypeShouldFaild() {
         parser.parseTemplate("ADDNUMBERS2"

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java
new file mode 100644
index 0000000..8a36c5e
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java
@@ -0,0 +1,95 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+public class ProducerBatchTest extends CamelTestSupport {
+
+    private EmbeddedDatabase db;
+
+    @Before
+    public void setUp() throws Exception {
+        db = new EmbeddedDatabaseBuilder()
+                .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build();
+        super.setUp();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        super.tearDown();
+        db.shutdown();
+    }
+
+    @Test
+    public void shouldExecuteBatch() throws InterruptedException {
+        MockEndpoint mock = getMockEndpoint("mock:query");
+        mock.expectedMessageCount(1);
+
+
+        List<Map> batchParams = new ArrayList<>();
+
+        Map<String, Object> batch1 = new HashMap<>();
+        batchParams.add(batch1);
+
+        batch1.put("num", "1");
+
+
+        Map<String, Object> batch2 = new HashMap<>();
+
+        batch2.put("num", "3");
+        batchParams.add(batch2);
+
+        final long batchfnCallsBefore = TestStoredProcedure.BATCHFN_CALL_COUNTER.get();
+
+        template.requestBody("direct:query", batchParams);
+
+        assertMockEndpointsSatisfied();
+
+        Exchange exchange = mock.getExchanges().get(0);
+
+        assertNotNull(exchange.getIn().getHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT));
+        assertEquals(batchfnCallsBefore + 2, TestStoredProcedure.BATCHFN_CALL_COUNTER.get());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // required for the sql component
+                getContext().getComponent("sql-stored", SqlStoredComponent.class).setDataSource(db);
+
+                from("direct:query").to("sql-stored:BATCHFN(INTEGER :#num)?batch=true").to("mock:query");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java
index 19a8089..1e8bc35 100644
--- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java
@@ -62,7 +62,8 @@ public class ProducerTest extends CamelTestSupport {
 
         Exchange exchange = mock.getExchanges().get(0);
 
-        assertEquals(Integer.valueOf(3), exchange.getIn().getHeader("resultofsum"));
+        assertEquals(Integer.valueOf(-1), exchange.getIn().getBody(Map.class).get("resultofsub"));
+        assertNotNull(exchange.getIn().getHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT));
     }
 
     @Override
@@ -73,8 +74,8 @@ public class ProducerTest extends CamelTestSupport {
                 // required for the sql component
                 getContext().getComponent("sql-stored", SqlStoredComponent.class).setDataSource(db);
 
-                from("direct:query").to("sql-stored:ADDNUMBERS(INTEGER ${headers.num1},INTEGER ${headers"
-                        + ".num2},OUT INTEGER resultofsum)").to("mock:query");
+                from("direct:query").to("sql-stored:SUBNUMBERS(INTEGER ${headers.num1},INTEGER ${headers"
+                        + ".num2},OUT INTEGER resultofsub)").to("mock:query");
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java
new file mode 100644
index 0000000..6a10010
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java
@@ -0,0 +1,85 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.sql.SqlConstants;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+
+public class ProducerUseMessageBodyForTemplateTest extends CamelTestSupport {
+
+    private EmbeddedDatabase db;
+
+    @Before
+    public void setUp() throws Exception {
+        db = new EmbeddedDatabaseBuilder()
+                .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build();
+        super.setUp();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        super.tearDown();
+        db.shutdown();
+    }
+
+    @Test
+    public void shouldUseMessageBodyAsQuery() throws InterruptedException {
+        MockEndpoint mock = getMockEndpoint("mock:query");
+        mock.expectedMessageCount(1);
+
+
+        Map<String, Object> batch1 = new HashMap<>();
+        batch1.put("num1", 3);
+        batch1.put("num2", 1);
+
+
+        template.requestBodyAndHeader("direct:query", "SUBNUMBERS(INTEGER :#num1,INTEGER :#num2,OUT INTEGER resultofsum)", SqlStoredConstants.SQL_STORED_PARAMETERS, batch1);
+
+        assertMockEndpointsSatisfied();
+
+        Exchange exchange = mock.getExchanges().get(0);
+
+
+        assertEquals(Integer.valueOf(2), exchange.getIn().getBody(Map.class).get("resultofsum"));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // required for the sql component
+                getContext().getComponent("sql-stored", SqlStoredComponent.class).setDataSource(db);
+
+                from("direct:query").to("sql-stored:query?useMessageBodyForTemplate=true").to("mock:query");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java
new file mode 100644
index 0000000..6f9f479
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java
@@ -0,0 +1,80 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.After;
+import org.junit.Test;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+
+public class SqlStoredDataSourceTest extends CamelTestSupport {
+
+    private EmbeddedDatabase db;
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        JndiRegistry jndi = super.createRegistry();
+
+        // START SNIPPET: e2
+        // this is the database we create with some initial data for our unit test
+        db = new EmbeddedDatabaseBuilder()
+                .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build();
+        // END SNIPPET: e2
+
+        jndi.bind("jdbc/myDataSource", db);
+
+        return jndi;
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        super.tearDown();
+        db.shutdown();
+    }
+
+    @Test
+    public void shouldExecuteStoredProcedure() throws InterruptedException {
+        MockEndpoint mock = getMockEndpoint("mock:query");
+        mock.expectedMessageCount(1);
+
+        template.requestBody("direct:query", "");
+
+        assertMockEndpointsSatisfied();
+
+        Exchange exchange = mock.getExchanges().get(0);
+        assertNotNull(exchange.getIn().getHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                // required for the sql component
+
+                from("direct:query").to("sql-stored:NILADIC()?dataSource=#jdbc/myDataSource").to("mock:query");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java
new file mode 100644
index 0000000..4aee75c
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java
@@ -0,0 +1,59 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import org.apache.camel.component.sql.stored.template.TemplateParser;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+public class TemplateCacheTest extends CamelTestSupport {
+
+    private EmbeddedDatabase db;
+
+    @Before
+    public void setUp() throws Exception {
+        db = new EmbeddedDatabaseBuilder()
+                .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build();
+        super.setUp();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        super.tearDown();
+        db.shutdown();
+    }
+
+    @Test
+    public void shouldCacheTemplateFunctions() throws InterruptedException {
+        JdbcTemplate jdbcTemplate = new JdbcTemplate(db);
+        CallableStatementWrapperFactory fac = new CallableStatementWrapperFactory(jdbcTemplate, new TemplateParser());
+
+        BatchCallableStatementCreatorFactory batchFactory1 = fac.getTemplateForBatch("FOO()");
+        BatchCallableStatementCreatorFactory batchFactory2 = fac.getTemplateForBatch("FOO()");
+        assertSame(batchFactory1, batchFactory2);
+
+        TemplateStoredProcedure templateStoredProcedure1 = fac.getTemplateStoredProcedure("FOO()");
+        TemplateStoredProcedure templateStoredProcedure2 = fac.getTemplateStoredProcedure("FOO()");
+        assertSame(templateStoredProcedure1, templateStoredProcedure2);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateStoredProcedureTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateStoredProcedureTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateStoredProcedureTest.java
deleted file mode 100644
index f538ce5..0000000
--- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateStoredProcedureTest.java
+++ /dev/null
@@ -1,79 +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.camel.component.sql.stored;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.component.sql.stored.template.TemplateStoredProcedure;
-import org.apache.camel.component.sql.stored.template.TemplateStoredProcedureFactory;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
-import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
-
-public class TemplateStoredProcedureTest extends CamelTestSupport {
-
-    private TemplateStoredProcedureFactory parser;
-    private EmbeddedDatabase db;
-    private JdbcTemplate jdbcTemplate;
-
-    @Before
-    public void setUp() throws Exception {
-        db = new EmbeddedDatabaseBuilder()
-                .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build();
-        jdbcTemplate = new JdbcTemplate(db);
-        parser = new TemplateStoredProcedureFactory(jdbcTemplate);
-        super.setUp();
-    }
-
-
-    @Test
-    public void shouldExecuteStoredProcedure() {
-        TemplateStoredProcedure sp = new TemplateStoredProcedure(jdbcTemplate, parser.parseTemplate("ADDNUMBERS"
-                + "(INTEGER ${header.v1},INTEGER ${header.v2},OUT INTEGER resultofsum)"));
-
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader("v1", 1);
-        exchange.getIn().setHeader("v2", 2);
-
-        sp.execute(exchange);
-
-        Assert.assertEquals(Integer.valueOf(3), exchange.getOut().getHeader("resultofsum"));
-    }
-
-    @Test
-    public void shouldExecuteNilacidProcedure() {
-        TemplateStoredProcedure sp = new TemplateStoredProcedure(jdbcTemplate, parser.parseTemplate("NILADIC()"));
-
-        Exchange exchange = createExchangeWithBody(null);
-        exchange.getIn().setHeader("v1", 1);
-        exchange.getIn().setHeader("v2", 2);
-
-        sp.execute(exchange);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        super.tearDown();
-        db.shutdown();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java
index 55e2624..fea0d11 100644
--- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java
@@ -16,21 +16,36 @@
  */
 package org.apache.camel.component.sql.stored;
 
+import java.util.concurrent.atomic.AtomicLong;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public final class TestStoredProcedure {
 
+    public static final AtomicLong BATCHFN_CALL_COUNTER = new AtomicLong(0);
+
     private static final Logger LOG = LoggerFactory.getLogger(TestStoredProcedure.class);
 
+
     private TestStoredProcedure() {
     }
 
-    public static void addnumbers(int val1, int val2, int[] ret) {
+    public static void subnumbers(int val1, int val2, int[] ret) {
         LOG.info("calling addnumbers:{} + {}", val1, val2);
-        ret[0] = val1 + val2;
+        ret[0] = val1 - val2;
     }
 
+
+    public static void batchfn(String val1) {
+        LOG.info("calling batchfn:{}", val1);
+        if (val1 == null) {
+            throw new IllegalArgumentException("Argument val1 is null!");
+        }
+        BATCHFN_CALL_COUNTER.incrementAndGet();
+    }
+
+
     public static void niladic() {
         LOG.info("nilacid called");
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql b/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql
index 807768e..108c2e1 100644
--- a/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql
+++ b/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql
@@ -15,14 +15,20 @@
 -- limitations under the License.
 -- ------------------------------------------------------------------------
 
-CREATE PROCEDURE ADDNUMBERS(VALUE1 INTEGER, VALUE2 INTEGER,OUT RESULT INTEGER)
+CREATE PROCEDURE SUBNUMBERS(VALUE1 INTEGER, VALUE2 INTEGER,OUT RESULT INTEGER)
  PARAMETER STYLE JAVA
  LANGUAGE JAVA
  EXTERNAL NAME
-'org.apache.camel.component.sql.stored.TestStoredProcedure.addnumbers';
+'org.apache.camel.component.sql.stored.TestStoredProcedure.subnumbers';
 
 CREATE PROCEDURE NILADIC()
  PARAMETER STYLE JAVA
  LANGUAGE JAVA
  EXTERNAL NAME
-'org.apache.camel.component.sql.stored.TestStoredProcedure.niladic';
\ No newline at end of file
+'org.apache.camel.component.sql.stored.TestStoredProcedure.niladic';
+
+CREATE PROCEDURE BATCHFN(VALUE1 CHAR(10))
+ PARAMETER STYLE JAVA
+ LANGUAGE JAVA
+ EXTERNAL NAME
+'org.apache.camel.component.sql.stored.TestStoredProcedure.batchfn';


[3/3] camel git commit: CAMEL-4725: Batch support and other options for Producer.

Posted by da...@apache.org.
CAMEL-4725: Batch support and other options for Producer.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/df5944fa
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/df5944fa
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/df5944fa

Branch: refs/heads/master
Commit: df5944fad4e3100e054f1dda09c60ebc80274e15
Parents: f511606
Author: Sami Nurminen <sn...@gmail.com>
Authored: Tue Jan 12 23:12:18 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Thu Jan 14 16:34:09 2016 +0000

----------------------------------------------------------------------
 .../BatchCallableStatementCreatorFactory.java   | 100 +++
 .../sql/stored/CallableStatementWrapper.java    | 128 +++
 .../stored/CallableStatementWrapperFactory.java | 101 +++
 .../sql/stored/SqlStoredComponent.java          |  28 +-
 .../sql/stored/SqlStoredConstants.java          |  30 +
 .../component/sql/stored/SqlStoredEndpoint.java | 128 +--
 .../component/sql/stored/SqlStoredProducer.java |  95 ++-
 .../component/sql/stored/StamentWrapper.java    |  42 +
 .../sql/stored/TemplateStoredProcedure.java     |  83 ++
 .../sql/stored/WrapperExecuteCallback.java      |  26 +
 .../sql/stored/template/TemplateParser.java     |  45 +
 .../template/TemplateStoredProcedure.java       |  74 --
 .../TemplateStoredProcedureFactory.java         |  76 --
 .../sql/stored/template/ast/InputParameter.java |  52 +-
 .../sql/stored/template/ast/ParseHelper.java    |  51 +-
 .../sql/stored/template/ast/Template.java       |  17 +-
 .../sql/stored/template/ast/ValueExtractor.java |  29 +
 .../template/generated/ParseException.java      | 315 ++++---
 .../stored/template/generated/SSPTParser.java   | 542 ++++++------
 .../template/generated/SSPTParserConstants.java |  56 +-
 .../generated/SSPTParserTokenManager.java       | 695 +++++++--------
 .../template/generated/SimpleCharStream.java    | 854 +++++++++----------
 .../sql/stored/template/generated/Token.java    | 228 +++--
 .../template/generated/TokenMgrError.java       | 241 +++---
 .../sql/stored/template/grammar/sspt.jj         |  37 +-
 .../stored/CallableStatementWrapperTest.java    |  99 +++
 .../camel/component/sql/stored/ParserTest.java  |  39 +-
 .../component/sql/stored/ProducerBatchTest.java |  95 +++
 .../component/sql/stored/ProducerTest.java      |   7 +-
 .../ProducerUseMessageBodyForTemplateTest.java  |  85 ++
 .../sql/stored/SqlStoredDataSourceTest.java     |  80 ++
 .../component/sql/stored/TemplateCacheTest.java |  59 ++
 .../sql/stored/TemplateStoredProcedureTest.java |  79 --
 .../sql/stored/TestStoredProcedure.java         |  19 +-
 .../test/resources/sql/storedProcedureTest.sql  |  12 +-
 35 files changed, 2786 insertions(+), 1861 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/BatchCallableStatementCreatorFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/BatchCallableStatementCreatorFactory.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/BatchCallableStatementCreatorFactory.java
new file mode 100644
index 0000000..cda2bd4
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/BatchCallableStatementCreatorFactory.java
@@ -0,0 +1,100 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import java.sql.CallableStatement;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.component.sql.stored.template.ast.InputParameter;
+import org.apache.camel.component.sql.stored.template.ast.Template;
+import org.springframework.jdbc.core.CallableStatementCreator;
+import org.springframework.jdbc.core.CallableStatementCreatorFactory;
+import org.springframework.jdbc.core.SqlParameter;
+import org.springframework.jdbc.core.StatementCreatorUtils;
+
+
+public class BatchCallableStatementCreatorFactory {
+
+    final CallableStatementCreatorFactory callableStatementCreatorFactory;
+
+    final List<SqlParameter> sqlParameterList;
+
+    final Template template;
+
+
+    public BatchCallableStatementCreatorFactory(Template template) {
+        this.template = template;
+        this.sqlParameterList = createParams();
+        this.callableStatementCreatorFactory = new CallableStatementCreatorFactory(formatSql(), createParams());
+    }
+
+    public void addParameter(CallableStatement callableStatement, Map batchRow) throws SQLException {
+        int i = 1;
+        for (SqlParameter parameter : getSqlParameterList()) {
+            StatementCreatorUtils.setParameterValue(callableStatement, i, parameter, batchRow.get(parameter.getName()));
+            i++;
+        }
+    }
+
+    private String formatSql() {
+        return "{call " + this.template.getProcedureName() + "(" + repeatParameter(this.template.getParameterList()
+                .size()) + ")}";
+    }
+
+    private String repeatParameter(int size) {
+        StringBuilder ret = new StringBuilder();
+        for (int i = 0; i < size; i++) {
+            ret.append('?');
+            if (i + 1 < size) {
+                ret.append(',');
+            }
+        }
+        return ret.toString();
+    }
+
+    private List<SqlParameter> createParams() {
+        List<SqlParameter> params = new ArrayList<>();
+
+        for (Object parameter : template.getParameterList()) {
+            if (parameter instanceof InputParameter) {
+                InputParameter inputParameter = (InputParameter) parameter;
+                params.add(new SqlParameter(inputParameter.getName(), inputParameter.getSqlType()));
+
+            } else {
+                throw new UnsupportedOperationException("Only IN parameters supported by batch!");
+            }
+        }
+
+
+        return params;
+    }
+
+    public CallableStatementCreator newCallableStatementCreator(Map params) {
+        return this.callableStatementCreatorFactory.newCallableStatementCreator(params);
+    }
+
+    public List<SqlParameter> getSqlParameterList() {
+        return sqlParameterList;
+    }
+
+    public Template getTemplate() {
+        return template;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/CallableStatementWrapper.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/CallableStatementWrapper.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/CallableStatementWrapper.java
new file mode 100644
index 0000000..824f21d
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/CallableStatementWrapper.java
@@ -0,0 +1,128 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.sql.stored.template.ast.InputParameter;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.CallableStatementCallback;
+import org.springframework.jdbc.core.CallableStatementCreator;
+
+public class CallableStatementWrapper implements StamentWrapper {
+
+    final CallableStatementWrapperFactory factory;
+
+    final String template;
+
+    Map result;
+
+    List<Map> batchItems;
+
+    Integer updateCount;
+
+    BatchCallableStatementCreatorFactory batchFactory;
+
+    public CallableStatementWrapper(String template, CallableStatementWrapperFactory wrapperFactory) {
+        this.factory = wrapperFactory;
+        this.template = template;
+    }
+
+    @Override
+    public void call(final WrapperExecuteCallback cb) throws Exception {
+        cb.execute(this);
+    }
+
+
+    @Override
+    public int[] executeBatch() throws SQLException {
+
+        if (this.batchItems == null) {
+            throw new IllegalArgumentException("Batch must have at least one item");
+        }
+
+        final Iterator<Map> params = batchItems.iterator();
+
+
+        return factory.getJdbcTemplate().execute(new CallableStatementCreator() {
+            @Override
+            public CallableStatement createCallableStatement(Connection connection) throws SQLException {
+                return batchFactory.newCallableStatementCreator(params.next()).createCallableStatement(connection);
+
+            }
+        }, new CallableStatementCallback<int[]>() {
+            @Override
+            public int[] doInCallableStatement(CallableStatement callableStatement) throws SQLException, DataAccessException {
+                //add first item to batch
+                callableStatement.addBatch();
+
+                while (params.hasNext()) {
+                    batchFactory.addParameter(callableStatement, params.next());
+                    callableStatement.addBatch();
+                }
+                return callableStatement.executeBatch();
+            }
+        });
+    }
+
+
+    @Override
+    public Integer getUpdateCount() throws SQLException {
+        return this.updateCount;
+    }
+
+
+    @Override
+    public Object executeStatement() throws SQLException {
+        return this.result;
+    }
+
+    @Override
+    public void populateStatement(Object value, Exchange exchange) throws SQLException {
+        this.result = this.factory.getTemplateStoredProcedure(this.template).execute(exchange, value);
+        //Spring sets #update-result-1
+        this.updateCount = (Integer) this.result.get("#update-count-1");
+    }
+
+    @Override
+    public void addBatch(Object value, Exchange exchange) {
+
+        if (this.batchFactory == null) {
+            this.batchFactory = factory.getTemplateForBatch(template);
+        }
+
+        Map<String, Object> batchValues = new HashMap<>();
+        //only IN-parameters supported by template
+        for (Object param : this.batchFactory.getTemplate().getParameterList()) {
+            InputParameter inputParameter = (InputParameter) param;
+            Object paramValue = inputParameter.getValueExtractor().eval(exchange, value);
+            batchValues.put(inputParameter.getName(), paramValue);
+        }
+        if (this.batchItems == null) {
+            this.batchItems = new ArrayList<>();
+        }
+        batchItems.add(batchValues);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/CallableStatementWrapperFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/CallableStatementWrapperFactory.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/CallableStatementWrapperFactory.java
new file mode 100644
index 0000000..503fdb3
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/CallableStatementWrapperFactory.java
@@ -0,0 +1,101 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import java.sql.SQLException;
+
+import org.apache.camel.component.sql.stored.template.TemplateParser;
+import org.apache.camel.support.ServiceSupport;
+import org.apache.camel.util.LRUCache;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+/**
+ * Statefull class that cached template functions.
+ */
+public class CallableStatementWrapperFactory extends ServiceSupport {
+
+    public static final int TEMPLATE_CACHE_DEFAULT_SIZE = 200;
+
+    public static final int BATCH_TEMPLATE_CACHE_DEFAULT_SIZE = 200;
+
+    final JdbcTemplate jdbcTemplate;
+
+    final TemplateParser templateParser;
+
+    private final LRUCache<String, TemplateStoredProcedure> templateCache = new LRUCache<>(TEMPLATE_CACHE_DEFAULT_SIZE);
+
+    private final LRUCache<String, BatchCallableStatementCreatorFactory> batchTemplateCache = new LRUCache<>(BATCH_TEMPLATE_CACHE_DEFAULT_SIZE);
+
+    public CallableStatementWrapperFactory(JdbcTemplate jdbcTemplate, TemplateParser
+            templateParser) {
+        this.jdbcTemplate = jdbcTemplate;
+        this.templateParser = templateParser;
+    }
+
+    public StamentWrapper create(String sql) throws SQLException {
+        return new CallableStatementWrapper(sql, this);
+    }
+
+    public BatchCallableStatementCreatorFactory getTemplateForBatch(String sql) {
+        BatchCallableStatementCreatorFactory template = this.batchTemplateCache.get(sql);
+        if (template != null) {
+            return template;
+        }
+
+        template = new BatchCallableStatementCreatorFactory(templateParser.parseTemplate(sql));
+        this.batchTemplateCache.put(sql, template);
+
+        return template;
+    }
+
+    public TemplateStoredProcedure getTemplateStoredProcedure(String sql) {
+        TemplateStoredProcedure templateStoredProcedure = this.templateCache.get(sql);
+        if (templateStoredProcedure != null) {
+            return templateStoredProcedure;
+        }
+
+        templateStoredProcedure = new TemplateStoredProcedure(jdbcTemplate, templateParser.parseTemplate(sql));
+
+        this.templateCache.put(sql, templateStoredProcedure);
+
+        return templateStoredProcedure;
+    }
+
+    public JdbcTemplate getJdbcTemplate() {
+        return jdbcTemplate;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        try {
+            // clear cache when we are stopping
+            templateCache.clear();
+        } catch (Exception ex) {
+            //noop
+        }
+        try {
+            // clear cache when we are stopping
+            batchTemplateCache.clear();
+        } catch (Exception ex) {
+            //noop
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredComponent.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredComponent.java
index 3391450..5444b18 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredComponent.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredComponent.java
@@ -21,19 +21,24 @@ import javax.sql.DataSource;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
-import org.apache.camel.component.sql.stored.template.TemplateStoredProcedureFactory;
 import org.apache.camel.impl.UriEndpointComponent;
-import org.apache.camel.util.CamelContextHelper;
 import org.springframework.jdbc.core.JdbcTemplate;
 
 public class SqlStoredComponent extends UriEndpointComponent {
-
     private DataSource dataSource;
 
     public SqlStoredComponent() {
         super(SqlStoredEndpoint.class);
     }
 
+    public SqlStoredComponent(Class<? extends Endpoint> endpointClass) {
+        super(endpointClass);
+    }
+
+    public SqlStoredComponent(CamelContext context) {
+        super(context, SqlStoredEndpoint.class);
+    }
+
     public SqlStoredComponent(CamelContext context, Class<? extends Endpoint> endpointClass) {
         super(context, endpointClass);
     }
@@ -47,10 +52,6 @@ public class SqlStoredComponent extends UriEndpointComponent {
         if (ds != null) {
             target = ds;
         }
-        String dataSourceRef = getAndRemoveParameter(parameters, "dataSourceRef", String.class);
-        if (target == null && dataSourceRef != null) {
-            target = CamelContextHelper.mandatoryLookup(getCamelContext(), dataSourceRef, DataSource.class);
-        }
         if (target == null) {
             // fallback and use component
             target = dataSource;
@@ -59,14 +60,12 @@ public class SqlStoredComponent extends UriEndpointComponent {
             throw new IllegalArgumentException("DataSource must be configured");
         }
 
-        JdbcTemplate template = new JdbcTemplate(target);
-        TemplateStoredProcedureFactory factory = new TemplateStoredProcedureFactory(template);
+        JdbcTemplate jdbcTemplate = new JdbcTemplate(target);
+        String template = remaining;
 
-        SqlStoredEndpoint answer = new SqlStoredEndpoint(uri, this);
-        answer.setJdbcTemplate(template);
-        answer.setTemplate(remaining);
-        answer.setTemplateStoredProcedureFactory(factory);
-        return answer;
+        SqlStoredEndpoint endpoint = new SqlStoredEndpoint(uri, this, jdbcTemplate);
+        endpoint.setTemplate(template);
+        return endpoint;
     }
 
     public DataSource getDataSource() {
@@ -79,5 +78,4 @@ public class SqlStoredComponent extends UriEndpointComponent {
     public void setDataSource(DataSource dataSource) {
         this.dataSource = dataSource;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredConstants.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredConstants.java
new file mode 100644
index 0000000..801d4ea
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredConstants.java
@@ -0,0 +1,30 @@
+/**
+ * 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.camel.component.sql.stored;
+
+public final class SqlStoredConstants {
+
+    public static final String SQL_STORED_TEMPLATE = "CamelSqlStoredTemplate";
+
+    public static final String SQL_STORED_PARAMETERS = "CamelSqlStoredParameters";
+
+    public static final String SQL_STORED_UPDATE_COUNT = "CamelSqlStoredUpdateCount";
+
+    private SqlStoredConstants() {
+        // Utility class
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredEndpoint.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredEndpoint.java
index e65fa8b..7897c74 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredEndpoint.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredEndpoint.java
@@ -16,96 +16,128 @@
  */
 package org.apache.camel.component.sql.stored;
 
-import org.apache.camel.Component;
-import org.apache.camel.Consumer;
-import org.apache.camel.Processor;
+import javax.sql.DataSource;
+
 import org.apache.camel.Producer;
-import org.apache.camel.component.sql.stored.template.TemplateStoredProcedureFactory;
-import org.apache.camel.impl.DefaultEndpoint;
+import org.apache.camel.component.sql.stored.template.TemplateParser;
+import org.apache.camel.impl.DefaultPollingEndpoint;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
-import org.apache.camel.util.ObjectHelper;
-import org.apache.camel.util.ServiceHelper;
 import org.apache.camel.util.UnsafeUriCharactersEncoder;
 import org.springframework.jdbc.core.JdbcTemplate;
 
 @UriEndpoint(scheme = "sql-stored", title = "SQL StoredProcedure", syntax = "sql-stored:template", producerOnly = true, label = "database,sql")
-public class SqlStoredEndpoint extends DefaultEndpoint {
+public class SqlStoredEndpoint extends DefaultPollingEndpoint {
 
+    private final CallableStatementWrapperFactory wrapperFactory;
     private JdbcTemplate jdbcTemplate;
-    private TemplateStoredProcedureFactory templateStoredProcedureFactory;
 
-    @UriPath @Metadata(required = "true")
-    private String template;
+    @UriParam(description = "Sets the DataSource to use to communicate with the database.")
+    private DataSource dataSource;
 
-    public SqlStoredEndpoint(String endpointUri, Component component) {
-        super(endpointUri, component);
+    @UriPath(description = "Sets the StoredProcedure template to perform")
+    @Metadata(required = "true")
+    private String template;
+    @UriParam(label = "producer", description = "Enables or disables batch mode")
+    private boolean batch;
+    @UriParam(label = "producer", description = "Whether to use the message body as the template and then headers for parameters. If this option is enabled then the template in the uri is not used.")
+    private boolean useMessageBodyForTemplate;
+    @UriParam(label = "producer", description = "If set, will ignore the results of the template and use the existing IN message as the OUT message for the continuation of processing")
+    private boolean noop;
+    @UriParam(description = "Store the template result in a header instead of the message body. By default, outputHeader == null and the template result is stored"
+            + " in the message body, any existing content in the message body is discarded. If outputHeader is set, the value is used as the name of the header"
+            + " to store the template result and the original message body is preserved.")
+    private String outputHeader;
+
+    public SqlStoredEndpoint(String uri, SqlStoredComponent component, JdbcTemplate jdbcTemplate) {
+        super(uri, component);
+        setJdbcTemplate(jdbcTemplate);
+        wrapperFactory = new CallableStatementWrapperFactory(jdbcTemplate, new TemplateParser());
     }
 
-    @Override
     public Producer createProducer() throws Exception {
-        ObjectHelper.notNull(template, "template");
-        ObjectHelper.notNull(templateStoredProcedureFactory, "templateStoredProcedureFactory");
-
-        return new SqlStoredProducer(this, template, templateStoredProcedureFactory);
+        SqlStoredProducer result = new SqlStoredProducer(this);
+        return result;
     }
 
+
     @Override
-    public Consumer createConsumer(Processor processor) throws Exception {
-        throw new UnsupportedOperationException("This component does not support consumer");
+    protected String createEndpointUri() {
+        // Make sure it's properly encoded
+        return "sql-stored:" + UnsafeUriCharactersEncoder.encode(this.template);
     }
 
     @Override
-    public boolean isSingleton() {
-        return true;
+    protected void doStop() throws Exception {
+        super.doStop();
+        this.wrapperFactory.shutdown();
+
     }
 
-    @Override
-    protected String createEndpointUri() {
-        return "sql-stored:" + UnsafeUriCharactersEncoder.encode(template);
+    public JdbcTemplate getJdbcTemplate() {
+        return jdbcTemplate;
     }
 
-    @Override
-    protected void doStart() throws Exception {
-        ServiceHelper.startService(templateStoredProcedureFactory);
+    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
+        this.jdbcTemplate = jdbcTemplate;
     }
 
-    @Override
-    protected void doStop() throws Exception {
-        ServiceHelper.stopService(templateStoredProcedureFactory);
+    public boolean isBatch() {
+        return batch;
+    }
+
+    public void setBatch(boolean batch) {
+        this.batch = batch;
+    }
+
+    public boolean isUseMessageBodyForTemplate() {
+        return useMessageBodyForTemplate;
+    }
+
+    public void setUseMessageBodyForTemplate(boolean useMessageBodyForTemplate) {
+        this.useMessageBodyForTemplate = useMessageBodyForTemplate;
+    }
+
+    public boolean isNoop() {
+        return noop;
+    }
+
+    public void setNoop(boolean noop) {
+        this.noop = noop;
+    }
+
+    public String getOutputHeader() {
+        return outputHeader;
+    }
+
+    public void setOutputHeader(String outputHeader) {
+        this.outputHeader = outputHeader;
     }
 
     public String getTemplate() {
         return template;
     }
 
-    /**
-     * The stored procedure template to perform
-     */
     public void setTemplate(String template) {
         this.template = template;
     }
 
-    public TemplateStoredProcedureFactory getTemplateStoredProcedureFactory() {
-        return templateStoredProcedureFactory;
+    public DataSource getDataSource() {
+        return dataSource;
     }
 
-    /**
-     * To use a custom instance of TemplateStoredProcedureFactory
-     */
-    public void setTemplateStoredProcedureFactory(TemplateStoredProcedureFactory templateStoredProcedureFactory) {
-        this.templateStoredProcedureFactory = templateStoredProcedureFactory;
+    public void setDataSource(DataSource dataSource) {
+        this.dataSource = dataSource;
     }
 
-    public JdbcTemplate getJdbcTemplate() {
-        return jdbcTemplate;
+    @Override
+    public boolean isSingleton() {
+        return false;
     }
 
-    /**
-     * to use a custom instance of JdbcTemplate
-     */
-    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
-        this.jdbcTemplate = jdbcTemplate;
+    public CallableStatementWrapperFactory getWrapperFactory() {
+        return wrapperFactory;
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java
index 4a7ccc4..eff61b1 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java
@@ -16,24 +16,101 @@
  */
 package org.apache.camel.component.sql.stored;
 
-import org.apache.camel.Endpoint;
+import java.sql.SQLException;
+import java.util.Iterator;
+
 import org.apache.camel.Exchange;
-import org.apache.camel.component.sql.stored.template.TemplateStoredProcedure;
-import org.apache.camel.component.sql.stored.template.TemplateStoredProcedureFactory;
 import org.apache.camel.impl.DefaultProducer;
+import org.springframework.dao.DataAccessException;
 
 public class SqlStoredProducer extends DefaultProducer {
+    private CallableStatementWrapperFactory callableStatementWrapperFactory;
 
-    private TemplateStoredProcedure defaultTemplateStoredProcedure;
-
-    public SqlStoredProducer(Endpoint endpoint, String template, TemplateStoredProcedureFactory templateStoredProcedureFactory) {
+    public SqlStoredProducer(SqlStoredEndpoint endpoint) {
         super(endpoint);
-        this.defaultTemplateStoredProcedure = templateStoredProcedureFactory.createFromString(template);
     }
 
     @Override
-    public void process(Exchange exchange) throws Exception {
-        defaultTemplateStoredProcedure.execute(exchange);
+    public SqlStoredEndpoint getEndpoint() {
+        return (SqlStoredEndpoint) super.getEndpoint();
+    }
+
+    public void process(final Exchange exchange) throws Exception {
+        StamentWrapper stamentWrapper = createStatement(exchange);
+        stamentWrapper.call(new WrapperExecuteCallback() {
+            @Override
+            public void execute(StamentWrapper ps) throws SQLException, DataAccessException {
+                // transfer incoming message body data to prepared statement parameters, if necessary
+                if (getEndpoint().isBatch()) {
+                    Iterator<?> iterator;
+                    if (getEndpoint().isUseMessageBodyForTemplate()) {
+                        iterator = exchange.getIn().getHeader(SqlStoredConstants.SQL_STORED_PARAMETERS, Iterator.class);
+                    } else {
+                        iterator = exchange.getIn().getBody(Iterator.class);
+                    }
+
+                    if (iterator == null) {
+                        throw new IllegalStateException("batch=true but Iterator cannot be found from body or header");
+                    }
+                    while (iterator.hasNext()) {
+                        Object value = iterator.next();
+                        ps.addBatch(value, exchange);
+                    }
+                } else {
+                    Object value;
+                    if (getEndpoint().isUseMessageBodyForTemplate()) {
+                        value = exchange.getIn().getHeader(SqlStoredConstants.SQL_STORED_PARAMETERS);
+                    } else {
+                        value = exchange.getIn().getBody();
+                    }
+                    ps.populateStatement(value, exchange);
+                }
+
+                // call the prepared statement and populate the outgoing message
+                if (getEndpoint().isBatch()) {
+                    int[] updateCounts = ps.executeBatch();
+                    int total = 0;
+                    for (int count : updateCounts) {
+                        total += count;
+                    }
+                    exchange.getIn().setHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT, total);
+                } else {
+                    Object result = ps.executeStatement();
+                    // preserve headers first, so we can override the SQL_ROW_COUNT and SQL_UPDATE_COUNT headers
+                    // if statement returns them
+                    exchange.getOut().getHeaders().putAll(exchange.getIn().getHeaders());
+
+                    if (result != null) {
+                        if (getEndpoint().isNoop()) {
+                            exchange.getOut().setBody(exchange.getIn().getBody());
+                        } else if (getEndpoint().getOutputHeader() != null) {
+                            exchange.getOut().setBody(exchange.getIn().getBody());
+                            exchange.getOut().setHeader(getEndpoint().getOutputHeader(), result);
+                        } else {
+                            exchange.getOut().setBody(result);
+                        }
+                    }
+                    // for noop=true we still want to enrich with the headers
+
+                    if (ps.getUpdateCount() != null) {
+                        exchange.getOut().setHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT, ps.getUpdateCount());
+                    }
+                }
+            }
+        });
+    }
+
+    private StamentWrapper createStatement(Exchange exchange) throws SQLException {
+        final String sql;
+        if (getEndpoint().isUseMessageBodyForTemplate()) {
+            sql = exchange.getIn().getBody(String.class);
+        } else {
+            String templateHeader = exchange.getIn().getHeader(SqlStoredConstants.SQL_STORED_TEMPLATE, String.class);
+            sql = templateHeader != null ? templateHeader : getEndpoint().getTemplate();
+        }
+
+        return getEndpoint().getWrapperFactory().create(sql);
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/StamentWrapper.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/StamentWrapper.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/StamentWrapper.java
new file mode 100644
index 0000000..1b92b28
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/StamentWrapper.java
@@ -0,0 +1,42 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import java.sql.SQLException;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.sql.SqlProducer;
+
+/**
+ * Wrapper that simplifies operations on  {@link java.sql.CallableStatement}
+ * in {@link SqlStoredProducer}.
+ * Wrappers are statefull objects and must not be reused.
+ */
+public interface StamentWrapper {
+
+    void call(WrapperExecuteCallback cb) throws Exception;
+
+    int[] executeBatch() throws SQLException;
+
+    Integer getUpdateCount() throws SQLException;
+
+    Object executeStatement() throws SQLException;
+
+    void populateStatement(Object value, Exchange exchange) throws SQLException;
+
+    void addBatch(Object value, Exchange exchange);
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/TemplateStoredProcedure.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/TemplateStoredProcedure.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/TemplateStoredProcedure.java
new file mode 100644
index 0000000..c7a1df5
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/TemplateStoredProcedure.java
@@ -0,0 +1,83 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.sql.stored.template.ast.InputParameter;
+import org.apache.camel.component.sql.stored.template.ast.OutParameter;
+import org.apache.camel.component.sql.stored.template.ast.Template;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.SqlOutParameter;
+import org.springframework.jdbc.core.SqlParameter;
+import org.springframework.jdbc.object.StoredProcedure;
+
+public class TemplateStoredProcedure extends StoredProcedure {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TemplateStoredProcedure.class);
+
+    private final Template template;
+
+    private List<InputParameter> inputParameterList = new ArrayList<>();
+
+    public TemplateStoredProcedure(JdbcTemplate jdbcTemplate, Template template) {
+        this.template = template;
+        setDataSource(jdbcTemplate.getDataSource());
+
+        setSql(template.getProcedureName());
+
+        for (Object parameter : template.getParameterList()) {
+            if (parameter instanceof InputParameter) {
+                InputParameter inputParameter = (InputParameter) parameter;
+                declareParameter(new SqlParameter(inputParameter.getName(), inputParameter.getSqlType()));
+                inputParameterList.add(inputParameter);
+
+            } else if (parameter instanceof OutParameter) {
+                OutParameter outParameter = (OutParameter) parameter;
+                declareParameter(new SqlOutParameter(outParameter.getOutHeader(), outParameter.getSqlType()));
+                setFunction(false);
+            }
+        }
+
+        LOG.debug("Compiling stored procedure: {}", template.getProcedureName());
+        compile();
+    }
+
+    public Map execute(Exchange exchange, Object rowData) {
+        Map<String, Object> params = new HashMap<>();
+
+        for (InputParameter inputParameter : inputParameterList) {
+            params.put(inputParameter.getName(), inputParameter.getValueExtractor().eval(exchange, rowData));
+        }
+
+        LOG.debug("Invoking stored procedure: {}", template.getProcedureName());
+        Map<String, Object> ret = super.execute(params);
+
+        return ret;
+    }
+
+    public Template getTemplate() {
+        return template;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/WrapperExecuteCallback.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/WrapperExecuteCallback.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/WrapperExecuteCallback.java
new file mode 100644
index 0000000..fedd926
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/WrapperExecuteCallback.java
@@ -0,0 +1,26 @@
+/**
+ * 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.camel.component.sql.stored;
+
+import java.sql.SQLException;
+
+import org.springframework.dao.DataAccessException;
+
+public interface WrapperExecuteCallback {
+
+    void execute(StamentWrapper stamentWrapper) throws SQLException, DataAccessException;
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateParser.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateParser.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateParser.java
new file mode 100644
index 0000000..321fa09
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateParser.java
@@ -0,0 +1,45 @@
+/**
+ * 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.camel.component.sql.stored.template;
+
+import java.io.StringReader;
+
+import org.apache.camel.component.sql.stored.template.ast.ParseRuntimeException;
+import org.apache.camel.component.sql.stored.template.ast.Template;
+import org.apache.camel.component.sql.stored.template.generated.ParseException;
+import org.apache.camel.component.sql.stored.template.generated.SSPTParser;
+
+public class TemplateParser {
+
+    public Template parseTemplate(String template) {
+        try {
+            SSPTParser parser = new SSPTParser(new StringReader(template));
+            Template ret = validate(parser.parse());
+
+            return ret;
+
+        } catch (ParseException parseException) {
+            throw new ParseRuntimeException(parseException);
+        }
+    }
+
+    private Template validate(Template input) {
+        return input;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedure.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedure.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedure.java
deleted file mode 100644
index 180c1b2..0000000
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedure.java
+++ /dev/null
@@ -1,74 +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.camel.component.sql.stored.template;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.component.sql.stored.template.ast.InputParameter;
-import org.apache.camel.component.sql.stored.template.ast.OutParameter;
-import org.apache.camel.component.sql.stored.template.ast.Template;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.SqlOutParameter;
-import org.springframework.jdbc.core.SqlParameter;
-import org.springframework.jdbc.object.StoredProcedure;
-
-public class TemplateStoredProcedure extends StoredProcedure {
-
-    private static final Logger LOG = LoggerFactory.getLogger(TemplateStoredProcedure.class);
-    private final Template template;
-
-    public TemplateStoredProcedure(JdbcTemplate jdbcTemplate, Template template) {
-        this.template = template;
-        setDataSource(jdbcTemplate.getDataSource());
-
-        setSql(template.getProcedureName());
-
-        for (InputParameter inputParameter : template.getInputParameterList()) {
-            declareParameter(new SqlParameter(inputParameter.getName(), inputParameter.getSqlType()));
-        }
-
-        for (OutParameter outParameter : template.getOutParameterList()) {
-            declareParameter(new SqlOutParameter(outParameter.getName(), outParameter.getSqlType()));
-            setFunction(false);
-        }
-
-        LOG.debug("Compiling stored procedure: {}", template.getProcedureName());
-        compile();
-    }
-
-    public void execute(Exchange exchange) {
-
-        Map<String, Object> params = new HashMap<>();
-
-        for (InputParameter inputParameter : template.getInputParameterList()) {
-            params.put(inputParameter.getName(), inputParameter.getValueExpression().evaluate(exchange, inputParameter.getJavaType()));
-        }
-
-        LOG.debug("Invoking stored procedure: {}", template.getProcedureName());
-        Map<String, Object> ret = super.execute(params);
-
-        for (OutParameter out : template.getOutParameterList()) {
-            exchange.getOut().setHeader(out.getOutHeader(), ret.get(out.getName()));
-        }
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedureFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedureFactory.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedureFactory.java
deleted file mode 100644
index f096dc8..0000000
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedureFactory.java
+++ /dev/null
@@ -1,76 +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.camel.component.sql.stored.template;
-
-import java.io.StringReader;
-
-import org.apache.camel.component.sql.stored.template.ast.ParseRuntimeException;
-import org.apache.camel.component.sql.stored.template.ast.Template;
-import org.apache.camel.component.sql.stored.template.generated.ParseException;
-import org.apache.camel.component.sql.stored.template.generated.SSPTParser;
-import org.apache.camel.support.ServiceSupport;
-import org.apache.camel.util.LRUCache;
-import org.springframework.jdbc.core.JdbcTemplate;
-
-public class TemplateStoredProcedureFactory extends ServiceSupport {
-
-    public static final int TEMPLATE_CACHE_DEFAULT_SIZE = 200;
-    private final JdbcTemplate jdbcTemplate;
-    private final LRUCache<String, TemplateStoredProcedure> templateCache = new LRUCache<String, TemplateStoredProcedure>(TEMPLATE_CACHE_DEFAULT_SIZE);
-
-    public TemplateStoredProcedureFactory(JdbcTemplate jdbcTemplate) {
-        this.jdbcTemplate = jdbcTemplate;
-    }
-
-    public TemplateStoredProcedure createFromString(String string) {
-        TemplateStoredProcedure fromCache = templateCache.get(string);
-
-        if (fromCache != null) {
-            return fromCache;
-        }
-
-        Template sptpRootNode = parseTemplate(string);
-        TemplateStoredProcedure ret = new TemplateStoredProcedure(jdbcTemplate, sptpRootNode);
-
-        templateCache.put(string, ret);
-
-        return ret;
-    }
-
-    public Template parseTemplate(String template) {
-        try {
-            SSPTParser parser = new SSPTParser(new StringReader(template));
-            return validate(parser.parse());
-        } catch (ParseException parseException) {
-            throw new ParseRuntimeException(parseException);
-        }
-    }
-
-    private Template validate(Template input) {
-        return input;
-    }
-
-    @Override
-    protected void doStart() throws Exception {
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-        // clear cache when we are stopping
-        templateCache.clear();
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/InputParameter.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/InputParameter.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/InputParameter.java
index 68927a2..deb4d52 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/InputParameter.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/InputParameter.java
@@ -16,27 +16,63 @@
  */
 package org.apache.camel.component.sql.stored.template.ast;
 
+import java.util.Map;
+
+import org.apache.camel.Exchange;
 import org.apache.camel.Expression;
 import org.apache.camel.builder.ExpressionBuilder;
+import org.apache.camel.component.sql.stored.template.generated.SSPTParserConstants;
+import org.apache.camel.component.sql.stored.template.generated.Token;
 
 public class InputParameter {
 
     private final String name;
     private final int sqlType;
-    private final Expression valueExpression;
     private final Class javaType;
+    private ValueExtractor valueExtractor;
 
-    public InputParameter(String name, int sqlType, String valueSrcAsStr, Class javaType) {
+    public InputParameter(String name, int sqlType, Token valueSrcToken, Class javaType) {
         this.name = name;
         this.sqlType = sqlType;
         this.javaType = javaType;
-        this.valueExpression = parseValueExpression(valueSrcAsStr);
+        parseValueExpression(valueSrcToken);
     }
 
-    private Expression parseValueExpression(String str) {
-        return ExpressionBuilder.simpleExpression(str);
+    private void parseValueExpression(Token valueSrcToken) {
+        if (SSPTParserConstants.SIMPLE_EXP_TOKEN == valueSrcToken.kind) {
+            final Expression exp = ExpressionBuilder.simpleExpression(valueSrcToken.toString());
+            this.valueExtractor = new ValueExtractor() {
+
+                @Override
+                public Object eval(Exchange exchange, Object container) {
+                    return exp.evaluate(exchange, javaType);
+                }
+            };
+        } else if (SSPTParserConstants.PARAMETER_POS_TOKEN == valueSrcToken.kind) {
+
+            //remove leading :#
+            final String mapKey = valueSrcToken.toString().substring(2);
+            this.valueExtractor = new ValueExtractor() {
+                @Override
+                public Object eval(Exchange exchange, Object container) {
+                    return ((Map) container).get(mapKey);
+                }
+            };
+        }
     }
 
+    /*public Object getParameterValueFromContainer(Exchange exchange, Object container) {
+        if (this.valueExpression != null) {
+            return valueExpression.evaluate(exchange, this.getJavaType());
+        } else {
+            return getValueFromMap((Map<String, Object>) container);
+        }
+    }*/
+
+    /*private Object getValueFromMap(Map<String, Object> container) {
+        return container.get(mapKey);
+    }*/
+
     public String getName() {
         return name;
     }
@@ -45,12 +81,12 @@ public class InputParameter {
         return sqlType;
     }
 
-    public Expression getValueExpression() {
-        return valueExpression;
-    }
 
     public Class getJavaType() {
         return javaType;
     }
 
+    public ValueExtractor getValueExtractor() {
+        return valueExtractor;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ParseHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ParseHelper.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ParseHelper.java
index dd926ef..8a2d9b5 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ParseHelper.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ParseHelper.java
@@ -17,14 +17,31 @@
 package org.apache.camel.component.sql.stored.template.ast;
 
 import java.lang.reflect.Field;
-import java.math.BigInteger;
+import java.math.BigDecimal;
 import java.sql.Date;
 import java.sql.Types;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.springframework.util.ReflectionUtils;
 
 public final class ParseHelper {
 
+    static final Map<Integer, Class> SQL_TYPE_TO_JAVA_CLASS = new HashMap<>();
+
+    //somekind of mapping here https://docs.oracle.com/cd/E19501-01/819-3659/gcmaz/
+    //TODO: test with each SQL_TYPE_TO_JAVA_CLASS that JAVA conversion works!
+    static {
+        SQL_TYPE_TO_JAVA_CLASS.put(Types.INTEGER, Integer.class);
+        SQL_TYPE_TO_JAVA_CLASS.put(Types.VARCHAR, String.class);
+        SQL_TYPE_TO_JAVA_CLASS.put(Types.BIGINT, Long.class);
+        SQL_TYPE_TO_JAVA_CLASS.put(Types.CHAR, String.class);
+        SQL_TYPE_TO_JAVA_CLASS.put(Types.DECIMAL, BigDecimal.class);
+        SQL_TYPE_TO_JAVA_CLASS.put(Types.BOOLEAN, Boolean.class);
+        SQL_TYPE_TO_JAVA_CLASS.put(Types.DATE, Date.class);
+        SQL_TYPE_TO_JAVA_CLASS.put(Types.TIMESTAMP, Date.class);
+    }
+
     private ParseHelper() {
     }
 
@@ -41,36 +58,10 @@ public final class ParseHelper {
     }
 
     public static Class sqlTypeToJavaType(int sqlType, String sqlTypeStr) {
-        //TODO: as rest of types.
-        //TODO: add test for each type.
-        Class ret;
-        switch (sqlType) {
-        case Types.INTEGER:
-            ret = Integer.class;
-            break;
-        case Types.VARCHAR:
-            ret = String.class;
-            break;
-        case Types.BIGINT:
-            ret = BigInteger.class;
-            break;
-        case Types.CHAR:
-            ret = String.class;
-            break;
-        case Types.BOOLEAN:
-            ret = Boolean.class;
-            break;
-        case Types.DATE:
-            ret = Date.class;
-            break;
-        case Types.TIMESTAMP:
-            ret = Date.class;
-            break;
-        default:
+        Class javaType = SQL_TYPE_TO_JAVA_CLASS.get(sqlType);
+        if (javaType == null) {
             throw new ParseRuntimeException("Unable to map SQL type " + sqlTypeStr + " to Java type");
         }
-
-        return ret;
+        return javaType;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/Template.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/Template.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/Template.java
index 935609c..290abde 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/Template.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/Template.java
@@ -24,16 +24,11 @@ import java.util.List;
  */
 public class Template {
 
+    private final List<Object> parameterList = new ArrayList<>();
     private String procedureName;
-    private final List<InputParameter> inputParameterList = new ArrayList<>();
-    private final List<OutParameter> outParameterList = new ArrayList<>();
 
     public void addParameter(Object parameter) {
-        if (parameter instanceof OutParameter) {
-            outParameterList.add((OutParameter) parameter);
-        } else {
-            inputParameterList.add((InputParameter) parameter);
-        }
+        parameterList.add(parameter);
     }
 
     public String getProcedureName() {
@@ -44,12 +39,8 @@ public class Template {
         this.procedureName = procedureName;
     }
 
-    public List<InputParameter> getInputParameterList() {
-        return inputParameterList;
-    }
-
-    public List<OutParameter> getOutParameterList() {
-        return outParameterList;
+    public List<Object> getParameterList() {
+        return parameterList;
     }
 }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ValueExtractor.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ValueExtractor.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ValueExtractor.java
new file mode 100644
index 0000000..228c758
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ValueExtractor.java
@@ -0,0 +1,29 @@
+/**
+ * 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.camel.component.sql.stored.template.ast;
+
+import org.apache.camel.Exchange;
+
+/**
+ * ValueExtractotr extracts value from Exchange and Container object.
+ * Usually each input parameter has one extractor which extracts
+ * parameter value from input "map" to be sent into db.
+ */
+public interface ValueExtractor {
+
+    Object eval(Exchange exchange, Object container);
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/ParseException.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/ParseException.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/ParseException.java
index 30e4737..b3829dd 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/ParseException.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/ParseException.java
@@ -13,175 +13,168 @@ package org.apache.camel.component.sql.stored.template.generated;
  */
 public class ParseException extends Exception {
 
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
+    /**
+     * The version identifier for this Serializable class.
+     * Increment only if the <i>serialized</i> form of the
+     * class changes.
+     */
+    private static final long serialVersionUID = 1L;
+    /**
+     * This is the last token that has been consumed successfully.  If
+     * this object has been created due to a parse error, the token
+     * followng this token will (therefore) be the first error token.
+     */
+    public Token currentToken;
+    /**
+     * Each entry in this array is an array of integers.  Each array
+     * of integers represents a sequence of tokens (by their ordinal
+     * values) that is expected at this point of the parse.
+     */
+    public int[][] expectedTokenSequences;
+    /**
+     * This is a reference to the "tokenImage" array of the generated
+     * parser within which the parse error occurred.  This array is
+     * defined in the generated ...Constants interface.
+     */
+    public String[] tokenImage;
+    /**
+     * The end of line string for this machine.
+     */
+    protected String eol = System.getProperty("line.separator", "\n");
 
-  /**
-   * This constructor is used by the method "generateParseException"
-   * in the generated parser.  Calling this constructor generates
-   * a new object of this type with the fields "currentToken",
-   * "expectedTokenSequences", and "tokenImage" set.
-   */
-  public ParseException(Token currentTokenVal,
-                        int[][] expectedTokenSequencesVal,
-                        String[] tokenImageVal
-                       )
-  {
-    super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
-    currentToken = currentTokenVal;
-    expectedTokenSequences = expectedTokenSequencesVal;
-    tokenImage = tokenImageVal;
-  }
-
-  /**
-   * The following constructors are for use by you for whatever
-   * purpose you can think of.  Constructing the exception in this
-   * manner makes the exception behave in the normal way - i.e., as
-   * documented in the class "Throwable".  The fields "errorToken",
-   * "expectedTokenSequences", and "tokenImage" do not contain
-   * relevant information.  The JavaCC generated code does not use
-   * these constructors.
-   */
-
-  public ParseException() {
-    super();
-  }
-
-  /** Constructor with message. */
-  public ParseException(String message) {
-    super(message);
-  }
-
-
-  /**
-   * This is the last token that has been consumed successfully.  If
-   * this object has been created due to a parse error, the token
-   * followng this token will (therefore) be the first error token.
-   */
-  public Token currentToken;
-
-  /**
-   * Each entry in this array is an array of integers.  Each array
-   * of integers represents a sequence of tokens (by their ordinal
-   * values) that is expected at this point of the parse.
-   */
-  public int[][] expectedTokenSequences;
+    /**
+     * This constructor is used by the method "generateParseException"
+     * in the generated parser.  Calling this constructor generates
+     * a new object of this type with the fields "currentToken",
+     * "expectedTokenSequences", and "tokenImage" set.
+     */
+    public ParseException(Token currentTokenVal,
+                          int[][] expectedTokenSequencesVal,
+                          String[] tokenImageVal
+    ) {
+        super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
+        currentToken = currentTokenVal;
+        expectedTokenSequences = expectedTokenSequencesVal;
+        tokenImage = tokenImageVal;
+    }
 
-  /**
-   * This is a reference to the "tokenImage" array of the generated
-   * parser within which the parse error occurred.  This array is
-   * defined in the generated ...Constants interface.
-   */
-  public String[] tokenImage;
+    /**
+     * The following constructors are for use by you for whatever
+     * purpose you can think of.  Constructing the exception in this
+     * manner makes the exception behave in the normal way - i.e., as
+     * documented in the class "Throwable".  The fields "errorToken",
+     * "expectedTokenSequences", and "tokenImage" do not contain
+     * relevant information.  The JavaCC generated code does not use
+     * these constructors.
+     */
 
-  /**
-   * It uses "currentToken" and "expectedTokenSequences" to generate a parse
-   * error message and returns it.  If this object has been created
-   * due to a parse error, and you do not catch it (it gets thrown
-   * from the parser) the correct error message
-   * gets displayed.
-   */
-  private static String initialise(Token currentToken,
-                           int[][] expectedTokenSequences,
-                           String[] tokenImage) {
-    String eol = System.getProperty("line.separator", "\n");
-    StringBuffer expected = new StringBuffer();
-    int maxSize = 0;
-    for (int i = 0; i < expectedTokenSequences.length; i++) {
-      if (maxSize < expectedTokenSequences[i].length) {
-        maxSize = expectedTokenSequences[i].length;
-      }
-      for (int j = 0; j < expectedTokenSequences[i].length; j++) {
-        expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
-      }
-      if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
-        expected.append("...");
-      }
-      expected.append(eol).append("    ");
+    public ParseException() {
+        super();
     }
-    String retval = "Encountered \"";
-    Token tok = currentToken.next;
-    for (int i = 0; i < maxSize; i++) {
-      if (i != 0) retval += " ";
-      if (tok.kind == 0) {
-        retval += tokenImage[0];
-        break;
-      }
-      retval += " " + tokenImage[tok.kind];
-      retval += " \"";
-      retval += add_escapes(tok.image);
-      retval += " \"";
-      tok = tok.next;
-    }
-    retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
-    retval += "." + eol;
-    if (expectedTokenSequences.length == 1) {
-      retval += "Was expecting:" + eol + "    ";
-    } else {
-      retval += "Was expecting one of:" + eol + "    ";
+
+    /** Constructor with message. */
+    public ParseException(String message) {
+        super(message);
     }
-    retval += expected.toString();
-    return retval;
-  }
 
-  /**
-   * The end of line string for this machine.
-   */
-  protected String eol = System.getProperty("line.separator", "\n");
+    /**
+     * It uses "currentToken" and "expectedTokenSequences" to generate a parse
+     * error message and returns it.  If this object has been created
+     * due to a parse error, and you do not catch it (it gets thrown
+     * from the parser) the correct error message
+     * gets displayed.
+     */
+    private static String initialise(Token currentToken,
+                                     int[][] expectedTokenSequences,
+                                     String[] tokenImage) {
+        String eol = System.getProperty("line.separator", "\n");
+        StringBuffer expected = new StringBuffer();
+        int maxSize = 0;
+        for (int i = 0; i < expectedTokenSequences.length; i++) {
+            if (maxSize < expectedTokenSequences[i].length) {
+                maxSize = expectedTokenSequences[i].length;
+            }
+            for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+                expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
+            }
+            if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+                expected.append("...");
+            }
+            expected.append(eol).append("    ");
+        }
+        String retval = "Encountered \"";
+        Token tok = currentToken.next;
+        for (int i = 0; i < maxSize; i++) {
+            if (i != 0) retval += " ";
+            if (tok.kind == 0) {
+                retval += tokenImage[0];
+                break;
+            }
+            retval += " " + tokenImage[tok.kind];
+            retval += " \"";
+            retval += add_escapes(tok.image);
+            retval += " \"";
+            tok = tok.next;
+        }
+        retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
+        retval += "." + eol;
+        if (expectedTokenSequences.length == 1) {
+            retval += "Was expecting:" + eol + "    ";
+        } else {
+            retval += "Was expecting one of:" + eol + "    ";
+        }
+        retval += expected.toString();
+        return retval;
+    }
 
-  /**
-   * Used to convert raw characters to their escaped version
-   * when these raw version cannot be used as part of an ASCII
-   * string literal.
-   */
-  static String add_escapes(String str) {
-      StringBuffer retval = new StringBuffer();
-      char ch;
-      for (int i = 0; i < str.length(); i++) {
-        switch (str.charAt(i))
-        {
-           case 0 :
-              continue;
-           case '\b':
-              retval.append("\\b");
-              continue;
-           case '\t':
-              retval.append("\\t");
-              continue;
-           case '\n':
-              retval.append("\\n");
-              continue;
-           case '\f':
-              retval.append("\\f");
-              continue;
-           case '\r':
-              retval.append("\\r");
-              continue;
-           case '\"':
-              retval.append("\\\"");
-              continue;
-           case '\'':
-              retval.append("\\\'");
-              continue;
-           case '\\':
-              retval.append("\\\\");
-              continue;
-           default:
-              if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-                 String s = "0000" + Integer.toString(ch, 16);
-                 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-              } else {
-                 retval.append(ch);
-              }
-              continue;
+    /**
+     * Used to convert raw characters to their escaped version
+     * when these raw version cannot be used as part of an ASCII
+     * string literal.
+     */
+    static String add_escapes(String str) {
+        StringBuffer retval = new StringBuffer();
+        char ch;
+        for (int i = 0; i < str.length(); i++) {
+            switch (str.charAt(i)) {
+                case 0:
+                    continue;
+                case '\b':
+                    retval.append("\\b");
+                    continue;
+                case '\t':
+                    retval.append("\\t");
+                    continue;
+                case '\n':
+                    retval.append("\\n");
+                    continue;
+                case '\f':
+                    retval.append("\\f");
+                    continue;
+                case '\r':
+                    retval.append("\\r");
+                    continue;
+                case '\"':
+                    retval.append("\\\"");
+                    continue;
+                case '\'':
+                    retval.append("\\\'");
+                    continue;
+                case '\\':
+                    retval.append("\\\\");
+                    continue;
+                default:
+                    if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                        String s = "0000" + Integer.toString(ch, 16);
+                        retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+                    } else {
+                        retval.append(ch);
+                    }
+                    continue;
+            }
         }
-      }
-      return retval.toString();
-   }
+        return retval.toString();
+    }
 
 }
 /* JavaCC - OriginalChecksum=5189b93605d5a3d3833ed059f46e94c9 (do not edit this line) */


[2/3] camel git commit: CAMEL-4725: Batch support and other options for Producer.

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParser.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParser.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParser.java
index b1e488c..27599f8 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParser.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParser.java
@@ -1,290 +1,328 @@
 /* Generated By:JavaCC: Do not edit this line. SSPTParser.java */
 package org.apache.camel.component.sql.stored.template.generated;
 
-import org.apache.camel.component.sql.stored.template.ast.*;
+import org.apache.camel.component.sql.stored.template.ast.InputParameter;
+import org.apache.camel.component.sql.stored.template.ast.OutParameter;
+import org.apache.camel.component.sql.stored.template.ast.ParseHelper;
+import org.apache.camel.component.sql.stored.template.ast.Template;
 
 public class SSPTParser implements SSPTParserConstants {
-   int paramaterNameCounter = 0;
+    static private int[] jj_la1_0;
 
-   String createNextParameterName() {
-      return "_"+(paramaterNameCounter++);
-   }
-
-  final public Template parse() throws ParseException {
-    Token procudureName;
-    Template template = new Template();
-    Object parameter = null;
-    procudureName = jj_consume_token(IDENTIFIER);
-    jj_consume_token(1);
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case 5:
-    case IDENTIFIER:
-      parameter = Parameter();
-                                                                 template.addParameter(parameter);
-      label_1:
-      while (true) {
-        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-        case 2:
-          ;
-          break;
-        default:
-          jj_la1[0] = jj_gen;
-          break label_1;
-        }
-        jj_consume_token(2);
-        parameter = Parameter();
-                template.addParameter(parameter);
-      }
-      break;
-    default:
-      jj_la1[1] = jj_gen;
-      ;
+    static {
+        jj_la1_init_0();
     }
-    jj_consume_token(3);
-    jj_consume_token(0);
-   template.setProcedureName(procudureName.toString());
-   {if (true) return template;}
-    throw new Error("Missing return statement in function");
-  }
 
-  final public Object Parameter() throws ParseException {
-    Object param;
-    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
-    case IDENTIFIER:
-      param = InputParameter();
-                                {if (true) return param;}
-      break;
-    case 5:
-      param = OutParameter();
-                                                                          {if (true) return param;}
-      break;
-    default:
-      jj_la1[2] = jj_gen;
-      jj_consume_token(-1);
-      throw new ParseException();
-    }
-    throw new Error("Missing return statement in function");
-  }
-
-  final public InputParameter InputParameter() throws ParseException {
-     String sqlTypeAsStr;
-     String name;
-     String valueSrcAsStr;
-    sqlTypeAsStr = ParameterSqlType();
-    jj_consume_token(4);
-    valueSrcAsStr = InputParameterSrc();
-        int sqlType = ParseHelper.parseSqlType(sqlTypeAsStr);
-        {if (true) return new InputParameter(createNextParameterName(),sqlType,valueSrcAsStr,ParseHelper.sqlTypeToJavaType(sqlType,sqlTypeAsStr));}
-    throw new Error("Missing return statement in function");
-  }
+    final private int[] jj_la1 = new int[4];
+    /** Generated Token Manager. */
+    public SSPTParserTokenManager token_source;
+    /** Current token. */
+    public Token token;
+    /** Next token. */
+    public Token jj_nt;
+    int paramaterNameCounter = 0;
+    SimpleCharStream jj_input_stream;
+    private int jj_ntk;
+    private int jj_gen;
+    private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
+    private int[] jj_expentry;
+    private int jj_kind = -1;
 
-  final public OutParameter OutParameter() throws ParseException {
-     String sqlType;
-     String name;
-     String outHeader;
-    jj_consume_token(5);
-    jj_consume_token(4);
-    sqlType = ParameterSqlType();
-    jj_consume_token(4);
-    outHeader = OutHeader();
-        {if (true) return new OutParameter(createNextParameterName(),ParseHelper.parseSqlType(sqlType),outHeader);}
-    throw new Error("Missing return statement in function");
-  }
+    /** Constructor with InputStream. */
+    public SSPTParser(java.io.InputStream stream) {
+        this(stream, null);
+    }
 
-  final public String ParameterSqlType() throws ParseException {
-    Token t;
-    t = jj_consume_token(IDENTIFIER);
-        {if (true) return t.toString();}
-    throw new Error("Missing return statement in function");
-  }
+    /** Constructor with InputStream and supplied encoding */
+    public SSPTParser(java.io.InputStream stream, String encoding) {
+        try {
+            jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1);
+        } catch (java.io.UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+        token_source = new SSPTParserTokenManager(jj_input_stream);
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 4; i++) jj_la1[i] = -1;
+    }
 
-  final public String OutHeader() throws ParseException {
- Token token;
-    token = jj_consume_token(IDENTIFIER);
-        {if (true) return token.toString();}
-    throw new Error("Missing return statement in function");
-  }
+    /** Constructor. */
+    public SSPTParser(java.io.Reader stream) {
+        jj_input_stream = new SimpleCharStream(stream, 1, 1);
+        token_source = new SSPTParserTokenManager(jj_input_stream);
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 4; i++) jj_la1[i] = -1;
+    }
 
-  final public String InputParameterSrc() throws ParseException {
-    String ret;
-    ret = SimpleExpression();
-        {if (true) return ret;}
-    throw new Error("Missing return statement in function");
-  }
+    /** Constructor with generated Token Manager. */
+    public SSPTParser(SSPTParserTokenManager tm) {
+        token_source = tm;
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 4; i++) jj_la1[i] = -1;
+    }
 
-  final public String SimpleExpression() throws ParseException {
- Token t = null;
-    t = jj_consume_token(SIMPLE_EXP_TOKEN);
-    {if (true) return t.toString();}
-    throw new Error("Missing return statement in function");
-  }
+    private static void jj_la1_init_0() {
+        jj_la1_0 = new int[]{0x4, 0x820, 0x820, 0x600,};
+    }
 
-  /** Generated Token Manager. */
-  public SSPTParserTokenManager token_source;
-  SimpleCharStream jj_input_stream;
-  /** Current token. */
-  public Token token;
-  /** Next token. */
-  public Token jj_nt;
-  private int jj_ntk;
-  private int jj_gen;
-  final private int[] jj_la1 = new int[3];
-  static private int[] jj_la1_0;
-  static {
-      jj_la1_init_0();
-   }
-   private static void jj_la1_init_0() {
-      jj_la1_0 = new int[] {0x4,0x220,0x220,};
-   }
+    String createNextParameterName() {
+        return "_" + (paramaterNameCounter++);
+    }
 
-  /** Constructor with InputStream. */
-  public SSPTParser(java.io.InputStream stream) {
-     this(stream, null);
-  }
-  /** Constructor with InputStream and supplied encoding */
-  public SSPTParser(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source = new SSPTParserTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 3; i++) jj_la1[i] = -1;
-  }
+    final public Template parse() throws ParseException {
+        Token procudureName;
+        Template template = new Template();
+        Object parameter = null;
+        procudureName = jj_consume_token(IDENTIFIER);
+        jj_consume_token(1);
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case 5:
+            case IDENTIFIER:
+                parameter = Parameter();
+                template.addParameter(parameter);
+                label_1:
+                while (true) {
+                    switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+                        case 2:
+                            ;
+                            break;
+                        default:
+                            jj_la1[0] = jj_gen;
+                            break label_1;
+                    }
+                    jj_consume_token(2);
+                    parameter = Parameter();
+                    template.addParameter(parameter);
+                }
+                break;
+            default:
+                jj_la1[1] = jj_gen;
+                ;
+        }
+        jj_consume_token(3);
+        jj_consume_token(0);
+        template.setProcedureName(procudureName.toString());
+        {
+            if (true) return template;
+        }
+        throw new Error("Missing return statement in function");
+    }
 
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream) {
-     ReInit(stream, null);
-  }
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream stream, String encoding) {
-    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 3; i++) jj_la1[i] = -1;
-  }
+    final public Object Parameter() throws ParseException {
+        Object param;
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case IDENTIFIER:
+                param = InputParameter();
+            {
+                if (true) return param;
+            }
+            break;
+            case 5:
+                param = OutParameter();
+            {
+                if (true) return param;
+            }
+            break;
+            default:
+                jj_la1[2] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+        }
+        throw new Error("Missing return statement in function");
+    }
 
-  /** Constructor. */
-  public SSPTParser(java.io.Reader stream) {
-    jj_input_stream = new SimpleCharStream(stream, 1, 1);
-    token_source = new SSPTParserTokenManager(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 3; i++) jj_la1[i] = -1;
-  }
+    final public InputParameter InputParameter() throws ParseException {
+        String sqlTypeAsStr;
+        String name;
+        Token valueSrcToken;
+        sqlTypeAsStr = ParameterSqlType();
+        jj_consume_token(4);
+        valueSrcToken = InputParameterSrc();
+        int sqlType = ParseHelper.parseSqlType(sqlTypeAsStr);
+        {
+            if (true)
+                return new InputParameter(createNextParameterName(), sqlType, valueSrcToken, ParseHelper.sqlTypeToJavaType(sqlType,
+                        sqlTypeAsStr));
+        }
+        throw new Error("Missing return statement in function");
+    }
 
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader stream) {
-    jj_input_stream.ReInit(stream, 1, 1);
-    token_source.ReInit(jj_input_stream);
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 3; i++) jj_la1[i] = -1;
-  }
+    final public OutParameter OutParameter() throws ParseException {
+        String sqlType;
+        String name;
+        String outHeader;
+        jj_consume_token(5);
+        jj_consume_token(4);
+        sqlType = ParameterSqlType();
+        jj_consume_token(4);
+        outHeader = OutHeader();
+        {
+            if (true) return new OutParameter(createNextParameterName(), ParseHelper.parseSqlType(sqlType), outHeader);
+        }
+        throw new Error("Missing return statement in function");
+    }
 
-  /** Constructor with generated Token Manager. */
-  public SSPTParser(SSPTParserTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 3; i++) jj_la1[i] = -1;
-  }
+    final public String ParameterSqlType() throws ParseException {
+        Token t;
+        t = jj_consume_token(IDENTIFIER);
+        {
+            if (true) return t.toString();
+        }
+        throw new Error("Missing return statement in function");
+    }
 
-  /** Reinitialise. */
-  public void ReInit(SSPTParserTokenManager tm) {
-    token_source = tm;
-    token = new Token();
-    jj_ntk = -1;
-    jj_gen = 0;
-    for (int i = 0; i < 3; i++) jj_la1[i] = -1;
-  }
+    final public String OutHeader() throws ParseException {
+        Token token;
+        token = jj_consume_token(IDENTIFIER);
+        {
+            if (true) return token.toString();
+        }
+        throw new Error("Missing return statement in function");
+    }
 
-  private Token jj_consume_token(int kind) throws ParseException {
-    Token oldToken;
-    if ((oldToken = token).next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    if (token.kind == kind) {
-      jj_gen++;
-      return token;
+    final public Token InputParameterSrc() throws ParseException {
+        Token ret = null;
+        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
+            case SIMPLE_EXP_TOKEN:
+                ret = jj_consume_token(SIMPLE_EXP_TOKEN);
+            {
+                if (true) return ret;
+            }
+            break;
+            case PARAMETER_POS_TOKEN:
+                ret = jj_consume_token(PARAMETER_POS_TOKEN);
+            {
+                if (true) return ret;
+            }
+            break;
+            default:
+                jj_la1[3] = jj_gen;
+                jj_consume_token(-1);
+                throw new ParseException();
+        }
+        throw new Error("Missing return statement in function");
     }
-    token = oldToken;
-    jj_kind = kind;
-    throw generateParseException();
-  }
 
+    /** Reinitialise. */
+    public void ReInit(java.io.InputStream stream) {
+        ReInit(stream, null);
+    }
 
-/** Get the next Token. */
-  final public Token getNextToken() {
-    if (token.next != null) token = token.next;
-    else token = token.next = token_source.getNextToken();
-    jj_ntk = -1;
-    jj_gen++;
-    return token;
-  }
+    /** Reinitialise. */
+    public void ReInit(java.io.InputStream stream, String encoding) {
+        try {
+            jj_input_stream.ReInit(stream, encoding, 1, 1);
+        } catch (java.io.UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+        token_source.ReInit(jj_input_stream);
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 4; i++) jj_la1[i] = -1;
+    }
 
-/** Get the specific Token. */
-  final public Token getToken(int index) {
-    Token t = token;
-    for (int i = 0; i < index; i++) {
-      if (t.next != null) t = t.next;
-      else t = t.next = token_source.getNextToken();
+    /** Reinitialise. */
+    public void ReInit(java.io.Reader stream) {
+        jj_input_stream.ReInit(stream, 1, 1);
+        token_source.ReInit(jj_input_stream);
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 4; i++) jj_la1[i] = -1;
     }
-    return t;
-  }
 
-  private int jj_ntk() {
-    if ((jj_nt=token.next) == null)
-      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
-    else
-      return (jj_ntk = jj_nt.kind);
-  }
+    /** Reinitialise. */
+    public void ReInit(SSPTParserTokenManager tm) {
+        token_source = tm;
+        token = new Token();
+        jj_ntk = -1;
+        jj_gen = 0;
+        for (int i = 0; i < 4; i++) jj_la1[i] = -1;
+    }
 
-  private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
-  private int[] jj_expentry;
-  private int jj_kind = -1;
+    private Token jj_consume_token(int kind) throws ParseException {
+        Token oldToken;
+        if ((oldToken = token).next != null) token = token.next;
+        else token = token.next = token_source.getNextToken();
+        jj_ntk = -1;
+        if (token.kind == kind) {
+            jj_gen++;
+            return token;
+        }
+        token = oldToken;
+        jj_kind = kind;
+        throw generateParseException();
+    }
 
-  /** Generate ParseException. */
-  public ParseException generateParseException() {
-    jj_expentries.clear();
-    boolean[] la1tokens = new boolean[10];
-    if (jj_kind >= 0) {
-      la1tokens[jj_kind] = true;
-      jj_kind = -1;
+    /** Get the next Token. */
+    final public Token getNextToken() {
+        if (token.next != null) token = token.next;
+        else token = token.next = token_source.getNextToken();
+        jj_ntk = -1;
+        jj_gen++;
+        return token;
     }
-    for (int i = 0; i < 3; i++) {
-      if (jj_la1[i] == jj_gen) {
-        for (int j = 0; j < 32; j++) {
-          if ((jj_la1_0[i] & (1<<j)) != 0) {
-            la1tokens[j] = true;
-          }
+
+    /** Get the specific Token. */
+    final public Token getToken(int index) {
+        Token t = token;
+        for (int i = 0; i < index; i++) {
+            if (t.next != null) t = t.next;
+            else t = t.next = token_source.getNextToken();
         }
-      }
+        return t;
     }
-    for (int i = 0; i < 10; i++) {
-      if (la1tokens[i]) {
-        jj_expentry = new int[1];
-        jj_expentry[0] = i;
-        jj_expentries.add(jj_expentry);
-      }
+
+    private int jj_ntk() {
+        if ((jj_nt = token.next) == null)
+            return (jj_ntk = (token.next = token_source.getNextToken()).kind);
+        else
+            return (jj_ntk = jj_nt.kind);
     }
-    int[][] exptokseq = new int[jj_expentries.size()][];
-    for (int i = 0; i < jj_expentries.size(); i++) {
-      exptokseq[i] = jj_expentries.get(i);
+
+    /** Generate ParseException. */
+    public ParseException generateParseException() {
+        jj_expentries.clear();
+        boolean[] la1tokens = new boolean[12];
+        if (jj_kind >= 0) {
+            la1tokens[jj_kind] = true;
+            jj_kind = -1;
+        }
+        for (int i = 0; i < 4; i++) {
+            if (jj_la1[i] == jj_gen) {
+                for (int j = 0; j < 32; j++) {
+                    if ((jj_la1_0[i] & (1 << j)) != 0) {
+                        la1tokens[j] = true;
+                    }
+                }
+            }
+        }
+        for (int i = 0; i < 12; i++) {
+            if (la1tokens[i]) {
+                jj_expentry = new int[1];
+                jj_expentry[0] = i;
+                jj_expentries.add(jj_expentry);
+            }
+        }
+        int[][] exptokseq = new int[jj_expentries.size()][];
+        for (int i = 0; i < jj_expentries.size(); i++) {
+            exptokseq[i] = jj_expentries.get(i);
+        }
+        return new ParseException(token, exptokseq, tokenImage);
     }
-    return new ParseException(token, exptokseq, tokenImage);
-  }
 
-  /** Enable tracing. */
-  final public void enable_tracing() {
-  }
+    /** Enable tracing. */
+    final public void enable_tracing() {
+    }
 
-  /** Disable tracing. */
-  final public void disable_tracing() {
-  }
+    /** Disable tracing. */
+    final public void disable_tracing() {
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParserConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParserConstants.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParserConstants.java
index fe80c22..147e050 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParserConstants.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParserConstants.java
@@ -8,32 +8,38 @@ package org.apache.camel.component.sql.stored.template.generated;
  */
 public interface SSPTParserConstants {
 
-  /** End of File. */
-  int EOF = 0;
-  /** RegularExpression Id. */
-  int DIGIT = 6;
-  /** RegularExpression Id. */
-  int LETTER = 7;
-  /** RegularExpression Id. */
-  int SIMPLE_EXP_TOKEN = 8;
-  /** RegularExpression Id. */
-  int IDENTIFIER = 9;
+    /** End of File. */
+    int EOF = 0;
+    /** RegularExpression Id. */
+    int DIGIT = 6;
+    /** RegularExpression Id. */
+    int LETTER = 7;
+    /** RegularExpression Id. */
+    int SPECIAL = 8;
+    /** RegularExpression Id. */
+    int SIMPLE_EXP_TOKEN = 9;
+    /** RegularExpression Id. */
+    int PARAMETER_POS_TOKEN = 10;
+    /** RegularExpression Id. */
+    int IDENTIFIER = 11;
 
-  /** Lexical state. */
-  int DEFAULT = 0;
+    /** Lexical state. */
+    int DEFAULT = 0;
 
-  /** Literal token values. */
-  String[] tokenImage = {
-    "<EOF>",
-    "\"(\"",
-    "\",\"",
-    "\")\"",
-    "\" \"",
-    "\"OUT\"",
-    "<DIGIT>",
-    "<LETTER>",
-    "<SIMPLE_EXP_TOKEN>",
-    "<IDENTIFIER>",
-  };
+    /** Literal token values. */
+    String[] tokenImage = {
+            "<EOF>",
+            "\"(\"",
+            "\",\"",
+            "\")\"",
+            "\" \"",
+            "\"OUT\"",
+            "<DIGIT>",
+            "<LETTER>",
+            "<SPECIAL>",
+            "<SIMPLE_EXP_TOKEN>",
+            "<PARAMETER_POS_TOKEN>",
+            "<IDENTIFIER>",
+    };
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParserTokenManager.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParserTokenManager.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParserTokenManager.java
index 4f76cb9..d1a65b8 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParserTokenManager.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SSPTParserTokenManager.java
@@ -1,366 +1,375 @@
 /* Generated By:JavaCC: Do not edit this line. SSPTParserTokenManager.java */
 package org.apache.camel.component.sql.stored.template.generated;
-import org.apache.camel.component.sql.stored.template.ast.*;
 
 /** Token Manager. */
-public class SSPTParserTokenManager implements SSPTParserConstants
-{
+public class SSPTParserTokenManager implements SSPTParserConstants {
 
-  /** Debug output. */
-  public  java.io.PrintStream debugStream = System.out;
-  /** Set debug output. */
-  public  void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
-private final int jjStopStringLiteralDfa_0(int pos, long active0)
-{
-   switch (pos)
-   {
-      case 0:
-         if ((active0 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 9;
-            return 5;
-         }
-         return -1;
-      case 1:
-         if ((active0 & 0x20L) != 0L)
-         {
-            jjmatchedKind = 9;
-            jjmatchedPos = 1;
-            return 5;
-         }
-         return -1;
-      default :
-         return -1;
-   }
-}
-private final int jjStartNfa_0(int pos, long active0)
-{
-   return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
-}
-private int jjStopAtPos(int pos, int kind)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   return pos + 1;
-}
-private int jjMoveStringLiteralDfa0_0()
-{
-   switch(curChar)
-   {
-      case 32:
-         return jjStopAtPos(0, 4);
-      case 40:
-         return jjStopAtPos(0, 1);
-      case 41:
-         return jjStopAtPos(0, 3);
-      case 44:
-         return jjStopAtPos(0, 2);
-      case 79:
-         return jjMoveStringLiteralDfa1_0(0x20L);
-      default :
-         return jjMoveNfa_0(3, 0);
-   }
-}
-private int jjMoveStringLiteralDfa1_0(long active0)
-{
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(0, active0);
-      return 1;
-   }
-   switch(curChar)
-   {
-      case 85:
-         return jjMoveStringLiteralDfa2_0(active0, 0x20L);
-      default :
-         break;
-   }
-   return jjStartNfa_0(0, active0);
-}
-private int jjMoveStringLiteralDfa2_0(long old0, long active0)
-{
-   if (((active0 &= old0)) == 0L)
-      return jjStartNfa_0(0, old0);
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) {
-      jjStopStringLiteralDfa_0(1, active0);
-      return 2;
-   }
-   switch(curChar)
-   {
-      case 84:
-         if ((active0 & 0x20L) != 0L)
-            return jjStartNfaWithStates_0(2, 5, 5);
-         break;
-      default :
-         break;
-   }
-   return jjStartNfa_0(1, active0);
-}
-private int jjStartNfaWithStates_0(int pos, int kind, int state)
-{
-   jjmatchedKind = kind;
-   jjmatchedPos = pos;
-   try { curChar = input_stream.readChar(); }
-   catch(java.io.IOException e) { return pos + 1; }
-   return jjMoveNfa_0(state, pos + 1);
-}
-private int jjMoveNfa_0(int startState, int curPos)
-{
-   int startsAt = 0;
-   jjnewStateCnt = 6;
-   int i = 1;
-   jjstateSet[0] = startState;
-   int kind = 0x7fffffff;
-   for (;;)
-   {
-      if (++jjround == 0x7fffffff)
-         ReInitRounds();
-      if (curChar < 64)
-      {
-         long l = 1L << curChar;
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 3:
-                  if (curChar == 36)
-                     jjstateSet[jjnewStateCnt++] = 0;
-                  break;
-               case 1:
-                  if ((0x3ff408100000000L & l) != 0L)
-                     jjAddStates(0, 1);
-                  break;
-               case 5:
-                  if ((0x3ff400000000000L & l) == 0L)
-                     break;
-                  if (kind > 9)
-                     kind = 9;
-                  jjstateSet[jjnewStateCnt++] = 5;
-                  break;
-               default : break;
+    /** Token literal values. */
+    public static final String[] jjstrLiteralImages = {
+            "", "\50", "\54", "\51", "\40", "\117\125\124", null, null, null, null, null,
+            null,};
+    /** Lexer state names. */
+    public static final String[] lexStateNames = {
+            "DEFAULT",
+    };
+    static final int[] jjnextStates = {
+            1, 2,
+    };
+    private final int[] jjrounds = new int[8];
+    private final int[] jjstateSet = new int[16];
+    /** Debug output. */
+    public java.io.PrintStream debugStream = System.out;
+    protected SimpleCharStream input_stream;
+    protected char curChar;
+    int curLexState = 0;
+    int defaultLexState = 0;
+    int jjnewStateCnt;
+    int jjround;
+    int jjmatchedPos;
+    int jjmatchedKind;
+
+    /** Constructor. */
+    public SSPTParserTokenManager(SimpleCharStream stream) {
+        if (SimpleCharStream.staticFlag)
+            throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
+        input_stream = stream;
+    }
+
+    /** Constructor. */
+    public SSPTParserTokenManager(SimpleCharStream stream, int lexState) {
+        this(stream);
+        SwitchTo(lexState);
+    }
+
+    /** Set debug output. */
+    public void setDebugStream(java.io.PrintStream ds) {
+        debugStream = ds;
+    }
+
+    private final int jjStopStringLiteralDfa_0(int pos, long active0) {
+        switch (pos) {
+            case 0:
+                if ((active0 & 0x20L) != 0L) {
+                    jjmatchedKind = 11;
+                    return 7;
+                }
+                return -1;
+            case 1:
+                if ((active0 & 0x20L) != 0L) {
+                    jjmatchedKind = 11;
+                    jjmatchedPos = 1;
+                    return 7;
+                }
+                return -1;
+            default:
+                return -1;
+        }
+    }
+
+    private final int jjStartNfa_0(int pos, long active0) {
+        return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
+    }
+
+    private int jjStopAtPos(int pos, int kind) {
+        jjmatchedKind = kind;
+        jjmatchedPos = pos;
+        return pos + 1;
+    }
+
+    private int jjMoveStringLiteralDfa0_0() {
+        switch (curChar) {
+            case 32:
+                return jjStopAtPos(0, 4);
+            case 40:
+                return jjStopAtPos(0, 1);
+            case 41:
+                return jjStopAtPos(0, 3);
+            case 44:
+                return jjStopAtPos(0, 2);
+            case 79:
+                return jjMoveStringLiteralDfa1_0(0x20L);
+            default:
+                return jjMoveNfa_0(3, 0);
+        }
+    }
+
+    private int jjMoveStringLiteralDfa1_0(long active0) {
+        try {
+            curChar = input_stream.readChar();
+        } catch (java.io.IOException e) {
+            jjStopStringLiteralDfa_0(0, active0);
+            return 1;
+        }
+        switch (curChar) {
+            case 85:
+                return jjMoveStringLiteralDfa2_0(active0, 0x20L);
+            default:
+                break;
+        }
+        return jjStartNfa_0(0, active0);
+    }
+
+    private int jjMoveStringLiteralDfa2_0(long old0, long active0) {
+        if (((active0 &= old0)) == 0L)
+            return jjStartNfa_0(0, old0);
+        try {
+            curChar = input_stream.readChar();
+        } catch (java.io.IOException e) {
+            jjStopStringLiteralDfa_0(1, active0);
+            return 2;
+        }
+        switch (curChar) {
+            case 84:
+                if ((active0 & 0x20L) != 0L)
+                    return jjStartNfaWithStates_0(2, 5, 7);
+                break;
+            default:
+                break;
+        }
+        return jjStartNfa_0(1, active0);
+    }
+
+    private int jjStartNfaWithStates_0(int pos, int kind, int state) {
+        jjmatchedKind = kind;
+        jjmatchedPos = pos;
+        try {
+            curChar = input_stream.readChar();
+        } catch (java.io.IOException e) {
+            return pos + 1;
+        }
+        return jjMoveNfa_0(state, pos + 1);
+    }
+
+    private int jjMoveNfa_0(int startState, int curPos) {
+        int startsAt = 0;
+        jjnewStateCnt = 8;
+        int i = 1;
+        jjstateSet[0] = startState;
+        int kind = 0x7fffffff;
+        for (; ; ) {
+            if (++jjround == 0x7fffffff)
+                ReInitRounds();
+            if (curChar < 64) {
+                long l = 1L << curChar;
+                do {
+                    switch (jjstateSet[--i]) {
+                        case 3:
+                            if ((0x3ff609c00000000L & l) != 0L) {
+                                if (kind > 11)
+                                    kind = 11;
+                                jjCheckNAdd(7);
+                            } else if (curChar == 58)
+                                jjstateSet[jjnewStateCnt++] = 4;
+                            if (curChar == 36)
+                                jjstateSet[jjnewStateCnt++] = 0;
+                            break;
+                        case 1:
+                            if ((0x3ff609d00000000L & l) != 0L)
+                                jjAddStates(0, 1);
+                            break;
+                        case 4:
+                            if (curChar == 35)
+                                jjCheckNAdd(5);
+                            break;
+                        case 5:
+                            if ((0x3ff609c00000000L & l) == 0L)
+                                break;
+                            if (kind > 10)
+                                kind = 10;
+                            jjCheckNAdd(5);
+                            break;
+                        case 6:
+                            if (curChar == 58)
+                                jjstateSet[jjnewStateCnt++] = 4;
+                            break;
+                        case 7:
+                            if ((0x3ff609c00000000L & l) == 0L)
+                                break;
+                            if (kind > 11)
+                                kind = 11;
+                            jjCheckNAdd(7);
+                            break;
+                        default:
+                            break;
+                    }
+                } while (i != startsAt);
+            } else if (curChar < 128) {
+                long l = 1L << (curChar & 077);
+                do {
+                    switch (jjstateSet[--i]) {
+                        case 3:
+                        case 7:
+                            if ((0x2ffffffe87fffffeL & l) == 0L)
+                                break;
+                            if (kind > 11)
+                                kind = 11;
+                            jjCheckNAdd(7);
+                            break;
+                        case 0:
+                            if (curChar == 123)
+                                jjCheckNAdd(1);
+                            break;
+                        case 1:
+                            if ((0x2ffffffe87fffffeL & l) != 0L)
+                                jjCheckNAddTwoStates(1, 2);
+                            break;
+                        case 2:
+                            if (curChar == 125 && kind > 9)
+                                kind = 9;
+                            break;
+                        case 5:
+                            if ((0x2ffffffe87fffffeL & l) == 0L)
+                                break;
+                            if (kind > 10)
+                                kind = 10;
+                            jjstateSet[jjnewStateCnt++] = 5;
+                            break;
+                        default:
+                            break;
+                    }
+                } while (i != startsAt);
+            } else {
+                int i2 = (curChar & 0xff) >> 6;
+                long l2 = 1L << (curChar & 077);
+                do {
+                    switch (jjstateSet[--i]) {
+                        default:
+                            break;
+                    }
+                } while (i != startsAt);
             }
-         } while(i != startsAt);
-      }
-      else if (curChar < 128)
-      {
-         long l = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               case 3:
-               case 5:
-                  if ((0x7fffffe07fffffeL & l) == 0L)
-                     break;
-                  if (kind > 9)
-                     kind = 9;
-                  jjCheckNAdd(5);
-                  break;
-               case 0:
-                  if (curChar == 123)
-                     jjCheckNAddTwoStates(1, 2);
-                  break;
-               case 1:
-                  if ((0x7fffffe07fffffeL & l) != 0L)
-                     jjCheckNAddTwoStates(1, 2);
-                  break;
-               case 2:
-                  if (curChar == 125)
-                     kind = 8;
-                  break;
-               default : break;
+            if (kind != 0x7fffffff) {
+                jjmatchedKind = kind;
+                jjmatchedPos = curPos;
+                kind = 0x7fffffff;
             }
-         } while(i != startsAt);
-      }
-      else
-      {
-         int i2 = (curChar & 0xff) >> 6;
-         long l2 = 1L << (curChar & 077);
-         do
-         {
-            switch(jjstateSet[--i])
-            {
-               default : break;
+            ++curPos;
+            if ((i = jjnewStateCnt) == (startsAt = 8 - (jjnewStateCnt = startsAt)))
+                return curPos;
+            try {
+                curChar = input_stream.readChar();
+            } catch (java.io.IOException e) {
+                return curPos;
             }
-         } while(i != startsAt);
-      }
-      if (kind != 0x7fffffff)
-      {
-         jjmatchedKind = kind;
-         jjmatchedPos = curPos;
-         kind = 0x7fffffff;
-      }
-      ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 6 - (jjnewStateCnt = startsAt)))
-         return curPos;
-      try { curChar = input_stream.readChar(); }
-      catch(java.io.IOException e) { return curPos; }
-   }
-}
-static final int[] jjnextStates = {
-   1, 2, 
-};
+        }
+    }
 
-/** Token literal values. */
-public static final String[] jjstrLiteralImages = {
-"", "\50", "\54", "\51", "\40", "\117\125\124", null, null, null, null, };
+    /** Reinitialise parser. */
+    public void ReInit(SimpleCharStream stream) {
+        jjmatchedPos = jjnewStateCnt = 0;
+        curLexState = defaultLexState;
+        input_stream = stream;
+        ReInitRounds();
+    }
 
-/** Lexer state names. */
-public static final String[] lexStateNames = {
-   "DEFAULT",
-};
-protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[6];
-private final int[] jjstateSet = new int[12];
-protected char curChar;
-/** Constructor. */
-public SSPTParserTokenManager(SimpleCharStream stream){
-   if (SimpleCharStream.staticFlag)
-      throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
-   input_stream = stream;
-}
+    private void ReInitRounds() {
+        int i;
+        jjround = 0x80000001;
+        for (i = 8; i-- > 0; )
+            jjrounds[i] = 0x80000000;
+    }
 
-/** Constructor. */
-public SSPTParserTokenManager(SimpleCharStream stream, int lexState){
-   this(stream);
-   SwitchTo(lexState);
-}
+    /** Reinitialise parser. */
+    public void ReInit(SimpleCharStream stream, int lexState) {
+        ReInit(stream);
+        SwitchTo(lexState);
+    }
 
-/** Reinitialise parser. */
-public void ReInit(SimpleCharStream stream)
-{
-   jjmatchedPos = jjnewStateCnt = 0;
-   curLexState = defaultLexState;
-   input_stream = stream;
-   ReInitRounds();
-}
-private void ReInitRounds()
-{
-   int i;
-   jjround = 0x80000001;
-   for (i = 6; i-- > 0;)
-      jjrounds[i] = 0x80000000;
-}
+    /** Switch to specified lex state. */
+    public void SwitchTo(int lexState) {
+        if (lexState >= 1 || lexState < 0)
+            throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+        else
+            curLexState = lexState;
+    }
 
-/** Reinitialise parser. */
-public void ReInit(SimpleCharStream stream, int lexState)
-{
-   ReInit(stream);
-   SwitchTo(lexState);
-}
-
-/** Switch to specified lex state. */
-public void SwitchTo(int lexState)
-{
-   if (lexState >= 1 || lexState < 0)
-      throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
-   else
-      curLexState = lexState;
-}
+    protected Token jjFillToken() {
+        final Token t;
+        final String curTokenImage;
+        final int beginLine;
+        final int endLine;
+        final int beginColumn;
+        final int endColumn;
+        String im = jjstrLiteralImages[jjmatchedKind];
+        curTokenImage = (im == null) ? input_stream.GetImage() : im;
+        beginLine = input_stream.getBeginLine();
+        beginColumn = input_stream.getBeginColumn();
+        endLine = input_stream.getEndLine();
+        endColumn = input_stream.getEndColumn();
+        t = Token.newToken(jjmatchedKind, curTokenImage);
 
-protected Token jjFillToken()
-{
-   final Token t;
-   final String curTokenImage;
-   final int beginLine;
-   final int endLine;
-   final int beginColumn;
-   final int endColumn;
-   String im = jjstrLiteralImages[jjmatchedKind];
-   curTokenImage = (im == null) ? input_stream.GetImage() : im;
-   beginLine = input_stream.getBeginLine();
-   beginColumn = input_stream.getBeginColumn();
-   endLine = input_stream.getEndLine();
-   endColumn = input_stream.getEndColumn();
-   t = Token.newToken(jjmatchedKind, curTokenImage);
+        t.beginLine = beginLine;
+        t.endLine = endLine;
+        t.beginColumn = beginColumn;
+        t.endColumn = endColumn;
 
-   t.beginLine = beginLine;
-   t.endLine = endLine;
-   t.beginColumn = beginColumn;
-   t.endColumn = endColumn;
+        return t;
+    }
 
-   return t;
-}
+    /** Get the next Token. */
+    public Token getNextToken() {
+        Token matchedToken;
+        int curPos = 0;
 
-int curLexState = 0;
-int defaultLexState = 0;
-int jjnewStateCnt;
-int jjround;
-int jjmatchedPos;
-int jjmatchedKind;
+        EOFLoop:
+        for (; ; ) {
+            try {
+                curChar = input_stream.BeginToken();
+            } catch (java.io.IOException e) {
+                jjmatchedKind = 0;
+                matchedToken = jjFillToken();
+                return matchedToken;
+            }
 
-/** Get the next Token. */
-public Token getNextToken() 
-{
-  Token matchedToken;
-  int curPos = 0;
+            jjmatchedKind = 0x7fffffff;
+            jjmatchedPos = 0;
+            curPos = jjMoveStringLiteralDfa0_0();
+            if (jjmatchedKind != 0x7fffffff) {
+                if (jjmatchedPos + 1 < curPos)
+                    input_stream.backup(curPos - jjmatchedPos - 1);
+                matchedToken = jjFillToken();
+                return matchedToken;
+            }
+            int error_line = input_stream.getEndLine();
+            int error_column = input_stream.getEndColumn();
+            String error_after = null;
+            boolean EOFSeen = false;
+            try {
+                input_stream.readChar();
+                input_stream.backup(1);
+            } catch (java.io.IOException e1) {
+                EOFSeen = true;
+                error_after = curPos <= 1 ? "" : input_stream.GetImage();
+                if (curChar == '\n' || curChar == '\r') {
+                    error_line++;
+                    error_column = 0;
+                } else
+                    error_column++;
+            }
+            if (!EOFSeen) {
+                input_stream.backup(1);
+                error_after = curPos <= 1 ? "" : input_stream.GetImage();
+            }
+            throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+        }
+    }
 
-  EOFLoop :
-  for (;;)
-  {
-   try
-   {
-      curChar = input_stream.BeginToken();
-   }
-   catch(java.io.IOException e)
-   {
-      jjmatchedKind = 0;
-      matchedToken = jjFillToken();
-      return matchedToken;
-   }
+    private void jjCheckNAdd(int state) {
+        if (jjrounds[state] != jjround) {
+            jjstateSet[jjnewStateCnt++] = state;
+            jjrounds[state] = jjround;
+        }
+    }
 
-   jjmatchedKind = 0x7fffffff;
-   jjmatchedPos = 0;
-   curPos = jjMoveStringLiteralDfa0_0();
-   if (jjmatchedKind != 0x7fffffff)
-   {
-      if (jjmatchedPos + 1 < curPos)
-         input_stream.backup(curPos - jjmatchedPos - 1);
-         matchedToken = jjFillToken();
-         return matchedToken;
-   }
-   int error_line = input_stream.getEndLine();
-   int error_column = input_stream.getEndColumn();
-   String error_after = null;
-   boolean EOFSeen = false;
-   try { input_stream.readChar(); input_stream.backup(1); }
-   catch (java.io.IOException e1) {
-      EOFSeen = true;
-      error_after = curPos <= 1 ? "" : input_stream.GetImage();
-      if (curChar == '\n' || curChar == '\r') {
-         error_line++;
-         error_column = 0;
-      }
-      else
-         error_column++;
-   }
-   if (!EOFSeen) {
-      input_stream.backup(1);
-      error_after = curPos <= 1 ? "" : input_stream.GetImage();
-   }
-   throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
-  }
-}
+    private void jjAddStates(int start, int end) {
+        do {
+            jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+        } while (start++ != end);
+    }
 
-private void jjCheckNAdd(int state)
-{
-   if (jjrounds[state] != jjround)
-   {
-      jjstateSet[jjnewStateCnt++] = state;
-      jjrounds[state] = jjround;
-   }
-}
-private void jjAddStates(int start, int end)
-{
-   do {
-      jjstateSet[jjnewStateCnt++] = jjnextStates[start];
-   } while (start++ != end);
-}
-private void jjCheckNAddTwoStates(int state1, int state2)
-{
-   jjCheckNAdd(state1);
-   jjCheckNAdd(state2);
-}
+    private void jjCheckNAddTwoStates(int state1, int state2) {
+        jjCheckNAdd(state1);
+        jjCheckNAdd(state2);
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SimpleCharStream.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SimpleCharStream.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SimpleCharStream.java
index 38d998e..482ba76 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SimpleCharStream.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/SimpleCharStream.java
@@ -7,465 +7,413 @@ package org.apache.camel.component.sql.stored.template.generated;
  * contain only ASCII characters (without unicode processing).
  */
 
-public class SimpleCharStream
-{
-/** Whether parser is static. */
-  public static final boolean staticFlag = false;
-  int bufsize;
-  int available;
-  int tokenBegin;
-/** Position in buffer. */
-  public int bufpos = -1;
-  protected int bufline[];
-  protected int bufcolumn[];
-
-  protected int column = 0;
-  protected int line = 1;
-
-  protected boolean prevCharIsCR = false;
-  protected boolean prevCharIsLF = false;
-
-  protected java.io.Reader inputStream;
-
-  protected char[] buffer;
-  protected int maxNextCharInd = 0;
-  protected int inBuf = 0;
-  protected int tabSize = 8;
-
-  protected void setTabSize(int i) { tabSize = i; }
-  protected int getTabSize(int i) { return tabSize; }
-
-
-  protected void ExpandBuff(boolean wrapAround)
-  {
-    char[] newbuffer = new char[bufsize + 2048];
-    int newbufline[] = new int[bufsize + 2048];
-    int newbufcolumn[] = new int[bufsize + 2048];
-
-    try
-    {
-      if (wrapAround)
-      {
-        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-        System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
-        buffer = newbuffer;
-
-        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-        System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
-        bufline = newbufline;
-
-        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-        System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
-        bufcolumn = newbufcolumn;
-
-        maxNextCharInd = (bufpos += (bufsize - tokenBegin));
-      }
-      else
-      {
-        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
-        buffer = newbuffer;
-
-        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
-        bufline = newbufline;
-
-        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
-        bufcolumn = newbufcolumn;
-
-        maxNextCharInd = (bufpos -= tokenBegin);
-      }
-    }
-    catch (Throwable t)
-    {
-      throw new Error(t.getMessage());
-    }
-
-
-    bufsize += 2048;
-    available = bufsize;
-    tokenBegin = 0;
-  }
-
-  protected void FillBuff() throws java.io.IOException
-  {
-    if (maxNextCharInd == available)
-    {
-      if (available == bufsize)
-      {
-        if (tokenBegin > 2048)
-        {
-          bufpos = maxNextCharInd = 0;
-          available = tokenBegin;
+public class SimpleCharStream {
+    /** Whether parser is static. */
+    public static final boolean staticFlag = false;
+    /** Position in buffer. */
+    public int bufpos = -1;
+    protected int bufline[];
+    protected int bufcolumn[];
+    protected int column = 0;
+    protected int line = 1;
+    protected boolean prevCharIsCR = false;
+    protected boolean prevCharIsLF = false;
+    protected java.io.Reader inputStream;
+    protected char[] buffer;
+    protected int maxNextCharInd = 0;
+    protected int inBuf = 0;
+    protected int tabSize = 8;
+    int bufsize;
+    int available;
+    int tokenBegin;
+
+    /** Constructor. */
+    public SimpleCharStream(java.io.Reader dstream, int startline,
+                            int startcolumn, int buffersize) {
+        inputStream = dstream;
+        line = startline;
+        column = startcolumn - 1;
+
+        available = bufsize = buffersize;
+        buffer = new char[buffersize];
+        bufline = new int[buffersize];
+        bufcolumn = new int[buffersize];
+    }
+
+    /** Constructor. */
+    public SimpleCharStream(java.io.Reader dstream, int startline,
+                            int startcolumn) {
+        this(dstream, startline, startcolumn, 4096);
+    }
+
+
+    /** Constructor. */
+    public SimpleCharStream(java.io.Reader dstream) {
+        this(dstream, 1, 1, 4096);
+    }
+
+    /** Constructor. */
+    public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
+                            int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException {
+        this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+    }
+
+    /** Constructor. */
+    public SimpleCharStream(java.io.InputStream dstream, int startline,
+                            int startcolumn, int buffersize) {
+        this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+    }
+
+    /** Constructor. */
+    public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
+                            int startcolumn) throws java.io.UnsupportedEncodingException {
+        this(dstream, encoding, startline, startcolumn, 4096);
+    }
+
+    /** Constructor. */
+    public SimpleCharStream(java.io.InputStream dstream, int startline,
+                            int startcolumn) {
+        this(dstream, startline, startcolumn, 4096);
+    }
+
+    /** Constructor. */
+    public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException {
+        this(dstream, encoding, 1, 1, 4096);
+    }
+
+    /** Constructor. */
+    public SimpleCharStream(java.io.InputStream dstream) {
+        this(dstream, 1, 1, 4096);
+    }
+
+    protected void setTabSize(int i) {
+        tabSize = i;
+    }
+
+    protected int getTabSize(int i) {
+        return tabSize;
+    }
+
+    protected void ExpandBuff(boolean wrapAround) {
+        char[] newbuffer = new char[bufsize + 2048];
+        int newbufline[] = new int[bufsize + 2048];
+        int newbufcolumn[] = new int[bufsize + 2048];
+
+        try {
+            if (wrapAround) {
+                System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+                System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
+                buffer = newbuffer;
+
+                System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+                System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+                bufline = newbufline;
+
+                System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+                System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+                bufcolumn = newbufcolumn;
+
+                maxNextCharInd = (bufpos += (bufsize - tokenBegin));
+            } else {
+                System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+                buffer = newbuffer;
+
+                System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+                bufline = newbufline;
+
+                System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+                bufcolumn = newbufcolumn;
+
+                maxNextCharInd = (bufpos -= tokenBegin);
+            }
+        } catch (Throwable t) {
+            throw new Error(t.getMessage());
         }
-        else if (tokenBegin < 0)
-          bufpos = maxNextCharInd = 0;
-        else
-          ExpandBuff(false);
-      }
-      else if (available > tokenBegin)
+
+
+        bufsize += 2048;
         available = bufsize;
-      else if ((tokenBegin - available) < 2048)
-        ExpandBuff(true);
-      else
-        available = tokenBegin;
-    }
-
-    int i;
-    try {
-      if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1)
-      {
-        inputStream.close();
-        throw new java.io.IOException();
-      }
-      else
-        maxNextCharInd += i;
-      return;
-    }
-    catch(java.io.IOException e) {
-      --bufpos;
-      backup(0);
-      if (tokenBegin == -1)
+        tokenBegin = 0;
+    }
+
+    protected void FillBuff() throws java.io.IOException {
+        if (maxNextCharInd == available) {
+            if (available == bufsize) {
+                if (tokenBegin > 2048) {
+                    bufpos = maxNextCharInd = 0;
+                    available = tokenBegin;
+                } else if (tokenBegin < 0)
+                    bufpos = maxNextCharInd = 0;
+                else
+                    ExpandBuff(false);
+            } else if (available > tokenBegin)
+                available = bufsize;
+            else if ((tokenBegin - available) < 2048)
+                ExpandBuff(true);
+            else
+                available = tokenBegin;
+        }
+
+        int i;
+        try {
+            if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1) {
+                inputStream.close();
+                throw new java.io.IOException();
+            } else
+                maxNextCharInd += i;
+            return;
+        } catch (java.io.IOException e) {
+            --bufpos;
+            backup(0);
+            if (tokenBegin == -1)
+                tokenBegin = bufpos;
+            throw e;
+        }
+    }
+
+    /** Start. */
+    public char BeginToken() throws java.io.IOException {
+        tokenBegin = -1;
+        char c = readChar();
         tokenBegin = bufpos;
-      throw e;
-    }
-  }
-
-/** Start. */
-  public char BeginToken() throws java.io.IOException
-  {
-    tokenBegin = -1;
-    char c = readChar();
-    tokenBegin = bufpos;
-
-    return c;
-  }
-
-  protected void UpdateLineColumn(char c)
-  {
-    column++;
-
-    if (prevCharIsLF)
-    {
-      prevCharIsLF = false;
-      line += (column = 1);
-    }
-    else if (prevCharIsCR)
-    {
-      prevCharIsCR = false;
-      if (c == '\n')
-      {
-        prevCharIsLF = true;
-      }
-      else
-        line += (column = 1);
-    }
-
-    switch (c)
-    {
-      case '\r' :
-        prevCharIsCR = true;
-        break;
-      case '\n' :
-        prevCharIsLF = true;
-        break;
-      case '\t' :
-        column--;
-        column += (tabSize - (column % tabSize));
-        break;
-      default :
-        break;
-    }
-
-    bufline[bufpos] = line;
-    bufcolumn[bufpos] = column;
-  }
-
-/** Read a character. */
-  public char readChar() throws java.io.IOException
-  {
-    if (inBuf > 0)
-    {
-      --inBuf;
-
-      if (++bufpos == bufsize)
-        bufpos = 0;
-
-      return buffer[bufpos];
-    }
-
-    if (++bufpos >= maxNextCharInd)
-      FillBuff();
-
-    char c = buffer[bufpos];
-
-    UpdateLineColumn(c);
-    return c;
-  }
-
-  @Deprecated
-  /**
-   * @deprecated
-   * @see #getEndColumn
-   */
-
-  public int getColumn() {
-    return bufcolumn[bufpos];
-  }
-
-  @Deprecated
-  /**
-   * @deprecated
-   * @see #getEndLine
-   */
-
-  public int getLine() {
-    return bufline[bufpos];
-  }
-
-  /** Get token end column number. */
-  public int getEndColumn() {
-    return bufcolumn[bufpos];
-  }
-
-  /** Get token end line number. */
-  public int getEndLine() {
-     return bufline[bufpos];
-  }
-
-  /** Get token beginning column number. */
-  public int getBeginColumn() {
-    return bufcolumn[tokenBegin];
-  }
-
-  /** Get token beginning line number. */
-  public int getBeginLine() {
-    return bufline[tokenBegin];
-  }
-
-/** Backup a number of characters. */
-  public void backup(int amount) {
-
-    inBuf += amount;
-    if ((bufpos -= amount) < 0)
-      bufpos += bufsize;
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.Reader dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    available = bufsize = buffersize;
-    buffer = new char[buffersize];
-    bufline = new int[buffersize];
-    bufcolumn = new int[buffersize];
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.Reader dstream, int startline,
-                          int startcolumn)
-  {
-    this(dstream, startline, startcolumn, 4096);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.Reader dstream)
-  {
-    this(dstream, 1, 1, 4096);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    inputStream = dstream;
-    line = startline;
-    column = startcolumn - 1;
-
-    if (buffer == null || buffersize != buffer.length)
-    {
-      available = bufsize = buffersize;
-      buffer = new char[buffersize];
-      bufline = new int[buffersize];
-      bufcolumn = new int[buffersize];
-    }
-    prevCharIsLF = prevCharIsCR = false;
-    tokenBegin = inBuf = maxNextCharInd = 0;
-    bufpos = -1;
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader dstream, int startline,
-                     int startcolumn)
-  {
-    ReInit(dstream, startline, startcolumn, 4096);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.Reader dstream)
-  {
-    ReInit(dstream, 1, 1, 4096);
-  }
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
-  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-    this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream, int startline,
-  int startcolumn, int buffersize)
-  {
-    this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
-                          int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-    this(dstream, encoding, startline, startcolumn, 4096);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream, int startline,
-                          int startcolumn)
-  {
-    this(dstream, startline, startcolumn, 4096);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-    this(dstream, encoding, 1, 1, 4096);
-  }
-
-  /** Constructor. */
-  public SimpleCharStream(java.io.InputStream dstream)
-  {
-    this(dstream, 1, 1, 4096);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-                          int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-                          int startcolumn, int buffersize)
-  {
-    ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(dstream, encoding, 1, 1, 4096);
-  }
-
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream)
-  {
-    ReInit(dstream, 1, 1, 4096);
-  }
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
-                     int startcolumn) throws java.io.UnsupportedEncodingException
-  {
-    ReInit(dstream, encoding, startline, startcolumn, 4096);
-  }
-  /** Reinitialise. */
-  public void ReInit(java.io.InputStream dstream, int startline,
-                     int startcolumn)
-  {
-    ReInit(dstream, startline, startcolumn, 4096);
-  }
-  /** Get token literal value. */
-  public String GetImage()
-  {
-    if (bufpos >= tokenBegin)
-      return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
-    else
-      return new String(buffer, tokenBegin, bufsize - tokenBegin) +
-                            new String(buffer, 0, bufpos + 1);
-  }
-
-  /** Get the suffix. */
-  public char[] GetSuffix(int len)
-  {
-    char[] ret = new char[len];
-
-    if ((bufpos + 1) >= len)
-      System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
-    else
-    {
-      System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
-                                                        len - bufpos - 1);
-      System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
-    }
-
-    return ret;
-  }
-
-  /** Reset buffer when finished. */
-  public void Done()
-  {
-    buffer = null;
-    bufline = null;
-    bufcolumn = null;
-  }
-
-  /**
-   * Method to adjust line and column numbers for the start of a token.
-   */
-  public void adjustBeginLineColumn(int newLine, int newCol)
-  {
-    int start = tokenBegin;
-    int len;
-
-    if (bufpos >= tokenBegin)
-    {
-      len = bufpos - tokenBegin + inBuf + 1;
-    }
-    else
-    {
-      len = bufsize - tokenBegin + bufpos + 1 + inBuf;
-    }
-
-    int i = 0, j = 0, k = 0;
-    int nextColDiff = 0, columnDiff = 0;
-
-    while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
-    {
-      bufline[j] = newLine;
-      nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
-      bufcolumn[j] = newCol + columnDiff;
-      columnDiff = nextColDiff;
-      i++;
-    }
-
-    if (i < len)
-    {
-      bufline[j] = newLine++;
-      bufcolumn[j] = newCol + columnDiff;
-
-      while (i++ < len)
-      {
-        if (bufline[j = start % bufsize] != bufline[++start % bufsize])
-          bufline[j] = newLine++;
+
+        return c;
+    }
+
+    protected void UpdateLineColumn(char c) {
+        column++;
+
+        if (prevCharIsLF) {
+            prevCharIsLF = false;
+            line += (column = 1);
+        } else if (prevCharIsCR) {
+            prevCharIsCR = false;
+            if (c == '\n') {
+                prevCharIsLF = true;
+            } else
+                line += (column = 1);
+        }
+
+        switch (c) {
+            case '\r':
+                prevCharIsCR = true;
+                break;
+            case '\n':
+                prevCharIsLF = true;
+                break;
+            case '\t':
+                column--;
+                column += (tabSize - (column % tabSize));
+                break;
+            default:
+                break;
+        }
+
+        bufline[bufpos] = line;
+        bufcolumn[bufpos] = column;
+    }
+
+    /** Read a character. */
+    public char readChar() throws java.io.IOException {
+        if (inBuf > 0) {
+            --inBuf;
+
+            if (++bufpos == bufsize)
+                bufpos = 0;
+
+            return buffer[bufpos];
+        }
+
+        if (++bufpos >= maxNextCharInd)
+            FillBuff();
+
+        char c = buffer[bufpos];
+
+        UpdateLineColumn(c);
+        return c;
+    }
+
+    @Deprecated
+    /**
+     * @deprecated
+     * @see #getEndColumn
+     */
+
+    public int getColumn() {
+        return bufcolumn[bufpos];
+    }
+
+    @Deprecated
+    /**
+     * @deprecated
+     * @see #getEndLine
+     */
+
+    public int getLine() {
+        return bufline[bufpos];
+    }
+
+    /** Get token end column number. */
+    public int getEndColumn() {
+        return bufcolumn[bufpos];
+    }
+
+    /** Get token end line number. */
+    public int getEndLine() {
+        return bufline[bufpos];
+    }
+
+    /** Get token beginning column number. */
+    public int getBeginColumn() {
+        return bufcolumn[tokenBegin];
+    }
+
+    /** Get token beginning line number. */
+    public int getBeginLine() {
+        return bufline[tokenBegin];
+    }
+
+    /** Backup a number of characters. */
+    public void backup(int amount) {
+
+        inBuf += amount;
+        if ((bufpos -= amount) < 0)
+            bufpos += bufsize;
+    }
+
+    /** Reinitialise. */
+    public void ReInit(java.io.Reader dstream, int startline,
+                       int startcolumn, int buffersize) {
+        inputStream = dstream;
+        line = startline;
+        column = startcolumn - 1;
+
+        if (buffer == null || buffersize != buffer.length) {
+            available = bufsize = buffersize;
+            buffer = new char[buffersize];
+            bufline = new int[buffersize];
+            bufcolumn = new int[buffersize];
+        }
+        prevCharIsLF = prevCharIsCR = false;
+        tokenBegin = inBuf = maxNextCharInd = 0;
+        bufpos = -1;
+    }
+
+    /** Reinitialise. */
+    public void ReInit(java.io.Reader dstream, int startline,
+                       int startcolumn) {
+        ReInit(dstream, startline, startcolumn, 4096);
+    }
+
+    /** Reinitialise. */
+    public void ReInit(java.io.Reader dstream) {
+        ReInit(dstream, 1, 1, 4096);
+    }
+
+    /** Reinitialise. */
+    public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                       int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException {
+        ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
+    }
+
+    /** Reinitialise. */
+    public void ReInit(java.io.InputStream dstream, int startline,
+                       int startcolumn, int buffersize) {
+        ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
+    }
+
+    /** Reinitialise. */
+    public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException {
+        ReInit(dstream, encoding, 1, 1, 4096);
+    }
+
+    /** Reinitialise. */
+    public void ReInit(java.io.InputStream dstream) {
+        ReInit(dstream, 1, 1, 4096);
+    }
+
+    /** Reinitialise. */
+    public void ReInit(java.io.InputStream dstream, String encoding, int startline,
+                       int startcolumn) throws java.io.UnsupportedEncodingException {
+        ReInit(dstream, encoding, startline, startcolumn, 4096);
+    }
+
+    /** Reinitialise. */
+    public void ReInit(java.io.InputStream dstream, int startline,
+                       int startcolumn) {
+        ReInit(dstream, startline, startcolumn, 4096);
+    }
+
+    /** Get token literal value. */
+    public String GetImage() {
+        if (bufpos >= tokenBegin)
+            return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
         else
-          bufline[j] = newLine;
-      }
+            return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+                    new String(buffer, 0, bufpos + 1);
     }
 
-    line = bufline[j];
-    column = bufcolumn[j];
-  }
+    /** Get the suffix. */
+    public char[] GetSuffix(int len) {
+        char[] ret = new char[len];
+
+        if ((bufpos + 1) >= len)
+            System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+        else {
+            System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+                    len - bufpos - 1);
+            System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+        }
+
+        return ret;
+    }
+
+    /** Reset buffer when finished. */
+    public void Done() {
+        buffer = null;
+        bufline = null;
+        bufcolumn = null;
+    }
+
+    /**
+     * Method to adjust line and column numbers for the start of a token.
+     */
+    public void adjustBeginLineColumn(int newLine, int newCol) {
+        int start = tokenBegin;
+        int len;
+
+        if (bufpos >= tokenBegin) {
+            len = bufpos - tokenBegin + inBuf + 1;
+        } else {
+            len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+        }
+
+        int i = 0, j = 0, k = 0;
+        int nextColDiff = 0, columnDiff = 0;
+
+        while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) {
+            bufline[j] = newLine;
+            nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+            bufcolumn[j] = newCol + columnDiff;
+            columnDiff = nextColDiff;
+            i++;
+        }
+
+        if (i < len) {
+            bufline[j] = newLine++;
+            bufcolumn[j] = newCol + columnDiff;
+
+            while (i++ < len) {
+                if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+                    bufline[j] = newLine++;
+                else
+                    bufline[j] = newLine;
+            }
+        }
+
+        line = bufline[j];
+        column = bufcolumn[j];
+    }
 
 }
 /* JavaCC - OriginalChecksum=78e981b5210775b82383fb6e32f1e767 (do not edit this line) */

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/Token.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/Token.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/Token.java
index c2d86e2..22b3b65 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/Token.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/Token.java
@@ -8,124 +8,120 @@ package org.apache.camel.component.sql.stored.template.generated;
 
 public class Token implements java.io.Serializable {
 
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
-
-  /**
-   * An integer that describes the kind of this token.  This numbering
-   * system is determined by JavaCCParser, and a table of these numbers is
-   * stored in the file ...Constants.java.
-   */
-  public int kind;
-
-  /** The line number of the first character of this Token. */
-  public int beginLine;
-  /** The column number of the first character of this Token. */
-  public int beginColumn;
-  /** The line number of the last character of this Token. */
-  public int endLine;
-  /** The column number of the last character of this Token. */
-  public int endColumn;
-
-  /**
-   * The string image of the token.
-   */
-  public String image;
-
-  /**
-   * A reference to the next regular (non-special) token from the input
-   * stream.  If this is the last token from the input stream, or if the
-   * token manager has not read tokens beyond this one, this field is
-   * set to null.  This is true only if this token is also a regular
-   * token.  Otherwise, see below for a description of the contents of
-   * this field.
-   */
-  public Token next;
-
-  /**
-   * This field is used to access special tokens that occur prior to this
-   * token, but after the immediately preceding regular (non-special) token.
-   * If there are no such special tokens, this field is set to null.
-   * When there are more than one such special token, this field refers
-   * to the last of these special tokens, which in turn refers to the next
-   * previous special token through its specialToken field, and so on
-   * until the first special token (whose specialToken field is null).
-   * The next fields of special tokens refer to other special tokens that
-   * immediately follow it (without an intervening regular token).  If there
-   * is no such token, this field is null.
-   */
-  public Token specialToken;
-
-  /**
-   * An optional attribute value of the Token.
-   * Tokens which are not used as syntactic sugar will often contain
-   * meaningful values that will be used later on by the compiler or
-   * interpreter. This attribute value is often different from the image.
-   * Any subclass of Token that actually wants to return a non-null value can
-   * override this method as appropriate.
-   */
-  public Object getValue() {
-    return null;
-  }
-
-  /**
-   * No-argument constructor
-   */
-  public Token() {}
-
-  /**
-   * Constructs a new token for the specified Image.
-   */
-  public Token(int kind)
-  {
-    this(kind, null);
-  }
-
-  /**
-   * Constructs a new token for the specified Image and Kind.
-   */
-  public Token(int kind, String image)
-  {
-    this.kind = kind;
-    this.image = image;
-  }
-
-  /**
-   * Returns the image.
-   */
-  public String toString()
-  {
-    return image;
-  }
-
-  /**
-   * Returns a new Token object, by default. However, if you want, you
-   * can create and return subclass objects based on the value of ofKind.
-   * Simply add the cases to the switch for all those special cases.
-   * For example, if you have a subclass of Token called IDToken that
-   * you want to create if ofKind is ID, simply add something like :
-   *
-   *    case MyParserConstants.ID : return new IDToken(ofKind, image);
-   *
-   * to the following switch statement. Then you can cast matchedToken
-   * variable to the appropriate type and use sit in your lexical actions.
-   */
-  public static Token newToken(int ofKind, String image)
-  {
-    switch(ofKind)
-    {
-      default : return new Token(ofKind, image);
+    /**
+     * The version identifier for this Serializable class.
+     * Increment only if the <i>serialized</i> form of the
+     * class changes.
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * An integer that describes the kind of this token.  This numbering
+     * system is determined by JavaCCParser, and a table of these numbers is
+     * stored in the file ...Constants.java.
+     */
+    public int kind;
+
+    /** The line number of the first character of this Token. */
+    public int beginLine;
+    /** The column number of the first character of this Token. */
+    public int beginColumn;
+    /** The line number of the last character of this Token. */
+    public int endLine;
+    /** The column number of the last character of this Token. */
+    public int endColumn;
+
+    /**
+     * The string image of the token.
+     */
+    public String image;
+
+    /**
+     * A reference to the next regular (non-special) token from the input
+     * stream.  If this is the last token from the input stream, or if the
+     * token manager has not read tokens beyond this one, this field is
+     * set to null.  This is true only if this token is also a regular
+     * token.  Otherwise, see below for a description of the contents of
+     * this field.
+     */
+    public Token next;
+
+    /**
+     * This field is used to access special tokens that occur prior to this
+     * token, but after the immediately preceding regular (non-special) token.
+     * If there are no such special tokens, this field is set to null.
+     * When there are more than one such special token, this field refers
+     * to the last of these special tokens, which in turn refers to the next
+     * previous special token through its specialToken field, and so on
+     * until the first special token (whose specialToken field is null).
+     * The next fields of special tokens refer to other special tokens that
+     * immediately follow it (without an intervening regular token).  If there
+     * is no such token, this field is null.
+     */
+    public Token specialToken;
+
+    /**
+     * No-argument constructor
+     */
+    public Token() {
     }
-  }
 
-  public static Token newToken(int ofKind)
-  {
-    return newToken(ofKind, null);
-  }
+    /**
+     * Constructs a new token for the specified Image.
+     */
+    public Token(int kind) {
+        this(kind, null);
+    }
+
+    /**
+     * Constructs a new token for the specified Image and Kind.
+     */
+    public Token(int kind, String image) {
+        this.kind = kind;
+        this.image = image;
+    }
+
+    /**
+     * Returns a new Token object, by default. However, if you want, you
+     * can create and return subclass objects based on the value of ofKind.
+     * Simply add the cases to the switch for all those special cases.
+     * For example, if you have a subclass of Token called IDToken that
+     * you want to create if ofKind is ID, simply add something like :
+     *
+     * case MyParserConstants.ID : return new IDToken(ofKind, image);
+     *
+     * to the following switch statement. Then you can cast matchedToken
+     * variable to the appropriate type and use sit in your lexical actions.
+     */
+    public static Token newToken(int ofKind, String image) {
+        switch (ofKind) {
+            default:
+                return new Token(ofKind, image);
+        }
+    }
+
+    public static Token newToken(int ofKind) {
+        return newToken(ofKind, null);
+    }
+
+    /**
+     * An optional attribute value of the Token.
+     * Tokens which are not used as syntactic sugar will often contain
+     * meaningful values that will be used later on by the compiler or
+     * interpreter. This attribute value is often different from the image.
+     * Any subclass of Token that actually wants to return a non-null value can
+     * override this method as appropriate.
+     */
+    public Object getValue() {
+        return null;
+    }
+
+    /**
+     * Returns the image.
+     */
+    public String toString() {
+        return image;
+    }
 
 }
 /* JavaCC - OriginalChecksum=7e8baa74d8a01b01496421112dcea294 (do not edit this line) */

http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/TokenMgrError.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/TokenMgrError.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/TokenMgrError.java
index 3689f73..13fd322 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/TokenMgrError.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/generated/TokenMgrError.java
@@ -3,145 +3,138 @@
 package org.apache.camel.component.sql.stored.template.generated;
 
 /** Token Manager Error. */
-public class TokenMgrError extends Error
-{
+public class TokenMgrError extends Error {
 
-  /**
-   * The version identifier for this Serializable class.
-   * Increment only if the <i>serialized</i> form of the
-   * class changes.
-   */
-  private static final long serialVersionUID = 1L;
+    /**
+     * Lexical error occurred.
+     */
+    static final int LEXICAL_ERROR = 0;
 
   /*
    * Ordinals for various reasons why an Error of this type can be thrown.
    */
+    /**
+     * An attempt was made to create a second instance of a static token manager.
+     */
+    static final int STATIC_LEXER_ERROR = 1;
+    /**
+     * Tried to change to an invalid lexical state.
+     */
+    static final int INVALID_LEXICAL_STATE = 2;
+    /**
+     * Detected (and bailed out of) an infinite loop in the token manager.
+     */
+    static final int LOOP_DETECTED = 3;
+    /**
+     * The version identifier for this Serializable class.
+     * Increment only if the <i>serialized</i> form of the
+     * class changes.
+     */
+    private static final long serialVersionUID = 1L;
+    /**
+     * Indicates the reason why the exception is thrown. It will have
+     * one of the above 4 values.
+     */
+    int errorCode;
 
-  /**
-   * Lexical error occurred.
-   */
-  static final int LEXICAL_ERROR = 0;
-
-  /**
-   * An attempt was made to create a second instance of a static token manager.
-   */
-  static final int STATIC_LEXER_ERROR = 1;
-
-  /**
-   * Tried to change to an invalid lexical state.
-   */
-  static final int INVALID_LEXICAL_STATE = 2;
-
-  /**
-   * Detected (and bailed out of) an infinite loop in the token manager.
-   */
-  static final int LOOP_DETECTED = 3;
-
-  /**
-   * Indicates the reason why the exception is thrown. It will have
-   * one of the above 4 values.
-   */
-  int errorCode;
-
-  /**
-   * Replaces unprintable characters by their escaped (or unicode escaped)
-   * equivalents in the given string
-   */
-  protected static final String addEscapes(String str) {
-    StringBuffer retval = new StringBuffer();
-    char ch;
-    for (int i = 0; i < str.length(); i++) {
-      switch (str.charAt(i))
-      {
-        case 0 :
-          continue;
-        case '\b':
-          retval.append("\\b");
-          continue;
-        case '\t':
-          retval.append("\\t");
-          continue;
-        case '\n':
-          retval.append("\\n");
-          continue;
-        case '\f':
-          retval.append("\\f");
-          continue;
-        case '\r':
-          retval.append("\\r");
-          continue;
-        case '\"':
-          retval.append("\\\"");
-          continue;
-        case '\'':
-          retval.append("\\\'");
-          continue;
-        case '\\':
-          retval.append("\\\\");
-          continue;
-        default:
-          if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
-            String s = "0000" + Integer.toString(ch, 16);
-            retval.append("\\u" + s.substring(s.length() - 4, s.length()));
-          } else {
-            retval.append(ch);
-          }
-          continue;
-      }
+    /** No arg constructor. */
+    public TokenMgrError() {
     }
-    return retval.toString();
-  }
 
-  /**
-   * Returns a detailed message for the Error when it is thrown by the
-   * token manager to indicate a lexical error.
-   * Parameters :
-   *    EOFSeen     : indicates if EOF caused the lexical error
-   *    curLexState : lexical state in which this error occurred
-   *    errorLine   : line number when the error occurred
-   *    errorColumn : column number when the error occurred
-   *    errorAfter  : prefix that was seen before this error occurred
-   *    curchar     : the offending character
-   * Note: You can customize the lexical error message by modifying this method.
-   */
-  protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
-    return("Lexical error at line " +
-          errorLine + ", column " +
-          errorColumn + ".  Encountered: " +
-          (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
-          "after : \"" + addEscapes(errorAfter) + "\"");
-  }
+    /** Constructor with message and reason. */
+    public TokenMgrError(String message, int reason) {
+        super(message);
+        errorCode = reason;
+    }
 
-  /**
-   * You can also modify the body of this method to customize your error messages.
-   * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-   * of end-users concern, so you can return something like :
-   *
-   *     "Internal Error : Please file a bug report .... "
-   *
-   * from this method for such cases in the release version of your parser.
-   */
-  public String getMessage() {
-    return super.getMessage();
-  }
+    /** Full Constructor. */
+    public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+        this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+    }
 
   /*
    * Constructors of various flavors follow.
    */
 
-  /** No arg constructor. */
-  public TokenMgrError() {
-  }
+    /**
+     * Replaces unprintable characters by their escaped (or unicode escaped)
+     * equivalents in the given string
+     */
+    protected static final String addEscapes(String str) {
+        StringBuffer retval = new StringBuffer();
+        char ch;
+        for (int i = 0; i < str.length(); i++) {
+            switch (str.charAt(i)) {
+                case 0:
+                    continue;
+                case '\b':
+                    retval.append("\\b");
+                    continue;
+                case '\t':
+                    retval.append("\\t");
+                    continue;
+                case '\n':
+                    retval.append("\\n");
+                    continue;
+                case '\f':
+                    retval.append("\\f");
+                    continue;
+                case '\r':
+                    retval.append("\\r");
+                    continue;
+                case '\"':
+                    retval.append("\\\"");
+                    continue;
+                case '\'':
+                    retval.append("\\\'");
+                    continue;
+                case '\\':
+                    retval.append("\\\\");
+                    continue;
+                default:
+                    if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+                        String s = "0000" + Integer.toString(ch, 16);
+                        retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+                    } else {
+                        retval.append(ch);
+                    }
+                    continue;
+            }
+        }
+        return retval.toString();
+    }
 
-  /** Constructor with message and reason. */
-  public TokenMgrError(String message, int reason) {
-    super(message);
-    errorCode = reason;
-  }
+    /**
+     * Returns a detailed message for the Error when it is thrown by the
+     * token manager to indicate a lexical error.
+     * Parameters :
+     * EOFSeen     : indicates if EOF caused the lexical error
+     * curLexState : lexical state in which this error occurred
+     * errorLine   : line number when the error occurred
+     * errorColumn : column number when the error occurred
+     * errorAfter  : prefix that was seen before this error occurred
+     * curchar     : the offending character
+     * Note: You can customize the lexical error message by modifying this method.
+     */
+    protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+        return ("Lexical error at line " +
+                errorLine + ", column " +
+                errorColumn + ".  Encountered: " +
+                (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int) curChar + "), ") +
+                "after : \"" + addEscapes(errorAfter) + "\"");
+    }
 
-  /** Full Constructor. */
-  public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
-    this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
-  }
+    /**
+     * You can also modify the body of this method to customize your error messages.
+     * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+     * of end-users concern, so you can return something like :
+     *
+     * "Internal Error : Please file a bug report .... "
+     *
+     * from this method for such cases in the release version of your parser.
+     */
+    public String getMessage() {
+        return super.getMessage();
+    }
 }
 /* JavaCC - OriginalChecksum=076ac52ededde06a2bcb85f2834da49c (do not edit this line) */