001: /*
002: * ChainBuilder ESB
003: * Visual Enterprise Integration
004: *
005: * Copyright (C) 2006 Bostech Corporation
006: *
007: * This program is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU General Public License as published by the
009: * Free Software Foundation; either version 2 of the License, or (at your option)
010: * any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
014: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
015: * for more details.
016: *
017: * You should have received a copy of the GNU General Public License along with
018: * this program; if not, write to the Free Software Foundation, Inc.,
019: * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: *
022: * $Id$
023: */
024: package com.bostechcorp.cbesb.runtime.component.transformer.processors;
025:
026: import java.util.HashMap;
027: import java.util.Iterator;
028: import java.util.Set;
029: import java.util.Vector;
030:
031: import javax.activation.DataHandler;
032: import javax.jbi.JBIException;
033: import javax.jbi.messaging.InOnly;
034: import javax.jbi.messaging.MessageExchange;
035: import javax.jbi.messaging.MessagingException;
036: import javax.jbi.messaging.NormalizedMessage;
037: import javax.xml.namespace.QName;
038: import javax.xml.transform.Source;
039:
040: import org.apache.commons.logging.Log;
041: import org.apache.commons.logging.LogFactory;
042:
043: import com.bostechcorp.cbesb.common.constant.MetadataConstants;
044: import com.bostechcorp.cbesb.common.runtime.CbesbException;
045: import com.bostechcorp.cbesb.common.util.EsbPathHelper;
046: import com.bostechcorp.cbesb.runtime.ccsl.jbi.messaging.CbProviderProcessor;
047: import com.bostechcorp.cbesb.runtime.ccsl.nmhandler.NormalizedMessageHandler;
048: import com.bostechcorp.cbesb.runtime.component.transformer.TransformerEndpoint;
049: import com.bostechcorp.cbesb.runtime.transformer.engine.TransformerMessage;
050: import com.bostechcorp.cbesb.runtime.transformer.engine.TransformerRuntime;
051:
052: /**
053: * The class for Transformer provider processsor for provider endpoint in Transformer component.
054: * The Transformer component only can be used as provider.
055: *
056: * @author elu
057: *
058: */
059:
060: public class TransformerProviderProcessor extends CbProviderProcessor {
061:
062: private static final Log log = LogFactory
063: .getLog(TransformerProviderProcessor.class);
064:
065: private TransformerEndpoint endpoint;
066:
067: public TransformerProviderProcessor(TransformerEndpoint ep) {
068: super (ep);
069: this .endpoint = ep;
070: }
071:
072: private Vector<TransformerMessage> transform(
073: TransformerMessage srcTransformerMsg,
074: MessageExchange exchange, HashMap metadataMap)
075: throws CbesbException {
076: TransformerRuntime runtime = null;
077:
078: if (exchange
079: .getProperty(MetadataConstants.TRANSFORMER_CONFIG_TRNFILE) != null
080: && !"".equals(exchange.getProperty(
081: MetadataConstants.TRANSFORMER_CONFIG_TRNFILE)
082: .toString())) {
083: String trnName = exchange.getProperty(
084: MetadataConstants.TRANSFORMER_CONFIG_TRNFILE)
085: .toString();
086: String className = EsbPathHelper.getTrnClassName(trnName);
087: String saName = EsbPathHelper.getProjectName(trnName);
088: runtime = endpoint.getRuntime(saName, className);
089: } else {
090: runtime = endpoint.getRuntime();
091: }
092:
093: Vector<TransformerMessage> result = runtime.translate(
094: srcTransformerMsg, metadataMap);
095: runtime.release();
096:
097: return result;
098: }
099:
100: public void processInMessage(QName service, QName operation,
101: NormalizedMessage in, MessageExchange exchange)
102: throws JBIException {
103:
104: String exchangeType;
105: if (exchange instanceof InOnly) {
106: exchangeType = "InOnly";
107: } else {
108: exchangeType = "RobustInOnly";
109: }
110: throw new JBIException(
111: "Transformer Component only supports In-Out message exchanges. Received "
112: + exchangeType + " message exchange.");
113: }
114:
115: @Override
116: public boolean processInOutMessage(QName service, QName operation,
117: NormalizedMessage in, NormalizedMessage out,
118: boolean optionalOut, MessageExchange exchange)
119: throws CbesbException, JBIException {
120:
121: log.debug("Input message : " + in.toString());
122:
123: NormalizedMessageHandler nmhIn = new NormalizedMessageHandler(
124: in);
125:
126: //Create an instance of DataMessageUtil to wrap the NormalizedMessage
127: NormalizedMessageHandler nmhOut = new NormalizedMessageHandler(
128: out, getProviderSvcDescHandlerInstance());
129:
130: HashMap<String, Object> srcMetadataMap = getMessageMetadataMap(in);
131: HashMap<String, DataHandler> srcAttachmentMap = getMessageAttachments(in);
132:
133: for (int i = 0; i < nmhIn.getRecordCount(); i++) {
134: Source src = nmhIn.getRecordAtIndex(i);
135: TransformerMessage transformerMessageIn = new TransformerMessage();
136: transformerMessageIn.setSource(src);
137: transformerMessageIn.setMetadataMap(srcMetadataMap);
138: transformerMessageIn.setAttachmentMap(srcAttachmentMap);
139:
140: Vector<TransformerMessage> result = new Vector<TransformerMessage>();
141: HashMap<String, String> metadataMap = new HashMap<String, String>();
142:
143: setMetadataMap(metadataMap, exchange);
144: result = transform(transformerMessageIn, exchange,
145: metadataMap);
146: setExchangeMetadata(exchange, metadataMap);
147:
148: for (int j = 0; j < result.size(); j++) {
149: TransformerMessage transformerMessageOut = result
150: .get(j);
151: nmhOut.addRecord(transformerMessageOut.getSource());
152: setMessageMetadata(out, transformerMessageOut
153: .getMetadataMap());
154: setMessageAttachments(out, transformerMessageOut
155: .getAttachmentMap());
156: }
157: }
158:
159: out = nmhOut.generateMessageContent();
160: return true;
161: }
162:
163: private void setMetadataMap(HashMap<String, String> metadataMap,
164: MessageExchange exchange) {
165: Set names = exchange.getPropertyNames();
166: for (Iterator it = names.iterator(); it.hasNext();) {
167: String metadataName = (String) it.next();
168: metadataMap.put(metadataName, exchange.getProperty(
169: metadataName).toString());
170: }
171: }
172:
173: private void setExchangeMetadata(MessageExchange exchange,
174: HashMap<String, String> metadataMap) {
175: for (Iterator it = metadataMap.keySet().iterator(); it
176: .hasNext();) {
177: String metadataName = (String) it.next();
178: exchange.setProperty(metadataName, metadataMap
179: .get(metadataName));
180: }
181: }
182:
183: private HashMap<String, Object> getMessageMetadataMap(
184: NormalizedMessage message) {
185: HashMap<String, Object> map = new HashMap<String, Object>();
186: Set names = message.getPropertyNames();
187: for (Iterator it = names.iterator(); it.hasNext();) {
188: String metadataName = (String) it.next();
189: map.put(metadataName, message.getProperty(metadataName));
190: }
191: return map;
192: }
193:
194: private void setMessageMetadata(NormalizedMessage message,
195: HashMap<String, Object> metadataMap) {
196: for (Iterator it = metadataMap.keySet().iterator(); it
197: .hasNext();) {
198: String metadataName = (String) it.next();
199: message.setProperty(metadataName, metadataMap
200: .get(metadataName));
201: }
202: }
203:
204: private HashMap<String, DataHandler> getMessageAttachments(
205: NormalizedMessage message) {
206: HashMap<String, DataHandler> map = new HashMap<String, DataHandler>();
207: Set names = message.getAttachmentNames();
208: for (Iterator it = names.iterator(); it.hasNext();) {
209: String cid = (String) it.next();
210: map.put(cid, message.getAttachment(cid));
211: }
212: return map;
213: }
214:
215: private void setMessageAttachments(NormalizedMessage message,
216: HashMap<String, DataHandler> attachmentMap)
217: throws MessagingException {
218: for (Iterator it = attachmentMap.keySet().iterator(); it
219: .hasNext();) {
220: String cid = (String) it.next();
221: message.addAttachment(cid, attachmentMap.get(cid));
222: }
223: }
224: }
|