/**
* 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.math.BigInteger;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
import org.apache.camel.Exchange;
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;
import org.apache.camel.component.sql.stored.template.ast.OutParameter;
import org.apache.camel.component.sql.stored.template.ast.ParseRuntimeException;
import org.apache.camel.component.sql.stored.template.ast.Template;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Assert;
import org.junit.Test;
public class ParserTest extends CamelTestSupport {
TemplateParser parser = new TemplateParser();
@Test
public void shouldParseOk() {
Template template = parser.parseTemplate("addnumbers(INTEGER ${header.header1},"
+ "VARCHAR ${property.property1},BIGINT ${header.header2},OUT INTEGER header1)");
Assert.assertEquals("addnumbers", template.getProcedureName());
Assert.assertEquals(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 = (InputParameter) template.getParameterList().get(0);
Assert.assertEquals("_0", param1.getName());
Assert.assertEquals(Types.INTEGER, param1.getSqlType());
Assert.assertEquals(1, param1.getValueExtractor().eval(exchange, null));
InputParameter param2 = (InputParameter) template.getParameterList().get(1);
Assert.assertEquals("_1", param2.getName());
Assert.assertEquals(Types.VARCHAR, param2.getSqlType());
Assert.assertEquals("constant string", param2.getValueExtractor().eval(exchange, null));
InputParameter param3 = (InputParameter) template.getParameterList().get(2);
Assert.assertEquals("_2", param3.getName());
Assert.assertEquals(Types.BIGINT, param3.getSqlType());
Assert.assertEquals(BigInteger.valueOf(2L), param3.getValueExtractor().eval(exchange, null));
OutParameter sptpOutputNode = (OutParameter) template.getParameterList().get(3);
Assert.assertEquals("_3", sptpOutputNode.getName());
Assert.assertEquals(Types.INTEGER, sptpOutputNode.getSqlType());
Assert.assertEquals("header1", sptpOutputNode.getOutValueMapKey());
}
@Test(expected = ParseRuntimeException.class)
public void noOutputParameterShouldFail() {
parser.parseTemplate("ADDNUMBERS2"
+ "(INTEGER VALUE1 ${header.v1},INTEGER VALUE2 ${header.v2})");
}
@Test(expected = ParseRuntimeException.class)
public void unexistingTypeShouldFail() {
parser.parseTemplate("ADDNUMBERS2"
+ "(XML VALUE1 ${header.v1},OUT INTEGER VALUE2 ${header.v2})");
}
@Test
public void nestedSimpleExpression() {
Exchange exchange = createExchangeWithBody(1);
exchange.getIn().setHeader("foo", 1);
exchange.getIn().setHeader("bar", 3);
Template template = parser.parseTemplate("ADDNUMBERS2(INTEGER ${header.foo},INTEGER ${header.bar})");
assertEquals(1, ((InputParameter) template.getParameterList().get(0)).getValueExtractor().eval(exchange, null));
assertEquals(3, ((InputParameter) template.getParameterList().get(1)).getValueExtractor().eval(exchange, null));
}
@Test
public void vendorSpecificPositiveSqlType() {
Template template = parser.parseTemplate("ADDNUMBERS2(1342 ${header.foo})");
assertEquals(1342, ((InputParameter) template.getParameterList().get(0)).getSqlType());
}
@Test
public void vendorSpecificNegativeSqlType() {
Template template = parser.parseTemplate("ADDNUMBERS2(-1342 ${header.foo})");
assertEquals(-1342, ((InputParameter) template.getParameterList().get(0)).getSqlType());
}
@Test
public void colonInSimple() {
PropertiesComponent pc = (PropertiesComponent) context.getComponent("properties");
pc.setLocation("classpath:jndi.properties");
Exchange exchange = createExchangeWithBody(1);
Template template = parser.parseTemplate("ADDNUMBERS2(-1342 ${properties:java.naming.factory.initial})");
assertEquals("org.apache.camel.util.jndi.CamelInitialContextFactory",((InputParameter)template.getParameterList().get(0)).getValueExtractor().eval(exchange, null));
}
@Test
public void colonInLocation() {
Template template = parser.parseTemplate("ADDNUMBERS2(-1342 :#a:)");
Exchange exchange = createExchangeWithBody(1);
Map container = new HashMap();
container.put("a:",1);
assertEquals(1, ((InputParameter) template.getParameterList().get(0)).getValueExtractor().eval(exchange, container));
}
@Test
public void vendorSpecificPositiveSqlTypeOut() {
Template template = parser.parseTemplate("ADDNUMBERS2(OUT 1342 h1)");
assertEquals(1342, ((OutParameter) template.getParameterList().get(0)).getSqlType());
}
@Test
public void vendorSpecificNegativeSqlTypeOut() {
Template template = parser.parseTemplate("ADDNUMBERS2(OUT -1342 h1)");
assertEquals(-1342, ((OutParameter) template.getParameterList().get(0)).getSqlType());
}
@Test
public void nableIssueSyntax() {
Map<String, String> 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"
+ "(OTHER VALUE1 ${header.v1},INTEGER VALUE2 ${header.v2})");
}
}