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 }