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 2017/06/10 07:28:33 UTC

camel git commit: CAMEL-11393: sql-stored - Add support for typeNames and scale in grammar

Repository: camel
Updated Branches:
  refs/heads/master ba92e5dd6 -> 68e22b531


CAMEL-11393: sql-stored - Add support for typeNames and scale in grammar


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

Branch: refs/heads/master
Commit: 68e22b531eddab80fc033bb27c9bd034fec5e0d9
Parents: ba92e5d
Author: Sami Nurminen <sn...@gmail.com>
Authored: Fri Jun 9 22:31:46 2017 +0300
Committer: Claus Ibsen <da...@apache.org>
Committed: Sat Jun 10 09:20:20 2017 +0200

----------------------------------------------------------------------
 .../stored/CallableStatementWrapperFactory.java |   2 +
 .../component/sql/stored/SqlStoredEndpoint.java |   2 +-
 .../sql/stored/TemplateStoredProcedure.java     |  11 +-
 .../sql/stored/template/TemplateParser.java     |  12 +-
 .../sql/stored/template/ast/InputParameter.java |  18 +-
 .../sql/stored/template/ast/ParseHelper.java    |  53 +++-
 .../template/ast/ParseRuntimeException.java     |   4 +
 .../stored/template/generated/SSPTParser.java   | 102 +++++--
 .../template/generated/SSPTParserConstants.java |  32 ++-
 .../generated/SSPTParserTokenManager.java       | 271 ++++++++++++-------
 .../sql/stored/template/grammar/sspt.jj         |  66 ++++-
 .../stored/CallableStatementWrapperTest.java    |   8 +-
 .../camel/component/sql/stored/CustomType.java  |  28 ++
 .../camel/component/sql/stored/ParserTest.java  |  63 ++++-
 .../component/sql/stored/TemplateCacheTest.java |   2 +-
 15 files changed, 517 insertions(+), 157 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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
index 9e98449..d4434f6 100644
--- 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
@@ -18,7 +18,9 @@ package org.apache.camel.component.sql.stored;
 
 import java.sql.SQLException;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.component.sql.stored.template.TemplateParser;
