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()");