View Javadoc

1   /*
2    * $Id: SimpleUpdateSqlStatementStrategy.java 19191 2010-08-25 21:05:23Z tcarlson $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.transport.jdbc.sqlstrategy;
12  
13  import org.mule.DefaultMuleMessage;
14  import org.mule.api.MuleEvent;
15  import org.mule.api.MuleMessage;
16  import org.mule.api.endpoint.ImmutableEndpoint;
17  import org.mule.api.transaction.Transaction;
18  import org.mule.transaction.TransactionCoordination;
19  import org.mule.transport.jdbc.JdbcConnector;
20  import org.mule.transport.jdbc.JdbcUtils;
21  import org.mule.util.ArrayUtils;
22  
23  import java.sql.Connection;
24  import java.util.ArrayList;
25  import java.util.List;
26  
27  import org.apache.log4j.Logger;
28  /**
29   * Implements strategy for handling individual insert, update, and delete statements
30   *
31   */
32  public  class SimpleUpdateSqlStatementStrategy implements SqlStatementStrategy
33  {
34      protected transient Logger logger = Logger.getLogger(getClass());
35      
36      public MuleMessage executeStatement(JdbcConnector connector,
37              ImmutableEndpoint endpoint, MuleEvent event,long timeout) throws Exception
38      {
39          //Unparsed SQL statement (with #[foo] format parameters)
40          String statement = connector.getStatement(endpoint);
41  
42          //Storage for parameters
43          List paramNames = new ArrayList();
44          
45          //Parsed SQL statement (with ? placeholders instead of #[foo] params)
46          String sql = connector.parseStatement(statement, paramNames);
47          
48          //Optionally escape or further manipulate SQL statement.  Used in subclasses.
49          sql = escapeStatement(sql);
50          
51          //Get parameter values from message
52          MuleMessage message = event.getMessage();
53          Object[] paramValues = connector.getParams(endpoint, paramNames, new DefaultMuleMessage(
54              event.getMessage().getPayload(), message, event.getMuleContext()), endpoint.getEndpointURI().getAddress());
55  
56          Transaction tx = TransactionCoordination.getInstance().getTransaction();
57          Connection con = null;
58              
59          try
60          {
61              con = connector.getConnection();
62              
63              
64              if (logger.isDebugEnabled())
65              {
66                  logger.debug("SQL UPDATE: " + sql + ", params = " + ArrayUtils.toString(paramValues));
67              }
68              
69              int nbRows = connector.getQueryRunnerFor(endpoint).update(con, sql, paramValues);
70              if (logger.isInfoEnabled())
71              {
72                  logger.info("Executing SQL statement: " + nbRows + " row(s) updated");
73              }
74              
75              // TODO Why should it always be 1?  Can't we update more than one row at a time with
76              // an update statement?  Or no rows depending on the contents of the table and/or 
77              // parameters?
78              //if (nbRows != 1)
79              //{
80              //    logger.warn("Row count for write should be 1 and not " + nbRows);
81              //}
82              if (tx == null)
83              {
84                  JdbcUtils.commitAndClose(con);
85              }
86              logger.debug("MuleEvent dispatched succesfuly");
87          }
88          catch (Exception e)
89          {
90              logger.debug("Error dispatching event: " + e.getMessage(), e);
91              if (tx == null)
92              {
93                  JdbcUtils.rollbackAndClose(con);
94              }
95              throw e;
96          }
97          
98          return event.getMessage();
99      }
100     
101     protected String escapeStatement(String statement)
102     {
103         //no escaping needed for normal SQL statement
104         return statement;
105     }
106 }