+import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.support.ServiceSupport;
 import org.apache.camel.util.LRUCache;
 import org.springframework.jdbc.core.JdbcTemplate;

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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 93ebdde..8eb44f2 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
@@ -80,7 +80,7 @@ public class SqlStoredEndpoint extends DefaultEndpoint {
 
     @Override
     protected void doStart() throws Exception {
-        this.wrapperFactory = new CallableStatementWrapperFactory(jdbcTemplate, new TemplateParser(), isFunction());
+        this.wrapperFactory = new CallableStatementWrapperFactory(jdbcTemplate, new TemplateParser(getCamelContext().getClassResolver()), isFunction());
         super.doStart();
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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
index c1bec3c..6113d35 100644
--- 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
@@ -50,7 +50,16 @@ public class TemplateStoredProcedure extends StoredProcedure {
         for (Object parameter : template.getParameterList()) {
             if (parameter instanceof InputParameter) {
                 InputParameter inputParameter = (InputParameter) parameter;
-                declareParameter(new SqlParameter(inputParameter.getName(), inputParameter.getSqlType()));
+                SqlParameter sqlParameter;
+                if (inputParameter.getScale() != null) {
+                    sqlParameter = new SqlParameter(inputParameter.getName(), inputParameter.getSqlType(), inputParameter.getScale());
+                } else if (inputParameter.getTypeName() != null) {
+                    sqlParameter = new SqlParameter(inputParameter.getName(), inputParameter.getSqlType(), inputParameter.getTypeName());
+                } else {
+                    sqlParameter = new SqlParameter(inputParameter.getName(), inputParameter.getSqlType());
+                }
+
+                declareParameter(sqlParameter);
                 inputParameterList.add(inputParameter);
 
             } else if (parameter instanceof OutParameter) {

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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
index 321fa09..f5632ad 100644
--- 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
@@ -18,16 +18,26 @@ package org.apache.camel.component.sql.stored.template;
 
 import java.io.StringReader;
 
+import org.apache.camel.CamelContext;
 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.spi.ClassResolver;
+import org.apache.camel.util.ObjectHelper;
 
 public class TemplateParser {
 
+    private final ClassResolver classResolver;
+
+    public TemplateParser(ClassResolver classResolver) {
+        ObjectHelper.notNull(classResolver, "classResolver");
+        this.classResolver = classResolver;
+    }
+
     public Template parseTemplate(String template) {
         try {
-            SSPTParser parser = new SSPTParser(new StringReader(template));
+            SSPTParser parser = new SSPTParser(new StringReader(template), classResolver);
             Template ret = validate(parser.parse());
 
             return ret;

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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 9623752..2fcbff0 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
@@ -27,13 +27,21 @@ import org.apache.camel.component.sql.stored.template.generated.Token;
 public class InputParameter {
 
     private final String name;
+    private final String typeName;
     private final int sqlType;
+    private final Integer scale;
     private ValueExtractor valueExtractor;
 
-    public InputParameter(String name, int sqlType, Token valueSrcToken) {
+    public InputParameter(String name, int sqlType, Token valueSrcToken, Integer scale, String typeName) {
         this.name = name;
         this.sqlType = sqlType;
         parseValueExpression(valueSrcToken);
+        this.scale = scale;
+        this.typeName = typeName;
+
+        if (this.scale != null && this.typeName != null) {
+            throw new ParseRuntimeException(String.format("Both scale=%s and typeName=%s cannot be set", this.scale, this.typeName));
+        }
     }
 
     private void parseValueExpression(Token valueSrcToken) {
@@ -59,10 +67,18 @@ public class InputParameter {
         }
     }
 
+    public Integer getScale() {
+        return scale;
+    }
+
     public String getName() {
         return name;
     }
 
+    public String getTypeName() {
+        return typeName;
+    }
+
     public int getSqlType() {
         return sqlType;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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 bbfec72..a5160bc 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
@@ -21,6 +21,8 @@ import java.sql.Types;
 
 import org.apache.camel.component.sql.stored.template.generated.SSPTParserConstants;
 import org.apache.camel.component.sql.stored.template.generated.Token;
+import org.apache.camel.spi.ClassResolver;
+import org.apache.camel.util.StringHelper;
 import org.springframework.util.ReflectionUtils;
 
 public final class ParseHelper {
@@ -28,17 +30,50 @@ public final class ParseHelper {
     private ParseHelper() {
     }
 
-    public static int parseSqlType(Token sqlType) {
+    public static int parseSqlType(Token sqlTypeToken, ClassResolver classResolver) {
+
+        String sqlType = sqlTypeToken.toString();
 
         //if number then use it(probably Vendor spesific SQL-type)
-        if (sqlType.kind == SSPTParserConstants.NUMBER) {
-            return Integer.valueOf(sqlType.toString());
+        if (sqlTypeToken.kind == SSPTParserConstants.NUMBER) {
+            return Integer.valueOf(sqlType);
+        }
+
+        //if contains .
+        if (sqlType.contains(".")) {
+            String className;
+            String fieldName;
+            try {
+                className = sqlType.substring(0, sqlType.lastIndexOf("."));
+                fieldName = sqlType.substring(sqlType.lastIndexOf(".") + 1);
+            } catch (Exception ex) {
+                throw new ParseRuntimeException("Failed to parse class.field:" + sqlType);
+            }
+            try {
+                Class clazz = classResolver.resolveMandatoryClass(className);
+                return getFieldInt(clazz, fieldName);
+            } catch (ClassNotFoundException e) {
+                throw new ParseRuntimeException("Class for " + className + " not found", e);
+            }
         }
 
         //Loop-up from "Standard" types
-        Field field = ReflectionUtils.findField(Types.class, sqlType.toString());
+        return getFieldInt(Types.class, sqlType);
+    }
+
+    public static Integer parseScale(Token token) {
+        try {
+            String str = token.toString();
+            return Integer.valueOf(str.substring(1, str.length() - 1));
+        } catch (Exception ex) {
+            throw new ParseRuntimeException("Failed to parse scale from token:" + token.toString(), ex);
+        }
+    }
+
+    private static int getFieldInt(Class clazz, String sqlType) {
+        Field field = ReflectionUtils.findField(clazz, sqlType);
         if (field == null) {
-            throw new ParseRuntimeException("Field " + sqlType + " not found from java.procedureName.Types");
+            throw new ParseRuntimeException("Field " + sqlType + " not found from " + clazz.getName());
         }
         try {
             return field.getInt(Types.class);
@@ -46,4 +81,12 @@ public final class ParseHelper {
             throw new ParseRuntimeException(e);
         }
     }
+
+    public static String removeQuotes(String token) {
+        try {
+            return StringHelper.removeLeadingAndEndingQuotes(token);
+        } catch (Exception ex) {
+            throw new ParseRuntimeException("Failed to remove quotes from token:" + token, ex);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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
index 2fdea24..badb92a 100644
--- 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
@@ -22,6 +22,10 @@ public class ParseRuntimeException extends RuntimeException {
         super(message);
     }
 
+    public ParseRuntimeException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
     public ParseRuntimeException(Throwable cause) {
         super(cause);
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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 da08c20..f48fbac 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,11 +1,21 @@
 /* Generated By:JavaCC: Do not edit this line. SSPTParser.java */
 package org.apache.camel.component.sql.stored.template.generated;
 
+import java.io.Reader;
+
+import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.component.sql.stored.template.ast.*;
 
 public class SSPTParser implements SSPTParserConstants {
    int parameterNameCounter = 0;
 
+   ClassResolver classResolver;
+
+   public SSPTParser(Reader reader, ClassResolver classResolver) {
+     this(reader);
+     this.classResolver = classResolver;
+   }
+
    String createNextParameterName() {
       return "_"+(parameterNameCounter++);
    }
@@ -19,6 +29,7 @@ public class SSPTParser implements SSPTParserConstants {
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case 2:
     case NUMBER:
+    case PARAMETER_NAME:
     case IDENTIFIER:
       parameter = Parameter();
                                                                                template.addParameter(parameter);
@@ -52,6 +63,7 @@ public class SSPTParser implements SSPTParserConstants {
     Object param;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case NUMBER:
+    case PARAMETER_NAME:
     case IDENTIFIER:
       param = InputParameter();
                                 {if (true) return param;}
@@ -70,31 +82,83 @@ public class SSPTParser implements SSPTParserConstants {
 
   final public InputParameter InputParameter() throws ParseException {
      Token sqlTypeToken;
-     String name;
+     String name = null;
      Token valueSrcToken;
+     Integer scale = null;
+     String typeName = null;
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case PARAMETER_NAME:
+      name = ParameterName();
+      jj_consume_token(1);
+      break;
+    default:
+      jj_la1[3] = jj_gen;
+      ;
+    }
     sqlTypeToken = ParameterSqlType();
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case SCALE:
+      scale = Scale();
+      break;
+    default:
+      jj_la1[4] = jj_gen;
+      ;
+    }
     jj_consume_token(1);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case PARAMETER_NAME:
+      typeName = ParameterName();
+      jj_consume_token(1);
+      break;
+    default:
+      jj_la1[5] = jj_gen;
+      ;
+    }
     valueSrcToken = InputParameterSrc();
-        int sqlType = ParseHelper.parseSqlType(sqlTypeToken);
-        {if (true) return new InputParameter(createNextParameterName(),sqlType,valueSrcToken);}
+        int sqlType = ParseHelper.parseSqlType(sqlTypeToken, classResolver);
+
+        {if (true) return new InputParameter(name == null ? createNextParameterName() : name, sqlType, valueSrcToken, scale, typeName);}
     throw new Error("Missing return statement in function");
   }
 
   final public OutParameter OutParameter() throws ParseException {
      Token sqlTypeToken;
-     String name;
+     String name = null;
      String outValueMapKey;
     jj_consume_token(2);
-    jj_consume_token(1);
+    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+    case PARAMETER_NAME:
+      name = ParameterName();
+      jj_consume_token(1);
+      break;
+    default:
+      jj_la1[6] = jj_gen;
+      ;
+    }
     sqlTypeToken = ParameterSqlType();
     jj_consume_token(1);
     outValueMapKey = OutHeader();
-        {if (true) return new OutParameter(createNextParameterName(),ParseHelper.parseSqlType(sqlTypeToken),outValueMapKey);}
+        {if (true) return new OutParameter(name == null ? createNextParameterName() : name, ParseHelper.parseSqlType(sqlTypeToken, classResolver), outValueMapKey);}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public String ParameterName() throws ParseException {
+    Token t = null;
+    t = jj_consume_token(PARAMETER_NAME);
+        {if (true) return ParseHelper.removeQuotes(t.toString()) ;}
+    throw new Error("Missing return statement in function");
+  }
+
+  final public Integer Scale() throws ParseException {
+    Token t;
+    t = jj_consume_token(SCALE);
+        {if (true) return ParseHelper.parseScale(t);}
     throw new Error("Missing return statement in function");
   }
 
   final public Token ParameterSqlType() throws ParseException {
     Token t;
+    Token scaleToken;
     switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
     case NUMBER:
       t = jj_consume_token(NUMBER);
@@ -103,7 +167,7 @@ public class SSPTParser implements SSPTParserConstants {
       t = jj_consume_token(IDENTIFIER);
       break;
     default:
-      jj_la1[3] = jj_gen;
+      jj_la1[7] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -130,7 +194,7 @@ public class SSPTParser implements SSPTParserConstants {
             {if (true) return ret;}
       break;
     default:
-      jj_la1[4] = jj_gen;
+      jj_la1[8] = jj_gen;
       jj_consume_token(-1);
       throw new ParseException();
     }
@@ -146,13 +210,13 @@ public class SSPTParser implements SSPTParserConstants {
   public Token jj_nt;
   private int jj_ntk;
   private int jj_gen;
-  final private int[] jj_la1 = new int[5];
+  final private int[] jj_la1 = new int[9];
   static private int[] jj_la1_0;
   static {
       jj_la1_init_0();
    }
    private static void jj_la1_init_0() {
-      jj_la1_0 = new int[] {0x200,0x400c,0x400c,0x4008,0x3000,};
+      jj_la1_0 = new int[] {0x400,0x18014,0x18014,0x8000,0x8,0x8000,0x8000,0x10010,0x6000,};
    }
 
   /** Constructor with InputStream. */
@@ -166,7 +230,7 @@ public class SSPTParser implements SSPTParserConstants {
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
   }
 
   /** Reinitialise. */
@@ -180,7 +244,7 @@ public class SSPTParser implements SSPTParserConstants {
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
   }
 
   /** Constructor. */
@@ -190,7 +254,7 @@ public class SSPTParser implements SSPTParserConstants {
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
   }
 
   /** Reinitialise. */
@@ -200,7 +264,7 @@ public class SSPTParser implements SSPTParserConstants {
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
   }
 
   /** Constructor with generated Token Manager. */
@@ -209,7 +273,7 @@ public class SSPTParser implements SSPTParserConstants {
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
   }
 
   /** Reinitialise. */
@@ -218,7 +282,7 @@ public class SSPTParser implements SSPTParserConstants {
     token = new Token();
     jj_ntk = -1;
     jj_gen = 0;
-    for (int i = 0; i < 5; i++) jj_la1[i] = -1;
+    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
   }
 
   private Token jj_consume_token(int kind) throws ParseException {
@@ -269,12 +333,12 @@ public class SSPTParser implements SSPTParserConstants {
   /** Generate ParseException. */
   public ParseException generateParseException() {
     jj_expentries.clear();
-    boolean[] la1tokens = new boolean[15];
+    boolean[] la1tokens = new boolean[17];
     if (jj_kind >= 0) {
       la1tokens[jj_kind] = true;
       jj_kind = -1;
     }
-    for (int i = 0; i < 5; i++) {
+    for (int i = 0; i < 9; i++) {
       if (jj_la1[i] == jj_gen) {
         for (int j = 0; j < 32; j++) {
           if ((jj_la1_0[i] & (1<<j)) != 0) {
@@ -283,7 +347,7 @@ public class SSPTParser implements SSPTParserConstants {
         }
       }
     }
-    for (int i = 0; i < 15; i++) {
+    for (int i = 0; i < 17; i++) {
       if (la1tokens[i]) {
         jj_expentry = new int[1];
         jj_expentry[0] = i;

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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 f0ba72c..e047cc8 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
@@ -11,29 +11,33 @@ public interface SSPTParserConstants {
   /** End of File. */
   int EOF = 0;
   /** RegularExpression Id. */
-  int NUMBER = 3;
+  int SCALE = 3;
   /** RegularExpression Id. */
-  int DIGIT = 4;
+  int NUMBER = 4;
   /** RegularExpression Id. */
-  int LETTER = 5;
+  int DIGIT = 5;
   /** RegularExpression Id. */
-  int SPECIAL = 6;
+  int LETTER = 6;
   /** RegularExpression Id. */
-  int WHITESPACE = 7;
+  int SPECIAL = 7;
   /** RegularExpression Id. */
-  int COMMA = 8;
+  int WHITESPACE = 8;
   /** RegularExpression Id. */
-  int SEPARATOR = 9;
+  int COMMA = 9;
   /** RegularExpression Id. */
-  int PROCEDURE_BEGIN = 10;
+  int SEPARATOR = 10;
   /** RegularExpression Id. */
-  int PROCEDURE_END = 11;
+  int PROCEDURE_BEGIN = 11;
   /** RegularExpression Id. */
-  int SIMPLE_EXP_TOKEN = 12;
+  int PROCEDURE_END = 12;
   /** RegularExpression Id. */
-  int PARAMETER_POS_TOKEN = 13;
+  int SIMPLE_EXP_TOKEN = 13;
   /** RegularExpression Id. */
-  int IDENTIFIER = 14;
+  int PARAMETER_POS_TOKEN = 14;
+  /** RegularExpression Id. */
+  int PARAMETER_NAME = 15;
+  /** RegularExpression Id. */
+  int IDENTIFIER = 16;
 
   /** Lexical state. */
   int DEFAULT = 0;
@@ -42,7 +46,8 @@ public interface SSPTParserConstants {
   String[] tokenImage = {
     "<EOF>",
     "\" \"",
-    "\"OUT\"",
+    "\"OUT \"",
+    "<SCALE>",
     "<NUMBER>",
     "<DIGIT>",
     "<LETTER>",
@@ -54,6 +59,7 @@ public interface SSPTParserConstants {
     "<PROCEDURE_END>",
     "<SIMPLE_EXP_TOKEN>",
     "<PARAMETER_POS_TOKEN>",
+    "<PARAMETER_NAME>",
     "<IDENTIFIER>",
   };
 

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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 ebca5cb..6598fe0 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,5 +1,7 @@
 /* Generated By:JavaCC: Do not edit this line. SSPTParserTokenManager.java */
 package org.apache.camel.component.sql.stored.template.generated;
+import java.io.Reader;
+import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.component.sql.stored.template.ast.*;
 
 /** Token Manager. */
@@ -17,18 +19,26 @@ private final int jjStopStringLiteralDfa_0(int pos, long active0)
       case 0:
          if ((active0 & 0x4L) != 0L)
          {
-            jjmatchedKind = 14;
-            return 14;
+            jjmatchedKind = 16;
+            return 15;
          }
          if ((active0 & 0x2L) != 0L)
-            return 19;
+            return 25;
          return -1;
       case 1:
          if ((active0 & 0x4L) != 0L)
          {
-            jjmatchedKind = 14;
+            jjmatchedKind = 16;
             jjmatchedPos = 1;
-            return 14;
+            return 15;
+         }
+         return -1;
+      case 2:
+         if ((active0 & 0x4L) != 0L)
+         {
+            jjmatchedKind = 16;
+            jjmatchedPos = 2;
+            return 15;
          }
          return -1;
       default :
@@ -50,11 +60,11 @@ private int jjMoveStringLiteralDfa0_0()
    switch(curChar)
    {
       case 32:
-         return jjStartNfaWithStates_0(0, 1, 19);
+         return jjStartNfaWithStates_0(0, 1, 25);
       case 79:
          return jjMoveStringLiteralDfa1_0(0x4L);
       default :
-         return jjMoveNfa_0(10, 0);
+         return jjMoveNfa_0(8, 0);
    }
 }
 private int jjMoveStringLiteralDfa1_0(long active0)
@@ -85,13 +95,31 @@ private int jjMoveStringLiteralDfa2_0(long old0, long active0)
    switch(curChar)
    {
       case 84:
+         return jjMoveStringLiteralDfa3_0(active0, 0x4L);
+      default :
+         break;
+   }
+   return jjStartNfa_0(1, active0);
+}
+private int jjMoveStringLiteralDfa3_0(long old0, long active0)
+{
+   if (((active0 &= old0)) == 0L)
+      return jjStartNfa_0(1, old0);
+   try { curChar = input_stream.readChar(); }
+   catch(java.io.IOException e) {
+      jjStopStringLiteralDfa_0(2, active0);
+      return 3;
+   }
+   switch(curChar)
+   {
+      case 32:
          if ((active0 & 0x4L) != 0L)
-            return jjStartNfaWithStates_0(2, 2, 14);
+            return jjStopAtPos(3, 2);
          break;
       default :
          break;
    }
-   return jjStartNfa_0(1, active0);
+   return jjStartNfa_0(2, active0);
 }
 private int jjStartNfaWithStates_0(int pos, int kind, int state)
 {
@@ -104,7 +132,7 @@ private int jjStartNfaWithStates_0(int pos, int kind, int state)
 private int jjMoveNfa_0(int startState, int curPos)
 {
    int startsAt = 0;
-   jjnewStateCnt = 19;
+   jjnewStateCnt = 25;
    int i = 1;
    jjstateSet[0] = startState;
    int kind = 0x7fffffff;
@@ -119,164 +147,195 @@ private int jjMoveNfa_0(int startState, int curPos)
          {
             switch(jjstateSet[--i])
             {
-               case 10:
+               case 8:
                   if ((0x7ff609c00000000L & l) != 0L)
                   {
-                     if (kind > 14)
-                        kind = 14;
-                     jjCheckNAdd(14);
+                     if (kind > 16)
+                        kind = 16;
+                     jjCheckNAdd(15);
                   }
                   else if ((0x100002600L & l) != 0L)
                   {
-                     if (kind > 7)
-                        kind = 7;
+                     if (kind > 8)
+                        kind = 8;
                      jjCheckNAddStates(0, 5);
                   }
-                  else if (curChar == 41)
+                  else if (curChar == 40)
                   {
                      if (kind > 11)
                         kind = 11;
-                     jjCheckNAdd(6);
+                     jjCheckNAddTwoStates(17, 19);
                   }
-                  else if (curChar == 40)
+                  else if (curChar == 41)
                   {
-                     if (kind > 10)
-                        kind = 10;
+                     if (kind > 12)
+                        kind = 12;
                      jjCheckNAdd(4);
                   }
                   else if (curChar == 44)
                   {
-                     if (kind > 9)
-                        kind = 9;
+                     if (kind > 10)
+                        kind = 10;
                      jjCheckNAdd(2);
                   }
                   if ((0x3ff200000000000L & l) != 0L)
                   {
-                     if (kind > 3)
-                        kind = 3;
+                     if (kind > 4)
+                        kind = 4;
                      jjCheckNAdd(0);
                   }
+                  else if (curChar == 39)
+                     jjCheckNAdd(13);
                   else if (curChar == 58)
-                     jjstateSet[jjnewStateCnt++] = 11;
+                     jjstateSet[jjnewStateCnt++] = 9;
                   else if (curChar == 36)
-                     jjstateSet[jjnewStateCnt++] = 7;
+                     jjstateSet[jjnewStateCnt++] = 5;
                   break;
-               case 19:
+               case 25:
                   if ((0x100002600L & l) != 0L)
-                     jjCheckNAddTwoStates(18, 5);
+                     jjCheckNAddTwoStates(24, 3);
                   else if (curChar == 41)
                   {
-                     if (kind > 11)
-                        kind = 11;
-                     jjCheckNAdd(6);
+                     if (kind > 12)
+                        kind = 12;
+                     jjCheckNAdd(4);
                   }
                   else if (curChar == 40)
                   {
-                     if (kind > 10)
-                        kind = 10;
-                     jjCheckNAdd(4);
+                     if (kind > 11)
+                        kind = 11;
+                     jjCheckNAdd(19);
                   }
                   else if (curChar == 44)
                   {
-                     if (kind > 9)
-                        kind = 9;
+                     if (kind > 10)
+                        kind = 10;
                      jjCheckNAdd(2);
                   }
                   if ((0x100002600L & l) != 0L)
-                     jjCheckNAddTwoStates(17, 3);
+                     jjCheckNAddTwoStates(22, 23);
                   if ((0x100002600L & l) != 0L)
-                     jjCheckNAddTwoStates(16, 1);
+                     jjCheckNAddTwoStates(21, 1);
                   break;
                case 0:
                   if ((0x3ff200000000000L & l) == 0L)
                      break;
-                  if (kind > 3)
-                     kind = 3;
+                  if (kind > 4)
+                     kind = 4;
                   jjCheckNAdd(0);
                   break;
                case 1:
                   if (curChar != 44)
                      break;
-                  kind = 9;
+                  kind = 10;
                   jjCheckNAdd(2);
                   break;
                case 2:
                   if ((0x100002600L & l) == 0L)
                      break;
-                  if (kind > 9)
-                     kind = 9;
+                  if (kind > 10)
+                     kind = 10;
                   jjCheckNAdd(2);
                   break;
                case 3:
-                  if (curChar != 40)
+                  if (curChar != 41)
                      break;
-                  kind = 10;
+                  if (kind > 12)
+                     kind = 12;
                   jjCheckNAdd(4);
                   break;
                case 4:
                   if ((0x100002600L & l) == 0L)
                      break;
-                  if (kind > 10)
-                     kind = 10;
+                  if (kind > 12)
+                     kind = 12;
                   jjCheckNAdd(4);
                   break;
-               case 5:
-                  if (curChar != 41)
-                     break;
-                  kind = 11;
-                  jjCheckNAdd(6);
-                  break;
                case 6:
-                  if ((0x100002600L & l) == 0L)
-                     break;
-                  if (kind > 11)
-                     kind = 11;
-                  jjCheckNAdd(6);
-                  break;
-               case 8:
                   if ((0x7ff609d00000000L & l) != 0L)
                      jjAddStates(6, 7);
                   break;
-               case 11:
+               case 9:
                   if (curChar == 35)
-                     jjCheckNAdd(12);
+                     jjCheckNAdd(10);
                   break;
-               case 12:
+               case 10:
                   if ((0x7ff609c00000000L & l) == 0L)
                      break;
-                  if (kind > 13)
-                     kind = 13;
-                  jjCheckNAdd(12);
+                  if (kind > 14)
+                     kind = 14;
+                  jjCheckNAdd(10);
                   break;
-               case 13:
+               case 11:
                   if (curChar == 58)
-                     jjstateSet[jjnewStateCnt++] = 11;
+                     jjstateSet[jjnewStateCnt++] = 9;
+                  break;
+               case 12:
+                  if (curChar == 39)
+                     jjCheckNAdd(13);
+                  break;
+               case 13:
+                  if ((0x7ff609c00000000L & l) != 0L)
+                     jjCheckNAddTwoStates(13, 14);
                   break;
                case 14:
+                  if (curChar == 39 && kind > 15)
+                     kind = 15;
+                  break;
+               case 15:
                   if ((0x7ff609c00000000L & l) == 0L)
                      break;
-                  if (kind > 14)
-                     kind = 14;
-                  jjCheckNAdd(14);
+                  if (kind > 16)
+                     kind = 16;
+                  jjCheckNAdd(15);
                   break;
-               case 15:
+               case 16:
+                  if (curChar != 40)
+                     break;
+                  if (kind > 11)
+                     kind = 11;
+                  jjCheckNAddTwoStates(17, 19);
+                  break;
+               case 17:
+                  if ((0x3ff200000000000L & l) != 0L)
+                     jjCheckNAddTwoStates(17, 18);
+                  break;
+               case 18:
+                  if (curChar == 41 && kind > 3)
+                     kind = 3;
+                  break;
+               case 19:
                   if ((0x100002600L & l) == 0L)
                      break;
-                  if (kind > 7)
-                     kind = 7;
+                  if (kind > 11)
+                     kind = 11;
+                  jjCheckNAdd(19);
+                  break;
+               case 20:
+                  if ((0x100002600L & l) == 0L)
+                     break;
+                  if (kind > 8)
+                     kind = 8;
                   jjCheckNAddStates(0, 5);
                   break;
-               case 16:
+               case 21:
                   if ((0x100002600L & l) != 0L)
-                     jjCheckNAddTwoStates(16, 1);
+                     jjCheckNAddTwoStates(21, 1);
                   break;
-               case 17:
+               case 22:
                   if ((0x100002600L & l) != 0L)
-                     jjCheckNAddTwoStates(17, 3);
+                     jjCheckNAddTwoStates(22, 23);
                   break;
-               case 18:
+               case 23:
+                  if (curChar != 40)
+                     break;
+                  if (kind > 11)
+                     kind = 11;
+                  jjCheckNAdd(19);
+                  break;
+               case 24:
                   if ((0x100002600L & l) != 0L)
-                     jjCheckNAddTwoStates(18, 5);
+                     jjCheckNAddTwoStates(24, 3);
                   break;
                default : break;
             }
@@ -289,32 +348,36 @@ private int jjMoveNfa_0(int startState, int curPos)
          {
             switch(jjstateSet[--i])
             {
-               case 10:
-               case 14:
+               case 8:
+               case 15:
                   if ((0x2ffffffeaffffffeL & l) == 0L)
                      break;
-                  if (kind > 14)
-                     kind = 14;
-                  jjCheckNAdd(14);
+                  if (kind > 16)
+                     kind = 16;
+                  jjCheckNAdd(15);
                   break;
-               case 7:
+               case 5:
                   if (curChar == 123)
-                     jjCheckNAdd(8);
+                     jjCheckNAdd(6);
                   break;
-               case 8:
+               case 6:
                   if ((0x2ffffffeaffffffeL & l) != 0L)
-                     jjCheckNAddTwoStates(8, 9);
+                     jjCheckNAddTwoStates(6, 7);
                   break;
-               case 9:
-                  if (curChar == 125 && kind > 12)
-                     kind = 12;
+               case 7:
+                  if (curChar == 125 && kind > 13)
+                     kind = 13;
                   break;
-               case 12:
+               case 10:
                   if ((0x2ffffffeaffffffeL & l) == 0L)
                      break;
-                  if (kind > 13)
-                     kind = 13;
-                  jjstateSet[jjnewStateCnt++] = 12;
+                  if (kind > 14)
+                     kind = 14;
+                  jjstateSet[jjnewStateCnt++] = 10;
+                  break;
+               case 13:
+                  if ((0x2ffffffeaffffffeL & l) != 0L)
+                     jjAddStates(8, 9);
                   break;
                default : break;
             }
@@ -339,28 +402,28 @@ private int jjMoveNfa_0(int startState, int curPos)
          kind = 0x7fffffff;
       }
       ++curPos;
-      if ((i = jjnewStateCnt) == (startsAt = 19 - (jjnewStateCnt = startsAt)))
+      if ((i = jjnewStateCnt) == (startsAt = 25 - (jjnewStateCnt = startsAt)))
          return curPos;
       try { curChar = input_stream.readChar(); }
       catch(java.io.IOException e) { return curPos; }
    }
 }
 static final int[] jjnextStates = {
-   16, 1, 17, 3, 18, 5, 8, 9, 
+   21, 1, 22, 23, 24, 3, 6, 7, 13, 14, 
 };
 
 /** Token literal values. */
 public static final String[] jjstrLiteralImages = {
-"", "\40", "\117\125\124", null, null, null, null, null, null, null, null, 
-null, null, null, null, };
+"", "\40", "\117\125\124\40", null, null, null, null, null, null, null, null, 
+null, null, null, null, null, null, };
 
 /** Lexer state names. */
 public static final String[] lexStateNames = {
    "DEFAULT",
 };
 protected SimpleCharStream input_stream;
-private final int[] jjrounds = new int[19];
-private final int[] jjstateSet = new int[38];
+private final int[] jjrounds = new int[25];
+private final int[] jjstateSet = new int[50];
 protected char curChar;
 /** Constructor. */
 public SSPTParserTokenManager(SimpleCharStream stream){
@@ -387,7 +450,7 @@ private void ReInitRounds()
 {
    int i;
    jjround = 0x80000001;
-   for (i = 19; i-- > 0;)
+   for (i = 25; i-- > 0;)
       jjrounds[i] = 0x80000000;
 }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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 0ad95ed..ee43e42 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
@@ -27,11 +27,21 @@ PARSER_BEGIN(SSPTParser)
 
 package org.apache.camel.component.sql.stored.template.generated;
 
+import java.io.Reader;
+
+import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.component.sql.stored.template.ast.*;
 
 public class SSPTParser {
    int parameterNameCounter = 0;
 
+   ClassResolver classResolver;
+
+   public SSPTParser(Reader reader, ClassResolver classResolver) {
+     this(reader);
+     this.classResolver = classResolver;
+   }
+
    String createNextParameterName() {
       return "_"+(parameterNameCounter++);
    }
@@ -65,38 +75,67 @@ Object Parameter() :
 InputParameter InputParameter() :
 {
      Token sqlTypeToken;
-     String name;
+     String name = null;
      Token valueSrcToken;
+     Integer scale = null;
+     String typeName = null;
 }
 {
-    (sqlTypeToken = ParameterSqlType() " " valueSrcToken =
+    ((name = ParameterName() " ")? sqlTypeToken = ParameterSqlType() (scale = Scale())? " " (typeName = ParameterName() " ")? valueSrcToken =
     InputParameterSrc())
     {
-        int sqlType = ParseHelper.parseSqlType(sqlTypeToken);
-        return new InputParameter(createNextParameterName(),sqlType,valueSrcToken);
+        int sqlType = ParseHelper.parseSqlType(sqlTypeToken, classResolver);
+
+        return new InputParameter(name == null ? createNextParameterName() : name, sqlType, valueSrcToken, scale, typeName);
     }
 }
 
 OutParameter OutParameter() :
 {
      Token sqlTypeToken;
-     String name;
+     String name = null;
      String outValueMapKey;
 }
 {
-    ("OUT" " " sqlTypeToken = ParameterSqlType() " " outValueMapKey =
+    ("OUT " (name = ParameterName() " ")? sqlTypeToken = ParameterSqlType() " " outValueMapKey =
     OutHeader())
     {
-        return new OutParameter(createNextParameterName(),ParseHelper.parseSqlType(sqlTypeToken),outValueMapKey);
+        return new OutParameter(name == null ? createNextParameterName() : name, ParseHelper.parseSqlType(sqlTypeToken, classResolver), outValueMapKey);
+    }
+}
+
+String ParameterName():
+{
+    Token t = null;
+}
+{
+    (t = <PARAMETER_NAME>)
+
+    {
+        return ParseHelper.removeQuotes(t.toString()) ;
+    }
+}
+
+Integer Scale():
+{
+    Token t;
+
+}
+{
+    ( t = <SCALE> )
+    {
+
+        return ParseHelper.parseScale(t);
     }
 }
 
 Token ParameterSqlType():
 {
     Token t;
+    Token scaleToken;
 }
 {
-    (t = <NUMBER> | t = <IDENTIFIER>)
+    (t = <NUMBER> | t = <IDENTIFIER>  )
     {
         return t;
     }
@@ -130,6 +169,10 @@ Token InputParameterSrc():
 }
 
 TOKEN: {
+    <SCALE: "(" (["-","0"-"9"])+ ")">
+}
+
+TOKEN: {
     <NUMBER: (["-","0"-"9"])+>
 }
 
@@ -174,6 +217,13 @@ TOKEN : {
 }
 
 TOKEN : {
+    <PARAMETER_NAME: "'"( <LETTER> | <DIGIT> | <SPECIAL> )+"'" >
+}
+
+TOKEN : {
     <IDENTIFIER: ( <LETTER> | <DIGIT> | <SPECIAL> )+ >
 }
 
+
+
+

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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
index 0bec974..774af23 100644
--- 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
@@ -44,11 +44,15 @@ public class CallableStatementWrapperTest extends CamelTestSupport {
         db = new EmbeddedDatabaseBuilder()
                 .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build();
         jdbcTemplate = new JdbcTemplate(db);
-        templateParser = new TemplateParser();
-        this.factory = new CallableStatementWrapperFactory(jdbcTemplate, templateParser, false);
         super.setUp();
     }
 
+    @Override
+    protected void startCamelContext() throws Exception {
+        super.startCamelContext();
+        templateParser = new TemplateParser(context().getClassResolver());
+        this.factory = new CallableStatementWrapperFactory(jdbcTemplate, templateParser, false);
+    }
 
     @Test
     public void shouldExecuteStoredProcedure() throws Exception {

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CustomType.java
----------------------------------------------------------------------
diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CustomType.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CustomType.java
new file mode 100644
index 0000000..6001db8
--- /dev/null
+++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CustomType.java
@@ -0,0 +1,28 @@
+/**
+ * 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 CustomType {
+
+    public static final int INTEGER = 1;
+
+    private CustomType() {
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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 bfbe4af..9c15e18 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
@@ -21,7 +21,9 @@ import java.sql.Types;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.apache.camel.RoutesBuilder;
 import org.apache.camel.component.properties.PropertiesComponent;
 import org.apache.camel.component.sql.stored.template.TemplateParser;
 import org.apache.camel.component.sql.stored.template.ast.InputParameter;
@@ -34,7 +36,15 @@ import org.junit.Test;
 
 public class ParserTest extends CamelTestSupport {
 
-    TemplateParser parser = new TemplateParser();
+    TemplateParser parser;
+
+
+
+    @Override
+    protected void startCamelContext() throws Exception {
+        super.startCamelContext();
+        parser = new TemplateParser(context.getClassResolver());
+    }
 
     @Test
     public void shouldParseOk() {
@@ -151,4 +161,55 @@ public class ParserTest extends CamelTestSupport {
                 + "(OTHER VALUE1 ${header.v1},INTEGER VALUE2 ${header.v2})");
     }
 
+    @Test
+    public void testParameterNameGiven() {
+        Template template = parser.parseTemplate("FOO('p_instance_id' INTEGER ${header.foo})");
+        assertEquals("p_instance_id", ((InputParameter) template.getParameterList().get(0)).getName());
+    }
+
+    @Test
+    public void testParameterVendor() {
+        Template template = parser.parseTemplate("FOO('p_instance_id' org.apache.camel.component.sql.stored.CustomType.INTEGER ${header.foo})");
+        assertEquals(1, ((InputParameter) template.getParameterList().get(0)).getSqlType());
+    }
+
+    @Test
+    public void testParameterVendorType() {
+        Template template = parser.parseTemplate("FOO('p_instance_id' 2 ${header.foo})");
+        assertEquals(2, ((InputParameter) template.getParameterList().get(0)).getSqlType());
+    }
+
+    @Test
+    public void testParameterTypeName() {
+        Template template = parser.parseTemplate("FOO('p_instance_id' 2 'p_2' ${header.foo})");
+        assertEquals("p_2", ((InputParameter) template.getParameterList().get(0)).getTypeName());
+    }
+
+
+    @Test
+    public void testParameterVendorTypeNegativ() {
+        Template template = parser.parseTemplate("FOO('p_instance_id' -2 ${header.foo})");
+        assertEquals(-2, ((InputParameter) template.getParameterList().get(0)).getSqlType());
+    }
+
+    @Test
+    public void testOracleTypesOut() {
+        Template template = parser.parseTemplate("FOO(OUT 'p_error_cd' 1 header1)");
+        assertEquals(1, ((OutParameter) template.getParameterList().get(0)).getSqlType());
+    }
+
+    @Test
+    public void testOracleTypesOutParameterVendor() {
+        Template template = parser.parseTemplate("FOO(OUT 'p_error_cd' org.apache.camel.component.sql.stored.CustomType.INTEGER header1)");
+        assertEquals(1, ((OutParameter) template.getParameterList().get(0)).getSqlType());
+    }
+
+
+    @Test
+    public void testOracleTypesNumeric() {
+        Template template = parser.parseTemplate("FOO('p_error_cd' org.apache.camel.component.sql.stored.CustomType.INTEGER(10) ${header.foo})");
+        assertEquals(Integer.valueOf(10), ((InputParameter) template.getParameterList().get(0)).getScale());
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/68e22b53/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
index 2c43b16..3d1caf1 100644
--- 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
@@ -46,7 +46,7 @@ public class TemplateCacheTest extends CamelTestSupport {
     @Test
     public void shouldCacheTemplateFunctions() throws InterruptedException {
         JdbcTemplate jdbcTemplate = new JdbcTemplate(db);
-        CallableStatementWrapperFactory fac = new CallableStatementWrapperFactory(jdbcTemplate, new TemplateParser(), false);
+        CallableStatementWrapperFactory fac = new CallableStatementWrapperFactory(jdbcTemplate, new TemplateParser(context.getClassResolver()), false);
 
         BatchCallableStatementCreatorFactory batchFactory1 = fac.getTemplateForBatch("FOO()");
         BatchCallableStatementCreatorFactory batchFactory2 = fac.getTemplateForBatch("FOO()");