001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.component.ibatis;
018    
019    import java.util.Iterator;
020    
021    import com.ibatis.sqlmap.client.SqlMapClient;
022    import org.apache.camel.Exchange;
023    import org.apache.camel.Message;
024    import org.apache.camel.impl.DefaultProducer;
025    import org.apache.camel.util.ExchangeHelper;
026    import org.apache.camel.util.ObjectHelper;
027    import org.apache.commons.logging.Log;
028    import org.apache.commons.logging.LogFactory;
029    
030    /**
031     * @version $Revision: 13007 $
032     */
033    public class IBatisProducer extends DefaultProducer {
034        private static final Log LOG = LogFactory.getLog(IBatisProducer.class);
035        private String statement;
036        private final IBatisEndpoint endpoint;
037    
038        public IBatisProducer(IBatisEndpoint endpoint) {
039            super(endpoint);
040            this.endpoint = endpoint;
041            this.statement = endpoint.getEntityName();
042        }
043    
044        @Override
045        public IBatisEndpoint getEndpoint() {
046            return (IBatisEndpoint) super.getEndpoint();
047        }
048    
049        public void process(Exchange exchange) throws Exception {
050            switch (endpoint.getStatementType()) {
051            case QueryForObject:
052                doQueryForObject(exchange); break;
053            case QueryForList:
054                doQueryForList(exchange); break;
055            case Insert:
056                doInsert(exchange); break;
057            case Update:
058                doUpdate(exchange); break;
059            case Delete:
060                doDelete(exchange); break;
061            default:
062                throw new IllegalArgumentException("Unsupported statementType: " + endpoint.getStatementType());
063            }
064        }
065    
066        private void doQueryForObject(Exchange exchange) throws Exception {
067            SqlMapClient client = endpoint.getSqlClient();
068    
069            Object result;
070            Object in = exchange.getIn().getBody();
071            if (in != null) {
072                if (LOG.isTraceEnabled()) {
073                    LOG.trace("QueryForObject: " + in + "  using statement: " + statement);
074                }
075                result = client.queryForObject(statement, in);
076            } else {
077                if (LOG.isTraceEnabled()) {
078                    LOG.trace("QueryForObject using statement: " + statement);
079                }
080                result = client.queryForObject(statement);
081            }
082    
083            doProcessResult(exchange, result);
084        }
085    
086        private void doQueryForList(Exchange exchange) throws Exception {
087            SqlMapClient client = endpoint.getSqlClient();
088    
089            Object result;
090            Object in = exchange.getIn().getBody();
091            if (in != null) {
092                if (LOG.isTraceEnabled()) {
093                    LOG.trace("QueryForList: " + in + "  using statement: " + statement);
094                }
095                result = client.queryForList(statement, in);
096            } else {
097                if (LOG.isTraceEnabled()) {
098                    LOG.trace("QueryForList using statement: " + statement);
099                }
100                result = client.queryForList(statement);
101            }
102    
103            doProcessResult(exchange, result);
104        }
105    
106        private void doInsert(Exchange exchange) throws Exception {
107            SqlMapClient client = endpoint.getSqlClient();
108    
109            Object result;
110            Object in = exchange.getIn().getBody();
111            if (in != null) {
112                // lets handle arrays or collections of objects
113                Iterator iter = ObjectHelper.createIterator(in);
114                while (iter.hasNext()) {
115                    Object value = iter.next();
116                    if (LOG.isTraceEnabled()) {
117                        LOG.trace("Inserting: " + value + " using statement: " + statement);
118                    }
119                    result = client.insert(statement, value);
120                    doProcessResult(exchange, result);
121                }
122            } else {
123                if (LOG.isTraceEnabled()) {
124                    LOG.trace("Inserting using statement: " + statement);
125                }
126                result = client.insert(statement);
127                doProcessResult(exchange, result);
128            }
129        }
130    
131        private void doUpdate(Exchange exchange) throws Exception {
132            SqlMapClient client = endpoint.getSqlClient();
133    
134            Object result;
135            Object in = exchange.getIn().getBody();
136            if (in != null) {
137                // lets handle arrays or collections of objects
138                Iterator iter = ObjectHelper.createIterator(in);
139                while (iter.hasNext()) {
140                    Object value = iter.next();
141                    if (LOG.isTraceEnabled()) {
142                        LOG.trace("Updating: " + value + " using statement: " + statement);
143                    }
144                    result = client.update(statement, value);
145                    doProcessResult(exchange, result);
146                }
147            } else {
148                if (LOG.isTraceEnabled()) {
149                    LOG.trace("Updating using statement: " + statement);
150                }
151                result = client.update(statement);
152                doProcessResult(exchange, result);
153            }
154        }
155    
156        private void doDelete(Exchange exchange) throws Exception {
157            SqlMapClient client = endpoint.getSqlClient();
158    
159            Object result;
160            Object in = exchange.getIn().getBody();
161            if (in != null) {
162                // lets handle arrays or collections of objects
163                Iterator iter = ObjectHelper.createIterator(in);
164                while (iter.hasNext()) {
165                    Object value = iter.next();
166                    if (LOG.isTraceEnabled()) {
167                        LOG.trace("Deleting: " + value + " using statement: " + statement);
168                    }
169                    result = client.delete(statement, value);
170                    doProcessResult(exchange, result);
171                }
172            } else {
173                if (LOG.isTraceEnabled()) {
174                    LOG.trace("Deleting using statement: " + statement);
175                }
176                result = client.delete(statement);
177                doProcessResult(exchange, result);
178            }
179        }
180    
181        private void doProcessResult(Exchange exchange, Object result) {
182            if (endpoint.getStatementType() == StatementType.QueryForList || endpoint.getStatementType() == StatementType.QueryForObject) {
183                Message answer = exchange.getIn();
184                if (ExchangeHelper.isOutCapable(exchange)) {
185                    answer = exchange.getOut();
186                    // preserve headers
187                    answer.getHeaders().putAll(exchange.getIn().getHeaders());
188                }
189                // set the result as body for insert
190                answer.setBody(result);
191    
192                answer.setHeader("CamelIBatisResult", result);
193                answer.setHeader("CamelIBatisStatementName", statement);
194                answer.setHeader("org.apache.camel.ibatis.queryName", statement);
195            } else {
196                Message msg = exchange.getIn();
197                msg.setHeader("CamelIBatisResult", result);
198                msg.setHeader("CamelIBatisStatementName", statement);
199                msg.setHeader("org.apache.camel.ibatis.queryName", statement);
200            }
201        }
202    
203    }