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