You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@synapse.apache.org by as...@apache.org on 2007/09/20 14:30:15 UTC
svn commit: r577717 - in
/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse:
config/xml/AbstractDBMediatorFactory.java
config/xml/AbstractDBMediatorSerializer.java
mediators/db/AbstractDBMediator.java mediators/db/Statement.java
Author: asankha
Date: Thu Sep 20 05:30:12 2007
New Revision: 577717
URL: http://svn.apache.org/viewvc?rev=577717&view=rev
Log:
refactor DB mediators
Move them to core from extensions
Extract abstract classes to reduce code and complexity
use apache DBCP for DataSource/Connection pooling
TODO - do error handling and logging/tracing
Added:
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorFactory.java
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorSerializer.java
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/AbstractDBMediator.java
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/Statement.java
Added: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorFactory.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorFactory.java?rev=577717&view=auto
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorFactory.java (added)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorFactory.java Thu Sep 20 05:30:12 2007
@@ -0,0 +1,267 @@
+/*
+ * 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.synapse.config.xml;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.xpath.AXIOMXPath;
+import org.apache.synapse.mediators.db.AbstractDBMediator;
+import org.apache.synapse.mediators.db.Statement;
+import org.apache.synapse.SynapseException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
+import org.jaxen.JaxenException;
+
+import javax.xml.namespace.QName;
+import java.sql.Connection;
+import java.util.Iterator;
+
+/**
+ * <dbreport | dblookup | .. etc>
+ * <connection>
+ * <pool>
+ * <driver/>
+ * <url/>
+ * <user/>
+ * <password/>
+ * <property name="name" value="value"/>*
+ * </pool>
+ * </connection>
+ * <statement>
+ * <sql>insert into table values (?, ?, ..)</sql>
+ * <parameter [value="" | expression=""] type="int|string"/>*
+ * <result name="string" column="int|string"/>*
+ * </statement>+
+ * </dbreport | dblookup | .. etc>
+ *
+ * Supported properties
+ * autocommit = true | false
+ * isolation = Connection.TRANSACTION_NONE
+ * | Connection.TRANSACTION_READ_COMMITTED
+ * | Connection.TRANSACTION_READ_UNCOMMITTED
+ * | Connection.TRANSACTION_REPEATABLE_READ
+ * | Connection.TRANSACTION_SERIALIZABLE
+ * initialsize = int
+ * maxactive = int
+ * maxidle = int
+ * maxopenstatements = int
+ * maxwait = long
+ * minidle = int
+ * poolstatements = true | false
+ * testonborrow = true | false
+ * testonreturn = true | false
+ * testwhileidle = true | false
+ * validationquery = String
+ */
+public abstract class AbstractDBMediatorFactory extends AbstractMediatorFactory {
+
+ private static final Log log = LogFactory.getLog(AbstractDBMediatorFactory.class);
+
+ static final QName DRIVER_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "driver");
+ public static final QName URL_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "url");
+ static final QName USER_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "user");
+ static final QName PASS_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "password");
+ static final QName PROP_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "property");
+
+ static final QName STMNT_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "statement");
+ static final QName SQL_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "sql");
+ static final QName PARAM_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "parameter");
+ static final QName RESULT_Q = new QName(XMLConfigConstants.SYNAPSE_NAMESPACE, "result");
+
+ static final QName ATT_NAME = new QName("name");
+ static final QName ATT_VALUE = new QName("value");
+ static final QName ATT_COLUMN = new QName("column");
+ static final QName ATT_EXPRN = new QName("expression");
+ static final QName ATT_TYPE = new QName("type");
+
+ protected void buildDataSource(OMElement elem, AbstractDBMediator mediator) {
+
+ BasicDataSource ds = new BasicDataSource();
+
+ try {
+ AXIOMXPath xpath = new AXIOMXPath("//syn:connection/syn:pool");
+ xpath.addNamespace("syn", XMLConfigConstants.SYNAPSE_NAMESPACE);
+ OMElement pool = (OMElement) xpath.selectSingleNode(elem);
+
+ // load the minimum required properties
+ ds.setDriverClassName(getValue(pool, DRIVER_Q));
+ ds.setUsername(getValue(pool, USER_Q));
+ ds.setPassword(getValue(pool, PASS_Q));
+ ds.setUrl(getValue(pool, URL_Q));
+
+ //save loaded properties for later
+ mediator.addDataSourceProperty(DRIVER_Q, getValue(pool, DRIVER_Q));
+ mediator.addDataSourceProperty(URL_Q, getValue(pool, URL_Q));
+ mediator.addDataSourceProperty(USER_Q, getValue(pool, USER_Q));
+ mediator.addDataSourceProperty(PASS_Q, getValue(pool, PASS_Q));
+
+ Iterator props = pool.getChildrenWithName(PROP_Q);
+ while (props.hasNext()) {
+
+ OMElement prop = (OMElement) props.next();
+ String name = prop.getAttribute(ATT_NAME).getAttributeValue();
+ String value = prop.getAttribute(ATT_VALUE).getAttributeValue();
+ // save property for later
+ mediator.addDataSourceProperty(name, value);
+
+ if ("autocommit".equals(name)) {
+ if ("true".equals(value)) {
+ ds.setDefaultAutoCommit(true);
+ } else if ("false".equals(value)) {
+ ds.setDefaultAutoCommit(false);
+ }
+ } else if ("isolation".equals(name)) {
+ try {
+ if ("Connection.TRANSACTION_NONE".equals(value)) {
+ ds.setDefaultTransactionIsolation(Connection.TRANSACTION_NONE);
+ } else if ("Connection.TRANSACTION_READ_COMMITTED".equals(value)) {
+ ds.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+ } else if ("Connection.TRANSACTION_READ_UNCOMMITTED".equals(value)) {
+ ds.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
+ } else if ("Connection.TRANSACTION_REPEATABLE_READ".equals(value)) {
+ ds.setDefaultTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
+ } else if ("Connection.TRANSACTION_SERIALIZABLE".equals(value)) {
+ ds.setDefaultTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
+ }
+ } catch (NumberFormatException ignore) {}
+ } else if ("initialsize".equals(name)) {
+ try {
+ ds.setInitialSize(Integer.parseInt(value));
+ } catch (NumberFormatException ignore) {}
+ } else if ("maxactive".equals(name)) {
+ try {
+ ds.setMaxActive(Integer.parseInt(value));
+ } catch (NumberFormatException ignore) {}
+ } else if ("maxidle".equals(name)) {
+ try {
+ ds.setMaxIdle(Integer.parseInt(value));
+ } catch (NumberFormatException ignore) {}
+ } else if ("maxopenstatements".equals(name)) {
+ try {
+ ds.setMaxOpenPreparedStatements(Integer.parseInt(value));
+ } catch (NumberFormatException ignore) {}
+ } else if ("maxwait".equals(name)) {
+ try {
+ ds.setMaxWait(Long.parseLong(value));
+ } catch (NumberFormatException ignore) {}
+ } else if ("minidle".equals(name)) {
+ try {
+ ds.setMinIdle(Integer.parseInt(value));
+ } catch (NumberFormatException ignore) {}
+ } else if ("poolstatements".equals(name)) {
+ if ("true".equals(value)) {
+ ds.setPoolPreparedStatements(true);
+ } else if ("false".equals(value)) {
+ ds.setPoolPreparedStatements(false);
+ }
+ } else if ("testonborrow".equals(name)) {
+ if ("true".equals(value)) {
+ ds.setTestOnBorrow(true);
+ } else if ("false".equals(value)) {
+ ds.setTestOnBorrow(false);
+ }
+ } else if ("testonreturn".equals(name)) {
+ if ("true".equals(value)) {
+ ds.setTestOnReturn(true);
+ } else if ("false".equals(value)) {
+ ds.setTestOnReturn(false);
+ }
+ } else if ("testwhileidle".equals(name)) {
+ if ("true".equals(value)) {
+ ds.setTestWhileIdle(true);
+ } else if ("false".equals(value)) {
+ ds.setTestWhileIdle(false);
+ }
+ } else if ("validationquery".equals(name)) {
+ ds.setValidationQuery(value);
+ }
+ }
+ } catch (JaxenException e) {
+ handleException("DataSource connection information must be specified");
+ }
+ mediator.setDataSource(ds);
+ }
+
+ protected void processStatements(OMElement elem, AbstractDBMediator mediator) {
+
+ Iterator iter = elem.getChildrenWithName(STMNT_Q);
+ while (iter.hasNext()) {
+
+ OMElement stmntElt = (OMElement) iter.next();
+ Statement statement = new Statement(getValue(stmntElt, SQL_Q));
+
+ Iterator paramIter = stmntElt.getChildrenWithName(PARAM_Q);
+ while (paramIter.hasNext()) {
+
+ OMElement paramElt = (OMElement) paramIter.next();
+ try {
+ statement.addParameter(
+ getAttribute(paramElt, ATT_VALUE),
+ getAttribute(paramElt, ATT_EXPRN),
+ getAttribute(paramElt, ATT_TYPE));
+ } catch (JaxenException e) {
+ handleException("Invalid XPath expression for query : "
+ + getAttribute(paramElt, ATT_EXPRN));
+ }
+ }
+
+ Iterator resultIter = stmntElt.getChildrenWithName(RESULT_Q);
+ while (resultIter.hasNext()) {
+
+ OMElement resultElt = (OMElement) resultIter.next();
+ statement.addResult(
+ getAttribute(resultElt, ATT_NAME),
+ getAttribute(resultElt, ATT_COLUMN));
+ }
+
+ mediator.addStatement(statement);
+ }
+ }
+
+ protected String getValue(OMElement elt, QName qName) {
+ OMElement e = elt.getFirstChildWithName(qName);
+ if (e != null) {
+ return e.getText();
+ } else {
+ handleException("Unable to read configuration value for : " + qName);
+ }
+ return null;
+ }
+
+ protected String getAttribute(OMElement elt, QName qName) {
+ OMAttribute a = elt.getAttribute(qName);
+ if (a != null) {
+ return a.getAttributeValue();
+ }
+ return null;
+ }
+
+ protected void handleException(String msg) {
+ log.error(msg);
+ throw new SynapseException(msg);
+ }
+
+ protected void handleException(String msg, Exception e) {
+ log.error(msg, e);
+ throw new SynapseException(msg, e);
+ }
+}
+
Added: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorSerializer.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorSerializer.java?rev=577717&view=auto
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorSerializer.java (added)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/AbstractDBMediatorSerializer.java Thu Sep 20 05:30:12 2007
@@ -0,0 +1,169 @@
+/*
+ * 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.synapse.config.xml;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.mediators.db.Statement;
+import org.apache.synapse.mediators.db.AbstractDBMediator;
+import org.apache.synapse.SynapseException;
+import org.apache.axiom.om.OMElement;
+
+import javax.xml.namespace.QName;
+import java.util.Iterator;
+import java.sql.Types;
+
+/**
+ * <dbreport | dblookup | .. etc>
+ * <connection>
+ * <pool>
+ * <driver/>
+ * <url/>
+ * <user/>
+ * <password/>
+ * <property name="name" value="value"/>*
+ * </pool>
+ * </connection>
+ * <statement>
+ * <sql>insert into table values (?, ?, ..)</sql>
+ * <parameter [value="" | expression=""] type="int|string"/>*
+ * <result name="string" column="int|string"/>*
+ * </statement>+
+ * </dbreport | dblookup | .. etc>
+ *
+ * Supported properties
+ * autocommit = true | false
+ * isolation = Connection.TRANSACTION_NONE
+ * | Connection.TRANSACTION_READ_COMMITTED
+ * | Connection.TRANSACTION_READ_UNCOMMITTED
+ * | Connection.TRANSACTION_REPEATABLE_READ
+ * | Connection.TRANSACTION_SERIALIZABLE
+ * initialsize = int
+ * maxactive = int
+ * maxidle = int
+ * maxopenstatements = int
+ * maxwait = long
+ * minidle = int
+ * poolstatements = true | false
+ * testonborrow = true | false
+ * testonreturn = true | false
+ * testwhileidle = true | false
+ * validationquery = String
+ */
+public abstract class AbstractDBMediatorSerializer extends AbstractMediatorSerializer {
+
+ private static final Log log = LogFactory.getLog(AbstractDBMediatorSerializer.class);
+
+ protected void serializeDBInformation(AbstractDBMediator mediator, OMElement dbParent) {
+
+ OMElement connElt = fac.createOMElement("connection", synNS);
+ OMElement poolElt = fac.createOMElement("pool", synNS);
+
+ Iterator iter = mediator.getDataSourceProps().keySet().iterator();
+ while (iter.hasNext()) {
+
+ Object o = iter.next();
+ String value = (String) mediator.getDataSourceProps().get(o);
+
+ if (o instanceof QName) {
+ QName name = (QName) o;
+ OMElement elt = fac.createOMElement(name);
+ elt.setText(value);
+ poolElt.addChild(elt);
+
+ } else if (o instanceof String) {
+ OMElement elt = fac.createOMElement(AbstractDBMediatorFactory.PROP_Q);
+ elt.addAttribute(fac.createOMAttribute("name", nullNS, (String) o));
+ elt.addAttribute(fac.createOMAttribute("value", nullNS, value));
+ poolElt.addChild(elt);
+ }
+ }
+
+ connElt.addChild(poolElt);
+ dbParent.addChild(connElt);
+
+ // process statements
+ Iterator statementIter = mediator.getStatementList().iterator();
+ while (statementIter.hasNext()) {
+
+ Statement statement = (Statement) statementIter.next();
+ OMElement stmntElt = fac.createOMElement(AbstractDBMediatorFactory.STMNT_Q);
+
+ OMElement sqlElt = fac.createOMElement(AbstractDBMediatorFactory.SQL_Q);
+ sqlElt.setText(statement.getRawStatement());
+ stmntElt.addChild(sqlElt);
+
+ // serialize parameters of the statement
+ for (Iterator it = statement.getParameters().iterator(); it.hasNext(); ) {
+
+ Statement.Parameter param = (Statement.Parameter) it.next();
+ OMElement paramElt = fac.createOMElement(AbstractDBMediatorFactory.PARAM_Q);
+
+ if (param.getPropertyName() != null) {
+ paramElt.addAttribute(
+ fac.createOMAttribute("value", nullNS, param.getPropertyName()));
+ }
+ if (param.getXpath() != null) {
+ paramElt.addAttribute(
+ fac.createOMAttribute("expression", nullNS, param.getXpath().toString()));
+ serializeNamespaces(paramElt, param.getXpath());
+ }
+
+ switch (param.getType()) {
+ case Types.VARCHAR: {
+ paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "string"));
+ break;
+ }
+ case Types.INTEGER: {
+ paramElt.addAttribute(fac.createOMAttribute("type", nullNS, "int"));
+ break;
+ }
+ default:
+ // TODO handle
+ }
+
+ stmntElt.addChild(paramElt);
+ }
+
+ // serialize any optional results of the statement
+ for (Iterator it = statement.getResultsMap().keySet().iterator(); it.hasNext(); ) {
+
+ String name = (String) it.next();
+ String columnStr = (String) statement.getResultsMap().get(name);
+
+ OMElement resultElt = fac.createOMElement(AbstractDBMediatorFactory.RESULT_Q);
+
+ resultElt.addAttribute(
+ fac.createOMAttribute("name", nullNS, columnStr));
+ resultElt.addAttribute(
+ fac.createOMAttribute("column", nullNS, columnStr));
+
+ stmntElt.addChild(resultElt);
+ }
+
+ dbParent.addChild(stmntElt);
+ }
+ }
+
+ protected void handleException(String msg) {
+ log.error(msg);
+ throw new SynapseException(msg);
+ }
+}
Added: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/AbstractDBMediator.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/AbstractDBMediator.java?rev=577717&view=auto
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/AbstractDBMediator.java (added)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/AbstractDBMediator.java Thu Sep 20 05:30:12 2007
@@ -0,0 +1,151 @@
+/*
+ * 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.synapse.mediators.db;
+
+import org.apache.synapse.mediators.AbstractMediator;
+import org.apache.synapse.ManagedLifecycle;
+import org.apache.synapse.MessageContext;
+import org.apache.synapse.SynapseConstants;
+import org.apache.synapse.config.xml.AbstractDBMediatorFactory;
+import org.apache.synapse.core.SynapseEnvironment;
+import org.apache.synapse.core.axis2.Axis2MessageContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
+
+import javax.xml.namespace.QName;
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.Types;
+import java.util.*;
+
+/**
+ * This abstract DB mediator will perform common DB connection pooling etc. for all DB mediators
+ */
+public abstract class AbstractDBMediator extends AbstractMediator implements ManagedLifecycle {
+
+ private static final Log log = LogFactory.getLog(AbstractDBMediator.class);
+ private static final Log trace = LogFactory.getLog(SynapseConstants.TRACE_LOGGER);
+
+ /** Hold JDBC properties */
+ protected Map dataSourceProps = new HashMap();
+ /** The DataSource to get DB connections */
+ private DataSource dataSource = null;
+ /** Statements */
+ List statementList = new ArrayList();
+
+ /** For logging purposes refer to*/
+ private String url;
+
+ public void init(SynapseEnvironment se) {
+ url = (String) dataSourceProps.get(AbstractDBMediatorFactory.URL_Q);
+ }
+
+ public void destroy() {
+ try {
+ ((BasicDataSource) getDataSource()).close();
+ log.info("");
+ } catch (SQLException e) {
+ log.warn("Error shutting down DB connection pool for URL : " + url);
+ }
+ }
+
+ public boolean mediate(MessageContext synCtx) {
+ boolean shouldTrace = shouldTrace(synCtx.getTracingState());
+
+ for (Iterator iter = statementList.iterator(); iter.hasNext(); ) {
+ processStatement((Statement) iter.next(), synCtx);
+ }
+ return true;
+ }
+
+ abstract protected void processStatement(Statement query, MessageContext msgCtx);
+
+ public DataSource getDataSource() {
+ return dataSource;
+ }
+
+ public void setDataSource(DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ public void addDataSourceProperty(QName name, String value) {
+ dataSourceProps.put(name, value);
+ }
+
+ public void addDataSourceProperty(String name, String value) {
+ dataSourceProps.put(name, value);
+ }
+
+ public Map getDataSourceProps() {
+ return dataSourceProps;
+ }
+
+ public void addStatement(Statement stmnt) {
+ statementList.add(stmnt);
+ }
+
+ public List getStatementList() {
+ return statementList;
+ }
+
+ /**
+ * Return a Prepared statement for the given Statement object, which is ready to be executed
+ * @param stmnt
+ * @param msgCtx
+ * @return
+ * @throws SQLException
+ */
+ protected PreparedStatement getPreparedStatement(Statement stmnt, MessageContext msgCtx) throws SQLException {
+ Connection con = getDataSource().getConnection();
+ PreparedStatement ps = con.prepareStatement(stmnt.getRawStatement());
+
+ // set parameters if any
+ List params = stmnt.getParameters();
+ int column = 1;
+
+ for (Iterator pi = params.iterator(); pi.hasNext(); ) {
+
+ Statement.Parameter param = (Statement.Parameter) pi.next();
+ switch (param.getType()) {
+ case Types.VARCHAR: {
+ ps.setString(column++,
+ param.getPropertyName() != null ?
+ (String) msgCtx.getProperty(param.getPropertyName()) :
+ Axis2MessageContext.getStringValue(param.getXpath(), msgCtx));
+ break;
+ }
+ case Types.INTEGER: {
+ ps.setInt(column++,
+ Integer.parseInt(param.getPropertyName() != null ?
+ (String) msgCtx.getProperty(param.getPropertyName()) :
+ Axis2MessageContext.getStringValue(param.getXpath(), msgCtx)));
+ break;
+ }
+ default: {
+ // todo handle this
+ }
+ }
+ }
+ return ps;
+ }
+}
Added: webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/Statement.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/Statement.java?rev=577717&view=auto
==============================================================================
--- webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/Statement.java (added)
+++ webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/db/Statement.java Thu Sep 20 05:30:12 2007
@@ -0,0 +1,98 @@
+/*
+ * 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.synapse.mediators.db;
+
+import org.apache.axiom.om.xpath.AXIOMXPath;
+import org.jaxen.JaxenException;
+
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Encapsulates an SQL statement, one or more parameters for it and optionally some information
+ * about results that one would like to read.
+ */
+public class Statement {
+
+ String rawStatement = null;
+ List parameters = new ArrayList();
+ Map resultsMap = new HashMap();
+
+ public Statement(String rawStatement) {
+ this.rawStatement = rawStatement;
+ }
+
+ public String getRawStatement() {
+ return rawStatement;
+ }
+
+ public void addParameter(String propertyName, String xpath, String type) throws JaxenException {
+ parameters.add(new Parameter(propertyName, xpath, type));
+ }
+
+ public void addResult(String propertyName, String column) {
+ resultsMap.put(propertyName, column);
+ }
+
+ public List getParameters() {
+ return parameters;
+ }
+
+ public Map getResultsMap() {
+ return resultsMap;
+ }
+
+ public class Parameter {
+ String propertyName = null;
+ AXIOMXPath xpath = null;
+ int type = 0;
+
+ Parameter(String value, String xpath, String type) throws JaxenException {
+ this.propertyName = value;
+ if (xpath != null) {
+ this.xpath = new AXIOMXPath(xpath);
+ }
+
+ if ("string".equals(type)) {
+ this.type = Types.VARCHAR;
+ } else if ("int".equals(type)) {
+ this.type = Types.INTEGER;
+ } else {
+ // todo
+ }
+ }
+
+ public String getPropertyName() {
+ return propertyName;
+ }
+
+ public AXIOMXPath getXpath() {
+ return xpath;
+ }
+
+ public int getType() {
+ return type;
+ }
+ }
+}
+
---------------------------------------------------------------------
To unsubscribe, e-mail: synapse-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: synapse-dev-help@ws.apache.org