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/09 11:44:45 UTC

[2/9] camel git commit: Saving work. Simple Producer.

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/OutParameter.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/OutParameter.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/OutParameter.java
new file mode 100644
index 0000000..2182bd7
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/OutParameter.java
@@ -0,0 +1,33 @@
+package org.apache.camel.component.sql.stored.template.ast;
+
+/**
+ * Created by snurmine on 12/20/15.
+ */
+public class OutParameter {
+
+
+    String name;
+
+    int sqlType;
+
+    String outHeader;
+
+
+    public OutParameter(String name, int sqlType, String outHeader) {
+        this.name = name;
+        this.sqlType = sqlType;
+        this.outHeader = outHeader;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getSqlType() {
+        return sqlType;
+    }
+
+    public String getOutHeader() {
+        return outHeader;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/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
new file mode 100644
index 0000000..e84c7a9
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ParseHelper.java
@@ -0,0 +1,58 @@
+package org.apache.camel.component.sql.stored.template.ast;
+
+import org.springframework.util.ReflectionUtils;
+
+import java.lang.reflect.Field;
+import java.math.BigInteger;
+import java.sql.Date;
+import java.sql.Types;
+
+
+public class ParseHelper {
+
+    public static int parseSqlType(String sqlType) {
+        Field field = ReflectionUtils.findField(Types.class, sqlType);
+        if (field == null) {
+            throw new ParseRuntimeException("Field " + sqlType + " not found from java.procedureName.Types");
+        }
+        try {
+            return field.getInt(Types.class);
+        } catch (IllegalAccessException e) {
+            throw new ParseRuntimeException(e);
+        }
+    }
+
+    public static Class sqlTypeToJavaType(int sqlType, String sqlTypeStr) {
+        //TODO: as rest of types.
+        //TODO: add test for each type.
+        Class ret = null;
+        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;
+        }
+        if (ret == null) {
+            throw new ParseRuntimeException("Unable to map SQL type " + sqlTypeStr + " to Java type");
+
+        }
+        return ret;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ParseRuntimeException.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ParseRuntimeException.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ParseRuntimeException.java
new file mode 100644
index 0000000..b3b8fc8
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/ParseRuntimeException.java
@@ -0,0 +1,14 @@
+package org.apache.camel.component.sql.stored.template.ast;
+
+/**
+ * Created by snurmine on 1/3/16.
+ */
+public class ParseRuntimeException extends RuntimeException {
+    public ParseRuntimeException(String message) {
+        super(message);
+    }
+
+    public ParseRuntimeException(Throwable cause) {
+        super(cause);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/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
new file mode 100644
index 0000000..b442fde
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/ast/Template.java
@@ -0,0 +1,43 @@
+package org.apache.camel.component.sql.stored.template.ast;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Root element of Simple Stored Procedure Template AST.
+ */
+public class Template {
+
+    String procedureName;
+
+    List<InputParameter> inputParameterList = new ArrayList<>();
+
+    List<OutParameter> outParameterList = new ArrayList<>();
+
+    public void addParameter(Object parameter) {
+
+        if (parameter instanceof OutParameter) {
+            outParameterList.add((OutParameter) parameter);
+        } else {
+            inputParameterList.add((InputParameter) parameter);
+
+        }
+    }
+
+    public String getProcedureName() {
+        return procedureName;
+    }
+
+    public void setProcedureName(String procedureName) {
+        this.procedureName = procedureName;
+    }
+
+    public List<InputParameter> getInputParameterList() {
+        return inputParameterList;
+    }
+
+    public List<OutParameter> getOutParameterList() {
+        return outParameterList;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/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
new file mode 100644
index 0000000..764764c
--- /dev/null
+++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj
@@ -0,0 +1,136 @@
+//Using some token definions from: http://kiwwito.com/build-a-lexical-analyzer-with-javacc/
+
+options {
+    STATIC = false;
+}
+
+
+PARSER_BEGIN(SSPTParser)
+
+package org.apache.camel.component.sql.stored.template.generated;
+
+import org.apache.camel.component.sql.stored.template.ast.*;
+
+public class SSPTParser {
+   int paramaterNameCounter = 0;
+
+   String createNextParameterName() {
+      return "_"+(paramaterNameCounter++);
+   }
+}
+
+PARSER_END(SSPTParser)
+
+public Template parse() :
+{   Token procudureName;
+    Template template = new Template();
+    Object parameter = null;
+}
+{
+  (procudureName = <IDENTIFIER> "(" (parameter = Parameter() { template.addParameter(parameter);}) (","
+  parameter
+  = Parameter(){template.addParameter(parameter);})*  ")" <EOF>)
+  {
+   template.setProcedureName(procudureName.toString());
+   return template;
+  }
+}
+
+Object Parameter() :
+{
+    Object param;
+}
+{
+     (param = InputParameter() {return param;}) | (param = OutParameter(){return param;})
+}
+
+InputParameter InputParameter() :
+{
+     String sqlTypeAsStr;
+     String name;
+     String valueSrcAsStr;
+}
+{
+    (sqlTypeAsStr = ParameterSqlType() " " valueSrcAsStr =
+    InputParameterSrc())
+    {
+        int sqlType = ParseHelper.parseSqlType(sqlTypeAsStr);
+        return new InputParameter(createNextParameterName(),sqlType,valueSrcAsStr,ParseHelper.sqlTypeToJavaType(sqlType,sqlTypeAsStr));
+    }
+}
+
+OutParameter OutParameter() :
+{
+     String sqlType;
+     String name;
+     String outHeader;
+}
+{
+    ("OUT" " " sqlType = ParameterSqlType() " " outHeader =
+    OutHeader())
+    {
+        return new OutParameter(createNextParameterName(),ParseHelper.parseSqlType(sqlType),outHeader);
+    }
+}
+
+String ParameterSqlType():
+{
+    Token t;
+}
+{
+    (t = <IDENTIFIER>)
+    {
+        return t.toString();
+    }
+}
+
+String OutHeader():
+{
+ Token token;
+}
+{
+    (token = <IDENTIFIER>)
+    {
+        return token.toString();
+    }
+}
+
+String InputParameterSrc():
+{
+    String ret;
+}
+{
+    (ret = SimpleExpression())
+    {
+        return ret;
+    }
+}
+
+String SimpleExpression() :
+{
+ Token t = null;
+}
+{
+    (t = <SIMPLE_EXP_TOKEN>)
+    {
+    return t.toString();
+    }
+}
+
+TOKEN: {
+    <#DIGIT: (["0"-"9"])>
+}
+
+TOKEN: {
+    <#LETTER: (["a"-"z","A"-"Z"])>
+}
+
+TOKEN : {
+    <SIMPLE_EXP_TOKEN: "${"(<LETTER>|<DIGIT> | " " | "'" | "." )* "}">
+}
+
+
+TOKEN : {
+    <IDENTIFIER: <LETTER>( <LETTER> | <DIGIT> | ".") *>
+}
+

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/components/camel-sql/src/main/resources/META-INF/services/org/apache/camel/component/sql-stored
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/main/resources/META-INF/services/org/apache/camel/component/sql-stored b/components/camel-sql/src/main/resources/META-INF/services/org/apache/camel/component/sql-stored
new file mode 100644
index 0000000..74e07fd
--- /dev/null
+++ b/components/camel-sql/src/main/resources/META-INF/services/org/apache/camel/component/sql-stored
@@ -0,0 +1 @@
+class=org.apache.camel.component.sql.stored.SqlStoredComponent

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/ParserTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/ParserTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/ParserTest.java
deleted file mode 100644
index ba36baf..0000000
--- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/ParserTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.apache.camel.component.sql.sspt;
-
-
-import org.apache.camel.Exchange;
-import org.apache.camel.component.sql.sspt.ast.InputParameter;
-import org.apache.camel.component.sql.sspt.ast.OutParameter;
-import org.apache.camel.component.sql.sspt.ast.ParseException;
-import org.apache.camel.component.sql.sspt.ast.Template;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.math.BigInteger;
-import java.sql.Types;
-
-public class ParserTest extends CamelTestSupport {
-
-    SimpleStoredProcedureFactory parser = new SimpleStoredProcedureFactory();
-
-
-    @Test
-    public void shouldParseOk() {
-
-
-        Template template = parser.parseTemplate("addnumbers(INTEGER ${header.header1}," +
-                "VARCHAR ${property.property1},BIGINT ${header.header2},OUT INTEGER header1)");
-
-        Assert.assertEquals("addnumbers", template.getProcedureName());
-        Assert.assertEquals(3, template.getInputParameterList().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);
-        Assert.assertEquals("_0", param1.getName());
-        Assert.assertEquals(Types.INTEGER, param1.getSqlType());
-        Assert.assertEquals(Integer.valueOf(1), param1.getValueExpression().evaluate(exchange, Integer.class));
-
-        InputParameter param2 = template.getInputParameterList().get(1);
-        Assert.assertEquals("_1", param2.getName());
-        Assert.assertEquals(Types.VARCHAR, param2.getSqlType());
-        Assert.assertEquals("constant string", param2.getValueExpression().evaluate(exchange, String.class));
-
-        InputParameter param3 = template.getInputParameterList().get(2);
-        Assert.assertEquals("_2", param3.getName());
-        Assert.assertEquals(Types.BIGINT, param3.getSqlType());
-        Assert.assertEquals(BigInteger.valueOf(2), param3.getValueExpression().evaluate(exchange, BigInteger.class));
-
-        OutParameter sptpOutputNode = template.getOutParameterList().get(0);
-        Assert.assertEquals("_3", sptpOutputNode.getName());
-        Assert.assertEquals(Types.INTEGER, sptpOutputNode.getSqlType());
-        Assert.assertEquals("header1", sptpOutputNode.getOutHeader());
-
-    }
-
-
-    @Test(expected = ParseException.class)
-    public void noOutputParameterShouldFail() {
-        parser.parseTemplate("ADDNUMBERS2" +
-                "(INTEGER VALUE1 ${header.v1},INTEGER VALUE2 ${header.v2})");
-
-    }
-
-    @Test(expected = ParseException.class)
-    public void unexistingTypeShouldFail() {
-        parser.parseTemplate("ADDNUMBERS2" +
-                "(XML VALUE1 ${header.v1},OUT INTEGER VALUE2 ${header.v2})");
-
-    }
-
-
-    @Test(expected = ParseException.class)
-    public void unmappedTypeShouldFaild() {
-        parser.parseTemplate("ADDNUMBERS2" +
-                "(OTHER VALUE1 ${header.v1},INTEGER VALUE2 ${header.v2})");
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/ProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/ProducerTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/ProducerTest.java
deleted file mode 100644
index d00108c..0000000
--- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/ProducerTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.apache.camel.component.sql.sspt;
-
-import org.apache.camel.Exchange;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.component.sql.SqlComponent;
-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;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Created by snurmine on 12/30/15.
- */
-public class ProducerTest 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 shouldExecuteStoredProcedure() throws InterruptedException {
-        MockEndpoint mock = getMockEndpoint("mock:query");
-        mock.expectedMessageCount(1);
-
-
-        Map<String, Object> headers = new HashMap<>();
-        headers.put("num1", 1);
-        headers.put("num2", 2);
-        template.requestBodyAndHeaders("direct:query", null, headers);
-
-        assertMockEndpointsSatisfied();
-
-        Exchange exchange = mock.getExchanges().get(0);
-
-        assertEquals(Integer.valueOf(3), exchange.getIn().getHeader("resultofsum"));
-    }
-
-    @Override
-    protected RouteBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                // required for the sql component
-                getContext().getComponent("sql", SqlComponent.class).setDataSource(db);
-
-                from("direct:query").to("sql:sspt:ADDNUMBERS(INTEGER ${headers.num1},INTEGER ${headers"
-                        + ".num2},OUT INTEGER resultofsum)").to("mock:query");
-            }
-        };
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/SimpleStoredProcedureTest.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/SimpleStoredProcedureTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/SimpleStoredProcedureTest.java
deleted file mode 100644
index 5fc4fef..0000000
--- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/SimpleStoredProcedureTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.apache.camel.component.sql.sspt;
-
-
-import org.apache.camel.Exchange;
-import org.apache.camel.component.sql.sspt.ast.ParseException;
-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 SimpleStoredProcedureTest extends CamelTestSupport {
-
-    SimpleStoredProcedureFactory parser = new SimpleStoredProcedureFactory();
-
-    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);
-
-        super.setUp();
-    }
-
-
-    @Test
-    public void shouldExecuteStoredProcedure() throws ParseException {
-        SimpleStoredProcedure sp = new SimpleStoredProcedure(db, 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"));
-
-
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        super.tearDown();
-
-        db.shutdown();
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/SimpleStoredProcedureUdf.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/SimpleStoredProcedureUdf.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/SimpleStoredProcedureUdf.java
deleted file mode 100644
index f88ebd4..0000000
--- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/sspt/SimpleStoredProcedureUdf.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.apache.camel.component.sql.sspt;
-
-/**
- * Created by snurmine on 12/20/15.
- */
-public class SimpleStoredProcedureUdf {
-
-    public static void addnumbers(int VALUE1, int VALUE2, int[] RESULT) {
-        System.out.println("calling addnumbers:" + VALUE1 + "," + VALUE2);
-
-        RESULT[0] = VALUE1 + VALUE2;
-
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/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
new file mode 100644
index 0000000..81b6b5a
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java
@@ -0,0 +1,83 @@
+package org.apache.camel.component.sql.stored;
+
+
+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.ParseRuntimeException;
+import org.apache.camel.component.sql.stored.template.ast.Template;
+import org.apache.camel.component.sql.stored.template.TemplateStoredProcedureFactory;
+import org.apache.camel.component.sql.stored.template.generated.ParseException;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.math.BigInteger;
+import java.sql.Types;
+
+public class ParserTest extends CamelTestSupport {
+
+    TemplateStoredProcedureFactory parser = new TemplateStoredProcedureFactory();
+
+
+    @Test
+    public void shouldParseOk() {
+
+
+        Template template = parser.parseTemplate("addnumbers(INTEGER ${header.header1}," +
+                "VARCHAR ${property.property1},BIGINT ${header.header2},OUT INTEGER header1)");
+
+        Assert.assertEquals("addnumbers", template.getProcedureName());
+        Assert.assertEquals(3, template.getInputParameterList().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);
+        Assert.assertEquals("_0", param1.getName());
+        Assert.assertEquals(Types.INTEGER, param1.getSqlType());
+        Assert.assertEquals(Integer.valueOf(1), param1.getValueExpression().evaluate(exchange, Integer.class));
+
+        InputParameter param2 = template.getInputParameterList().get(1);
+        Assert.assertEquals("_1", param2.getName());
+        Assert.assertEquals(Types.VARCHAR, param2.getSqlType());
+        Assert.assertEquals("constant string", param2.getValueExpression().evaluate(exchange, String.class));
+
+        InputParameter param3 = template.getInputParameterList().get(2);
+        Assert.assertEquals("_2", param3.getName());
+        Assert.assertEquals(Types.BIGINT, param3.getSqlType());
+        Assert.assertEquals(BigInteger.valueOf(2), param3.getValueExpression().evaluate(exchange, BigInteger.class));
+
+        OutParameter sptpOutputNode = template.getOutParameterList().get(0);
+        Assert.assertEquals("_3", sptpOutputNode.getName());
+        Assert.assertEquals(Types.INTEGER, sptpOutputNode.getSqlType());
+        Assert.assertEquals("header1", sptpOutputNode.getOutHeader());
+
+    }
+
+
+    @Test(expected = ParseRuntimeException.class)
+    public void noOutputParameterShouldFail() {
+        parser.parseTemplate("ADDNUMBERS2" +
+                "(INTEGER VALUE1 ${header.v1},INTEGER VALUE2 ${header.v2})");
+
+    }
+
+    @Test(expected = ParseRuntimeException.class)
+    public void unexistingTypeShouldFail() {
+        parser.parseTemplate("ADDNUMBERS2" +
+                "(XML VALUE1 ${header.v1},OUT INTEGER VALUE2 ${header.v2})");
+
+    }
+
+
+    @Test(expected = ParseRuntimeException.class)
+    public void unmappedTypeShouldFaild() {
+        parser.parseTemplate("ADDNUMBERS2" +
+                "(OTHER VALUE1 ${header.v1},INTEGER VALUE2 ${header.v2})");
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/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
new file mode 100644
index 0000000..969bca1
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java
@@ -0,0 +1,72 @@
+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.component.sql.SqlComponent;
+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;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by snurmine on 12/30/15.
+ */
+public class ProducerTest 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 shouldExecuteStoredProcedure() throws InterruptedException {
+        MockEndpoint mock = getMockEndpoint("mock:query");
+        mock.expectedMessageCount(1);
+
+
+        Map<String, Object> headers = new HashMap<>();
+        headers.put("num1", 1);
+        headers.put("num2", 2);
+        template.requestBodyAndHeaders("direct:query", null, headers);
+
+        assertMockEndpointsSatisfied();
+
+        Exchange exchange = mock.getExchanges().get(0);
+
+        assertEquals(Integer.valueOf(3), exchange.getIn().getHeader("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:ADDNUMBERS(INTEGER ${headers.num1},INTEGER ${headers"
+                        + ".num2},OUT INTEGER resultofsum)").to("mock:query");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SimpleStoredProcedureUdf.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SimpleStoredProcedureUdf.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SimpleStoredProcedureUdf.java
new file mode 100644
index 0000000..2802b70
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SimpleStoredProcedureUdf.java
@@ -0,0 +1,15 @@
+package org.apache.camel.component.sql.stored;
+
+/**
+ * Created by snurmine on 12/20/15.
+ */
+public class SimpleStoredProcedureUdf {
+
+    public static void addnumbers(int VALUE1, int VALUE2, int[] RESULT) {
+        System.out.println("calling addnumbers:" + VALUE1 + "," + VALUE2);
+
+        RESULT[0] = VALUE1 + VALUE2;
+
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/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
new file mode 100644
index 0000000..752dcaa
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateStoredProcedureTest.java
@@ -0,0 +1,58 @@
+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 {
+
+    TemplateStoredProcedureFactory parser = new TemplateStoredProcedureFactory();
+
+    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);
+
+        super.setUp();
+    }
+
+
+    @Test
+    public void shouldExecuteStoredProcedure()  {
+        TemplateStoredProcedure sp = new TemplateStoredProcedure(db, 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"));
+
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        super.tearDown();
+
+        db.shutdown();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/3ee2bb46/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 edee883..3f6ed74 100644
--- a/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql
+++ b/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql
@@ -19,4 +19,4 @@ CREATE PROCEDURE ADDNUMBERS(VALUE1 INTEGER, VALUE2 INTEGER,OUT RESULT INTEGER)
  PARAMETER STYLE JAVA
  LANGUAGE JAVA
  EXTERNAL NAME
-'org.apache.camel.component.sql.sspt.SimpleStoredProcedureUdf.addnumbers';
\ No newline at end of file
+'org.apache.camel.component.sql.stored.SimpleStoredProcedureUdf.addnumbers';
\ No newline at end of file