Repository: camel Updated Branches: refs/heads/master f5116063b -> df5944fad
http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj index ac138ad..617d24a 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj @@ -66,14 +66,15 @@ InputParameter InputParameter() : { String sqlTypeAsStr; String name; - String valueSrcAsStr; + Token valueSrcToken; } { - (sqlTypeAsStr = ParameterSqlType() " " valueSrcAsStr = + (sqlTypeAsStr = ParameterSqlType() " " valueSrcToken = InputParameterSrc()) { int sqlType = ParseHelper.parseSqlType(sqlTypeAsStr); - return new InputParameter(createNextParameterName(),sqlType,valueSrcAsStr,ParseHelper.sqlTypeToJavaType(sqlType,sqlTypeAsStr)); + return new InputParameter(createNextParameterName(),sqlType,valueSrcToken,ParseHelper.sqlTypeToJavaType(sqlType, + sqlTypeAsStr)); } } @@ -112,26 +113,20 @@ String OutHeader(): return token.toString(); } } - -String InputParameterSrc(): +Token InputParameterSrc(): { - String ret; + Token ret = null; } { - (ret = SimpleExpression()) + (ret = <SIMPLE_EXP_TOKEN>) { return ret; } -} + | -String SimpleExpression() : -{ - Token t = null; -} -{ - (t = <SIMPLE_EXP_TOKEN>) + (ret = <PARAMETER_POS_TOKEN>) { - return t.toString(); + return ret; } } @@ -143,12 +138,20 @@ TOKEN: { <#LETTER: (["a"-"z","A"-"Z"])> } +TOKEN: { + <#SPECIAL: (["#","_","-","'",".","$","{","}","\""])> +} + +TOKEN : { + <SIMPLE_EXP_TOKEN: "${"(<LETTER>|<DIGIT> | <SPECIAL> | " ")+ "}"> +} + TOKEN : { - <SIMPLE_EXP_TOKEN: "${"(<LETTER>|<DIGIT> | " " | "'" | "." )* "}"> + <PARAMETER_POS_TOKEN: ":#"(<LETTER>|<DIGIT>|<SPECIAL> )+> } TOKEN : { - <IDENTIFIER: <LETTER>( <LETTER> | <DIGIT> | ".") *> + <IDENTIFIER: ( <LETTER> | <DIGIT> | <SPECIAL> )+ > } http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java new file mode 100644 index 0000000..33a95d5 --- /dev/null +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/CallableStatementWrapperTest.java @@ -0,0 +1,99 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.sql.stored; + +import java.sql.SQLException; +import java.util.Map; + +import org.apache.camel.Exchange; +import org.apache.camel.component.sql.stored.template.TemplateParser; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.springframework.dao.DataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + +public class CallableStatementWrapperTest extends CamelTestSupport { + + private TemplateParser templateParser; + private EmbeddedDatabase db; + private JdbcTemplate jdbcTemplate; + private CallableStatementWrapperFactory factory; + + @Before + public void setUp() throws Exception { + db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build(); + jdbcTemplate = new JdbcTemplate(db); + templateParser = new TemplateParser(); + this.factory = new CallableStatementWrapperFactory(jdbcTemplate, templateParser); + super.setUp(); + } + + + @Test + public void shouldExecuteStoredProcedure() throws Exception { + + CallableStatementWrapper wrapper = new CallableStatementWrapper("SUBNUMBERS" + + "(INTEGER ${header.v1},INTEGER ${header.v2},OUT INTEGER resultofsub)", factory); + + final Exchange exchange = createExchangeWithBody(null); + exchange.getIn().setHeader("v1", 1); + exchange.getIn().setHeader("v2", 2); + + wrapper.call(new WrapperExecuteCallback() { + @Override + public void execute(StamentWrapper stamentWrapper) throws SQLException, DataAccessException { + stamentWrapper.populateStatement(null, exchange); + + Map resultOfQuery = (Map) stamentWrapper.executeStatement(); + Assert.assertEquals(Integer.valueOf(-1), ((Map) resultOfQuery).get("resultofsub")); + } + }); + } + + @Test + public void shouldExecuteNilacidProcedure() throws Exception { + CallableStatementWrapper wrapper = new CallableStatementWrapper("NILADIC()", factory); + + + wrapper.call(new WrapperExecuteCallback() { + @Override + public void execute(StamentWrapper stamentWrapper) throws SQLException, DataAccessException { + + stamentWrapper.populateStatement(null, null); + Map result = (Map) stamentWrapper.executeStatement(); + //no output parameter in stored procedure NILADIC() + //Spring sets #update-count-1 + assertNotNull(result.get("#update-count-1")); + + } + }); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + db.shutdown(); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java index 36ccc76..ffd92fb 100644 --- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ParserTest.java @@ -18,9 +18,11 @@ package org.apache.camel.component.sql.stored; import java.math.BigInteger; import java.sql.Types; +import java.util.HashMap; +import java.util.Map; import org.apache.camel.Exchange; -import org.apache.camel.component.sql.stored.template.TemplateStoredProcedureFactory; +import org.apache.camel.component.sql.stored.template.TemplateParser; import org.apache.camel.component.sql.stored.template.ast.InputParameter; import org.apache.camel.component.sql.stored.template.ast.OutParameter; import org.apache.camel.component.sql.stored.template.ast.ParseRuntimeException; @@ -31,7 +33,7 @@ import org.junit.Test; public class ParserTest extends CamelTestSupport { - TemplateStoredProcedureFactory parser = new TemplateStoredProcedureFactory(null); + TemplateParser parser = new TemplateParser(); @Test public void shouldParseOk() { @@ -39,29 +41,29 @@ public class ParserTest extends CamelTestSupport { + "VARCHAR ${property.property1},BIGINT ${header.header2},OUT INTEGER header1)"); Assert.assertEquals("addnumbers", template.getProcedureName()); - Assert.assertEquals(3, template.getInputParameterList().size()); + Assert.assertEquals(4, template.getParameterList().size()); Exchange exchange = createExchangeWithBody(null); exchange.getIn().setHeader("header1", 1); exchange.setProperty("property1", "constant string"); exchange.getIn().setHeader("header2", BigInteger.valueOf(2)); - InputParameter param1 = template.getInputParameterList().get(0); + InputParameter param1 = (InputParameter) template.getParameterList().get(0); Assert.assertEquals("_0", param1.getName()); Assert.assertEquals(Types.INTEGER, param1.getSqlType()); - Assert.assertEquals(Integer.valueOf(1), param1.getValueExpression().evaluate(exchange, Integer.class)); + Assert.assertEquals(Integer.valueOf(1), param1.getValueExtractor().eval(exchange, null)); - InputParameter param2 = template.getInputParameterList().get(1); + InputParameter param2 = (InputParameter) template.getParameterList().get(1); Assert.assertEquals("_1", param2.getName()); Assert.assertEquals(Types.VARCHAR, param2.getSqlType()); - Assert.assertEquals("constant string", param2.getValueExpression().evaluate(exchange, String.class)); + Assert.assertEquals("constant string", param2.getValueExtractor().eval(exchange, null)); - InputParameter param3 = template.getInputParameterList().get(2); + InputParameter param3 = (InputParameter) template.getParameterList().get(2); Assert.assertEquals("_2", param3.getName()); Assert.assertEquals(Types.BIGINT, param3.getSqlType()); - Assert.assertEquals(BigInteger.valueOf(2), param3.getValueExpression().evaluate(exchange, BigInteger.class)); + Assert.assertEquals(2L, param3.getValueExtractor().eval(exchange, null)); - OutParameter sptpOutputNode = template.getOutParameterList().get(0); + OutParameter sptpOutputNode = (OutParameter) template.getParameterList().get(3); Assert.assertEquals("_3", sptpOutputNode.getName()); Assert.assertEquals(Types.INTEGER, sptpOutputNode.getSqlType()); Assert.assertEquals("header1", sptpOutputNode.getOutHeader()); @@ -80,6 +82,23 @@ public class ParserTest extends CamelTestSupport { + "(XML VALUE1 ${header.v1},OUT INTEGER VALUE2 ${header.v2})"); } + @Test + public void nestedSimpleExpression() { + Exchange exchange = createExchangeWithBody(1); + exchange.getIn().setHeader("body", "body"); + Template template = parser.parseTemplate("ADDNUMBERS2(INTEGER ${${header.body}})"); + assertEquals(1, ((InputParameter) template.getParameterList().get(0)).getValueExtractor().eval(exchange, null)); + } + + @Test + public void nableIssueSyntax() { + Map params = new HashMap<>(); + params.put("P_STR_IN", "a"); + Template template = parser.parseTemplate("IBS.\"Z$IMS_INTERFACE_WS\".TEST_STR(VARCHAR :#P_STR_IN,OUT VARCHAR P_STR_OUT)"); + assertEquals("a", ((InputParameter) template.getParameterList().get(0)).getValueExtractor().eval(null, params)); + assertEquals("IBS.\"Z$IMS_INTERFACE_WS\".TEST_STR", template.getProcedureName()); + } + @Test(expected = ParseRuntimeException.class) public void unmappedTypeShouldFaild() { parser.parseTemplate("ADDNUMBERS2" http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java new file mode 100644 index 0000000..8a36c5e --- /dev/null +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerBatchTest.java @@ -0,0 +1,95 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.sql.stored; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + +public class ProducerBatchTest extends CamelTestSupport { + + private EmbeddedDatabase db; + + @Before + public void setUp() throws Exception { + db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build(); + super.setUp(); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + db.shutdown(); + } + + @Test + public void shouldExecuteBatch() throws InterruptedException { + MockEndpoint mock = getMockEndpoint("mock:query"); + mock.expectedMessageCount(1); + + + List<Map> batchParams = new ArrayList<>(); + + Map<String, Object> batch1 = new HashMap<>(); + batchParams.add(batch1); + + batch1.put("num", "1"); + + + Map<String, Object> batch2 = new HashMap<>(); + + batch2.put("num", "3"); + batchParams.add(batch2); + + final long batchfnCallsBefore = TestStoredProcedure.BATCHFN_CALL_COUNTER.get(); + + template.requestBody("direct:query", batchParams); + + assertMockEndpointsSatisfied(); + + Exchange exchange = mock.getExchanges().get(0); + + assertNotNull(exchange.getIn().getHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT)); + assertEquals(batchfnCallsBefore + 2, TestStoredProcedure.BATCHFN_CALL_COUNTER.get()); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + // required for the sql component + getContext().getComponent("sql-stored", SqlStoredComponent.class).setDataSource(db); + + from("direct:query").to("sql-stored:BATCHFN(INTEGER :#num)?batch=true").to("mock:query"); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java index 19a8089..1e8bc35 100644 --- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerTest.java @@ -62,7 +62,8 @@ public class ProducerTest extends CamelTestSupport { Exchange exchange = mock.getExchanges().get(0); - assertEquals(Integer.valueOf(3), exchange.getIn().getHeader("resultofsum")); + assertEquals(Integer.valueOf(-1), exchange.getIn().getBody(Map.class).get("resultofsub")); + assertNotNull(exchange.getIn().getHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT)); } @Override @@ -73,8 +74,8 @@ public class ProducerTest extends CamelTestSupport { // required for the sql component getContext().getComponent("sql-stored", SqlStoredComponent.class).setDataSource(db); - from("direct:query").to("sql-stored:ADDNUMBERS(INTEGER ${headers.num1},INTEGER ${headers" - + ".num2},OUT INTEGER resultofsum)").to("mock:query"); + from("direct:query").to("sql-stored:SUBNUMBERS(INTEGER ${headers.num1},INTEGER ${headers" + + ".num2},OUT INTEGER resultofsub)").to("mock:query"); } }; } http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java new file mode 100644 index 0000000..6a10010 --- /dev/null +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/ProducerUseMessageBodyForTemplateTest.java @@ -0,0 +1,85 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.sql.stored; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.component.sql.SqlConstants; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + + +public class ProducerUseMessageBodyForTemplateTest extends CamelTestSupport { + + private EmbeddedDatabase db; + + @Before + public void setUp() throws Exception { + db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build(); + super.setUp(); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + db.shutdown(); + } + + @Test + public void shouldUseMessageBodyAsQuery() throws InterruptedException { + MockEndpoint mock = getMockEndpoint("mock:query"); + mock.expectedMessageCount(1); + + + Map<String, Object> batch1 = new HashMap<>(); + batch1.put("num1", 3); + batch1.put("num2", 1); + + + template.requestBodyAndHeader("direct:query", "SUBNUMBERS(INTEGER :#num1,INTEGER :#num2,OUT INTEGER resultofsum)", SqlStoredConstants.SQL_STORED_PARAMETERS, batch1); + + assertMockEndpointsSatisfied(); + + Exchange exchange = mock.getExchanges().get(0); + + + assertEquals(Integer.valueOf(2), exchange.getIn().getBody(Map.class).get("resultofsum")); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + // required for the sql component + getContext().getComponent("sql-stored", SqlStoredComponent.class).setDataSource(db); + + from("direct:query").to("sql-stored:query?useMessageBodyForTemplate=true").to("mock:query"); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java new file mode 100644 index 0000000..6f9f479 --- /dev/null +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/SqlStoredDataSourceTest.java @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.sql.stored; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.impl.JndiRegistry; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.After; +import org.junit.Test; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + + +public class SqlStoredDataSourceTest extends CamelTestSupport { + + private EmbeddedDatabase db; + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + + // START SNIPPET: e2 + // this is the database we create with some initial data for our unit test + db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build(); + // END SNIPPET: e2 + + jndi.bind("jdbc/myDataSource", db); + + return jndi; + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + db.shutdown(); + } + + @Test + public void shouldExecuteStoredProcedure() throws InterruptedException { + MockEndpoint mock = getMockEndpoint("mock:query"); + mock.expectedMessageCount(1); + + template.requestBody("direct:query", ""); + + assertMockEndpointsSatisfied(); + + Exchange exchange = mock.getExchanges().get(0); + assertNotNull(exchange.getIn().getHeader(SqlStoredConstants.SQL_STORED_UPDATE_COUNT)); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + // required for the sql component + + from("direct:query").to("sql-stored:NILADIC()?dataSource=#jdbc/myDataSource").to("mock:query"); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java new file mode 100644 index 0000000..4aee75c --- /dev/null +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateCacheTest.java @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.sql.stored; + +import org.apache.camel.component.sql.stored.template.TemplateParser; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; + +public class TemplateCacheTest extends CamelTestSupport { + + private EmbeddedDatabase db; + + @Before + public void setUp() throws Exception { + db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build(); + super.setUp(); + } + + @After + public void tearDown() throws Exception { + super.tearDown(); + db.shutdown(); + } + + @Test + public void shouldCacheTemplateFunctions() throws InterruptedException { + JdbcTemplate jdbcTemplate = new JdbcTemplate(db); + CallableStatementWrapperFactory fac = new CallableStatementWrapperFactory(jdbcTemplate, new TemplateParser()); + + BatchCallableStatementCreatorFactory batchFactory1 = fac.getTemplateForBatch("FOO()"); + BatchCallableStatementCreatorFactory batchFactory2 = fac.getTemplateForBatch("FOO()"); + assertSame(batchFactory1, batchFactory2); + + TemplateStoredProcedure templateStoredProcedure1 = fac.getTemplateStoredProcedure("FOO()"); + TemplateStoredProcedure templateStoredProcedure2 = fac.getTemplateStoredProcedure("FOO()"); + assertSame(templateStoredProcedure1, templateStoredProcedure2); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateStoredProcedureTest.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateStoredProcedureTest.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateStoredProcedureTest.java deleted file mode 100644 index f538ce5..0000000 --- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TemplateStoredProcedureTest.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.camel.component.sql.stored; - -import org.apache.camel.Exchange; -import org.apache.camel.component.sql.stored.template.TemplateStoredProcedure; -import org.apache.camel.component.sql.stored.template.TemplateStoredProcedureFactory; -import org.apache.camel.test.junit4.CamelTestSupport; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; - -public class TemplateStoredProcedureTest extends CamelTestSupport { - - private TemplateStoredProcedureFactory parser; - private EmbeddedDatabase db; - private JdbcTemplate jdbcTemplate; - - @Before - public void setUp() throws Exception { - db = new EmbeddedDatabaseBuilder() - .setType(EmbeddedDatabaseType.DERBY).addScript("sql/storedProcedureTest.sql").build(); - jdbcTemplate = new JdbcTemplate(db); - parser = new TemplateStoredProcedureFactory(jdbcTemplate); - super.setUp(); - } - - - @Test - public void shouldExecuteStoredProcedure() { - TemplateStoredProcedure sp = new TemplateStoredProcedure(jdbcTemplate, parser.parseTemplate("ADDNUMBERS" - + "(INTEGER ${header.v1},INTEGER ${header.v2},OUT INTEGER resultofsum)")); - - Exchange exchange = createExchangeWithBody(null); - exchange.getIn().setHeader("v1", 1); - exchange.getIn().setHeader("v2", 2); - - sp.execute(exchange); - - Assert.assertEquals(Integer.valueOf(3), exchange.getOut().getHeader("resultofsum")); - } - - @Test - public void shouldExecuteNilacidProcedure() { - TemplateStoredProcedure sp = new TemplateStoredProcedure(jdbcTemplate, parser.parseTemplate("NILADIC()")); - - Exchange exchange = createExchangeWithBody(null); - exchange.getIn().setHeader("v1", 1); - exchange.getIn().setHeader("v2", 2); - - sp.execute(exchange); - } - - @After - public void tearDown() throws Exception { - super.tearDown(); - db.shutdown(); - } - -} http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java index 55e2624..fea0d11 100644 --- a/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java +++ b/components/camel-sql/src/test/java/org/apache/camel/component/sql/stored/TestStoredProcedure.java @@ -16,21 +16,36 @@ */ package org.apache.camel.component.sql.stored; +import java.util.concurrent.atomic.AtomicLong; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class TestStoredProcedure { + public static final AtomicLong BATCHFN_CALL_COUNTER = new AtomicLong(0); + private static final Logger LOG = LoggerFactory.getLogger(TestStoredProcedure.class); + private TestStoredProcedure() { } - public static void addnumbers(int val1, int val2, int[] ret) { + public static void subnumbers(int val1, int val2, int[] ret) { LOG.info("calling addnumbers:{} + {}", val1, val2); - ret[0] = val1 + val2; + ret[0] = val1 - val2; } + + public static void batchfn(String val1) { + LOG.info("calling batchfn:{}", val1); + if (val1 == null) { + throw new IllegalArgumentException("Argument val1 is null!"); + } + BATCHFN_CALL_COUNTER.incrementAndGet(); + } + + public static void niladic() { LOG.info("nilacid called"); } http://git-wip-us.apache.org/repos/asf/camel/blob/df5944fa/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql b/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql index 807768e..108c2e1 100644 --- a/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql +++ b/components/camel-sql/src/test/resources/sql/storedProcedureTest.sql @@ -15,14 +15,20 @@ -- limitations under the License. -- ------------------------------------------------------------------------ -CREATE PROCEDURE ADDNUMBERS(VALUE1 INTEGER, VALUE2 INTEGER,OUT RESULT INTEGER) +CREATE PROCEDURE SUBNUMBERS(VALUE1 INTEGER, VALUE2 INTEGER,OUT RESULT INTEGER) PARAMETER STYLE JAVA LANGUAGE JAVA EXTERNAL NAME -'org.apache.camel.component.sql.stored.TestStoredProcedure.addnumbers'; +'org.apache.camel.component.sql.stored.TestStoredProcedure.subnumbers'; CREATE PROCEDURE NILADIC() PARAMETER STYLE JAVA LANGUAGE JAVA EXTERNAL NAME -'org.apache.camel.component.sql.stored.TestStoredProcedure.niladic'; \ No newline at end of file +'org.apache.camel.component.sql.stored.TestStoredProcedure.niladic'; + +CREATE PROCEDURE BATCHFN(VALUE1 CHAR(10)) + PARAMETER STYLE JAVA + LANGUAGE JAVA + EXTERNAL NAME +'org.apache.camel.component.sql.stored.TestStoredProcedure.batchfn';