CAMEL-4725: Polished
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/e9f3f60d Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/e9f3f60d Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/e9f3f60d Branch: refs/heads/master Commit: e9f3f60d2a5d373b5e93c9a4ef4b50e71a2165ea Parents: 83ef4e6 Author: Claus Ibsen <davscl...@apache.org> Authored: Sat Jan 9 11:42:29 2016 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sat Jan 9 11:43:29 2016 +0100 ---------------------------------------------------------------------- .../sql/stored/SqlStoredComponent.java | 11 ++- .../component/sql/stored/SqlStoredEndpoint.java | 82 ++++++++++++++++---- .../component/sql/stored/SqlStoredProducer.java | 2 - .../template/TemplateStoredProcedure.java | 5 ++ .../TemplateStoredProcedureFactory.java | 14 +++- .../sql/stored/template/ast/ParseHelper.java | 2 +- .../template/ast/ParseRuntimeException.java | 1 + 7 files changed, 95 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/e9f3f60d/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredComponent.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredComponent.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredComponent.java index 7012186..3391450 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredComponent.java +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredComponent.java @@ -21,6 +21,7 @@ import javax.sql.DataSource; import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; +import org.apache.camel.component.sql.stored.template.TemplateStoredProcedureFactory; import org.apache.camel.impl.UriEndpointComponent; import org.apache.camel.util.CamelContextHelper; import org.springframework.jdbc.core.JdbcTemplate; @@ -58,7 +59,14 @@ public class SqlStoredComponent extends UriEndpointComponent { throw new IllegalArgumentException("DataSource must be configured"); } - return new SqlStoredEndpoint(new JdbcTemplate(target), remaining); + JdbcTemplate template = new JdbcTemplate(target); + TemplateStoredProcedureFactory factory = new TemplateStoredProcedureFactory(template); + + SqlStoredEndpoint answer = new SqlStoredEndpoint(uri, this); + answer.setJdbcTemplate(template); + answer.setTemplate(remaining); + answer.setTemplateStoredProcedureFactory(factory); + return answer; } public DataSource getDataSource() { @@ -71,4 +79,5 @@ public class SqlStoredComponent extends UriEndpointComponent { public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } + } http://git-wip-us.apache.org/repos/asf/camel/blob/e9f3f60d/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 8ded03a..e65fa8b 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 @@ -16,46 +16,96 @@ */ package org.apache.camel.component.sql.stored; +import org.apache.camel.Component; +import org.apache.camel.Consumer; +import org.apache.camel.Processor; import org.apache.camel.Producer; import org.apache.camel.component.sql.stored.template.TemplateStoredProcedureFactory; -import org.apache.camel.impl.DefaultPollingEndpoint; +import org.apache.camel.impl.DefaultEndpoint; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriPath; +import org.apache.camel.util.ObjectHelper; +import org.apache.camel.util.ServiceHelper; import org.apache.camel.util.UnsafeUriCharactersEncoder; import org.springframework.jdbc.core.JdbcTemplate; -@UriEndpoint(scheme = "sql-stored", title = "SQL stored", syntax = "sql-stored:template", label = "database,sql") -public class SqlStoredEndpoint extends DefaultPollingEndpoint { +@UriEndpoint(scheme = "sql-stored", title = "SQL StoredProcedure", syntax = "sql-stored:template", producerOnly = true, label = "database,sql") +public class SqlStoredEndpoint extends DefaultEndpoint { - @UriPath(description = "Sets the stored procedure template to perform") - @Metadata(required = "true") - private String template; - - private final TemplateStoredProcedureFactory templateStoredProcedureFactory; - - private final JdbcTemplate jdbcTemplate; + private JdbcTemplate jdbcTemplate; + private TemplateStoredProcedureFactory templateStoredProcedureFactory; + @UriPath @Metadata(required = "true") + private String template; - public SqlStoredEndpoint(JdbcTemplate jdbcTemplate, - String template) { - this.templateStoredProcedureFactory = new TemplateStoredProcedureFactory(jdbcTemplate); - this.jdbcTemplate = jdbcTemplate; - this.template = template; + public SqlStoredEndpoint(String endpointUri, Component component) { + super(endpointUri, component); } @Override public Producer createProducer() throws Exception { + ObjectHelper.notNull(template, "template"); + ObjectHelper.notNull(templateStoredProcedureFactory, "templateStoredProcedureFactory"); + return new SqlStoredProducer(this, template, templateStoredProcedureFactory); } @Override + public Consumer createConsumer(Processor processor) throws Exception { + throw new UnsupportedOperationException("This component does not support consumer"); + } + + @Override public boolean isSingleton() { - return false; + return true; } @Override protected String createEndpointUri() { return "sql-stored:" + UnsafeUriCharactersEncoder.encode(template); } + + @Override + protected void doStart() throws Exception { + ServiceHelper.startService(templateStoredProcedureFactory); + } + + @Override + protected void doStop() throws Exception { + ServiceHelper.stopService(templateStoredProcedureFactory); + } + + public String getTemplate() { + return template; + } + + /** + * The stored procedure template to perform + */ + public void setTemplate(String template) { + this.template = template; + } + + public TemplateStoredProcedureFactory getTemplateStoredProcedureFactory() { + return templateStoredProcedureFactory; + } + + /** + * To use a custom instance of TemplateStoredProcedureFactory + */ + public void setTemplateStoredProcedureFactory(TemplateStoredProcedureFactory templateStoredProcedureFactory) { + this.templateStoredProcedureFactory = templateStoredProcedureFactory; + } + + public JdbcTemplate getJdbcTemplate() { + return jdbcTemplate; + } + + /** + * to use a custom instance of JdbcTemplate + */ + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/e9f3f60d/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java index 81ff287..4a7ccc4 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/SqlStoredProducer.java @@ -24,12 +24,10 @@ import org.apache.camel.impl.DefaultProducer; public class SqlStoredProducer extends DefaultProducer { - private TemplateStoredProcedureFactory templateStoredProcedureFactory; private TemplateStoredProcedure defaultTemplateStoredProcedure; public SqlStoredProducer(Endpoint endpoint, String template, TemplateStoredProcedureFactory templateStoredProcedureFactory) { super(endpoint); - this.templateStoredProcedureFactory = templateStoredProcedureFactory; this.defaultTemplateStoredProcedure = templateStoredProcedureFactory.createFromString(template); } http://git-wip-us.apache.org/repos/asf/camel/blob/e9f3f60d/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedure.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedure.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedure.java index e0821f5..180c1b2 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedure.java +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedure.java @@ -23,6 +23,8 @@ import org.apache.camel.Exchange; import org.apache.camel.component.sql.stored.template.ast.InputParameter; import org.apache.camel.component.sql.stored.template.ast.OutParameter; import org.apache.camel.component.sql.stored.template.ast.Template; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.SqlOutParameter; import org.springframework.jdbc.core.SqlParameter; @@ -30,6 +32,7 @@ import org.springframework.jdbc.object.StoredProcedure; public class TemplateStoredProcedure extends StoredProcedure { + private static final Logger LOG = LoggerFactory.getLogger(TemplateStoredProcedure.class); private final Template template; public TemplateStoredProcedure(JdbcTemplate jdbcTemplate, Template template) { @@ -47,6 +50,7 @@ public class TemplateStoredProcedure extends StoredProcedure { setFunction(false); } + LOG.debug("Compiling stored procedure: {}", template.getProcedureName()); compile(); } @@ -58,6 +62,7 @@ public class TemplateStoredProcedure extends StoredProcedure { params.put(inputParameter.getName(), inputParameter.getValueExpression().evaluate(exchange, inputParameter.getJavaType())); } + LOG.debug("Invoking stored procedure: {}", template.getProcedureName()); Map<String, Object> ret = super.execute(params); for (OutParameter out : template.getOutParameterList()) { http://git-wip-us.apache.org/repos/asf/camel/blob/e9f3f60d/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedureFactory.java ---------------------------------------------------------------------- diff --git a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedureFactory.java b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedureFactory.java index 5d5a329..f096dc8 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedureFactory.java +++ b/components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/TemplateStoredProcedureFactory.java @@ -22,14 +22,15 @@ 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.support.ServiceSupport; import org.apache.camel.util.LRUCache; import org.springframework.jdbc.core.JdbcTemplate; -public class TemplateStoredProcedureFactory { +public class TemplateStoredProcedureFactory extends ServiceSupport { public static final int TEMPLATE_CACHE_DEFAULT_SIZE = 200; private final JdbcTemplate jdbcTemplate; - private LRUCache<String, TemplateStoredProcedure> templateCache = new LRUCache<String, TemplateStoredProcedure>(TEMPLATE_CACHE_DEFAULT_SIZE); + private final LRUCache<String, TemplateStoredProcedure> templateCache = new LRUCache<String, TemplateStoredProcedure>(TEMPLATE_CACHE_DEFAULT_SIZE); public TemplateStoredProcedureFactory(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; @@ -63,4 +64,13 @@ public class TemplateStoredProcedureFactory { return input; } + @Override + protected void doStart() throws Exception { + } + + @Override + protected void doStop() throws Exception { + // clear cache when we are stopping + templateCache.clear(); + } } http://git-wip-us.apache.org/repos/asf/camel/blob/e9f3f60d/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 19417de..dd926ef 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 @@ -43,7 +43,7 @@ public final class ParseHelper { public static Class sqlTypeToJavaType(int sqlType, String sqlTypeStr) { //TODO: as rest of types. //TODO: add test for each type. - Class ret = null; + Class ret; switch (sqlType) { case Types.INTEGER: ret = Integer.class; http://git-wip-us.apache.org/repos/asf/camel/blob/e9f3f60d/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 2092afa..2fdea24 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 @@ -17,6 +17,7 @@ package org.apache.camel.component.sql.stored.template.ast; public class ParseRuntimeException extends RuntimeException { + public ParseRuntimeException(String message) { super(message); }