blob: 4ec8daaac29d207b916a1d6b28a1c462ae1da1cc [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.eis.adapters.jms;
// JDK imports
import jakarta.jms.*;
import jakarta.resource.*;
import jakarta.resource.cci.*;
// TopLink imports
import org.eclipse.persistence.eis.*;
import org.eclipse.persistence.eis.interactions.*;
import org.eclipse.persistence.internal.eis.adapters.jms.*;
import org.eclipse.persistence.internal.sessions.AbstractRecord;
// Misc. imports
import org.w3c.dom.*;
/**
* Platform for Oracle JMS JCA adapter.
*
* @author Dave McCann
* @since OracleAS TopLink 10<i>g</i> (10.0.3)
*/
public class JMSPlatform extends EISPlatform {
// interaction spec properties
public static final String MODE = "mode";// indicates send or receive interaction
public static final String SEND = "send";// used with MODE - send interaction
public static final String RECEIVE = "receive";// used with MODE - receive interaction
public static final String SEND_RECEIVE = "sendAndReceive";// used with MODE - send/receive in one interaction
public static final String SELECTOR = "selector";// message selector - JMSCorrelationID
public static final String TIMEOUT = "timeout";// timeout for receive interaction
public static final String DESTINATION = "destination";// queue 'name' param of the JNDI entry in jms.xml
public static final String DESTINATION_URL = "destinationURL";// JNDI lookup name of queue
public static final String REPLY_TO_DESTINATION = "replyToDestination";// replyTo queue 'name' param of the JNDI entry
public static final String REPLY_TO_DESTINATION_URL = "replyToDestinationURL";// JNDI lookup name of queue where response is to be placed (by entity processing the request)
/**
* Default constructor.
*/
public JMSPlatform() {
super();
setShouldConvertDataToStrings(true);
setIsMappedRecordSupported(false);
setIsIndexedRecordSupported(true);
setIsDOMRecordSupported(true);
setSupportsLocalTransactions(true);
setRequiresAutoCommit(true);
}
/**
* Allow the platform to build the interaction spec based on properties defined in the interaction.
*/
@Override
public InteractionSpec buildInteractionSpec(EISInteraction interaction) {
String property;
InteractionSpec spec = interaction.getInteractionSpec();
if (spec == null) {
CciJMSInteractionSpec jmsSpec;
if (interaction.getProperty(MODE) == null) {
throw EISException.propertyNotSet(MODE);
}
// determine interaction type: send, receive, or send/receive
if (interaction.getProperty(MODE).equals(SEND)) {
jmsSpec = new CciJMSSendInteractionSpec();
} else if (interaction.getProperty(MODE).equals(RECEIVE)) {
jmsSpec = new CciJMSReceiveInteractionSpec();
} else if (interaction.getProperty(MODE).equals(SEND_RECEIVE)) {
jmsSpec = new CciJMSSendReceiveInteractionSpec();
} else {
throw EISException.invalidProperty(MODE);
}
// set the message selector - if one exists
property = (String)interaction.getProperty(SELECTOR);
if (property != null) {
jmsSpec.setMessageSelector(property);
}
// set properties on the interaction as defined by the user
if (jmsSpec instanceof CciJMSSendInteractionSpec) {
// send interaction
// set the send destination URL - if one exists
property = (String)interaction.getProperty(DESTINATION_URL);
if (property != null) {
jmsSpec.setDestinationURL(property);
} else {
// if no JNDI lookup, set the send destination - if one exists
property = (String)interaction.getProperty(DESTINATION);
if (property != null) {
jmsSpec.setDestination(property);
} else {
// need to have either the destination or JNDI lookup defined
throw EISException.propertiesNotSet(DESTINATION_URL, DESTINATION);
}
}
// set the reply to destination URL - if one exists
property = (String)interaction.getProperty(REPLY_TO_DESTINATION_URL);
if (property != null) {
((CciJMSSendInteractionSpec)jmsSpec).setReplyToDestinationURL(property);
} else {
// if no JNDI lookup, set the send destination - if one exists
property = (String)interaction.getProperty(REPLY_TO_DESTINATION);
if (property != null) {
((CciJMSSendInteractionSpec)jmsSpec).setReplyToDestination(property);
} else {
// need to have either the destination or JNDI lookup defined
throw EISException.propertiesNotSet(REPLY_TO_DESTINATION_URL, REPLY_TO_DESTINATION);
}
}
} else if (jmsSpec instanceof CciJMSReceiveInteractionSpec) {
// receive interaction
// set the receive destination URL - if one exists
property = (String)interaction.getProperty(DESTINATION_URL);
if (property != null) {
jmsSpec.setDestinationURL(property);
} else {
// if no JNDI lookup, set the receive destination - if one exists
property = (String)interaction.getProperty(DESTINATION);
if (property != null) {
jmsSpec.setDestination(property);
} else {
// need to have either the destination or JNDI lookup defined
throw EISException.propertiesNotSet(DESTINATION_URL, DESTINATION);
}
}
// set the timeout value - if one exists
property = (String)interaction.getProperty(TIMEOUT);
if (property != null) {
((CciJMSReceiveInteractionSpec)jmsSpec).setTimeout(property);
}
} else {
// send/receive interaction
// set the send destination URL - if one exists
property = (String)interaction.getProperty(DESTINATION_URL);
if (property != null) {
jmsSpec.setDestinationURL(property);
} else {
// if no JNDI lookup, set the send destination - if one exists
property = (String)interaction.getProperty(DESTINATION);
if (property != null) {
jmsSpec.setDestination(property);
} else {
// need to have either the destination or JNDI lookup defined
throw EISException.propertiesNotSet(DESTINATION_URL, DESTINATION);
}
}
// set the replyTo destination URL - if one exists
property = (String)interaction.getProperty(REPLY_TO_DESTINATION_URL);
if (property != null) {
((CciJMSSendReceiveInteractionSpec)jmsSpec).setReplyToDestinationURL(property);
} else {
// if no JNDI lookup, set the receive destination - if one exists
property = (String)interaction.getProperty(REPLY_TO_DESTINATION);
if (property != null) {
((CciJMSSendReceiveInteractionSpec)jmsSpec).setReplyToDestination(property);
} else {
// need to have either the destination or JNDI lookup defined
// 17009
throw EISException.propertiesNotSet(REPLY_TO_DESTINATION_URL, REPLY_TO_DESTINATION);
}
}
// set the timeout value - if one exists
property = (String)interaction.getProperty(TIMEOUT);
if (property != null) {
((CciJMSSendReceiveInteractionSpec)jmsSpec).setTimeout(property);
}
}
spec = jmsSpec;
}
return spec;
}
/**
* Allow the platform to handle the creation of the DOM record.
* Creates an indexed record (mapped records are not supported).
*/
@Override
public jakarta.resource.cci.Record createDOMRecord(String recordName, EISAccessor accessor) {
try {
return accessor.getRecordFactory().createIndexedRecord(recordName);
} catch (ResourceException exception) {
throw EISException.createException(exception);
}
}
/**
* Stores the XML DOM value into the record.
* Convert the DOM to text and add to the indexed record.
*/
@Override
public void setDOMInRecord(Element dom, jakarta.resource.cci.Record record, EISInteraction call, EISAccessor accessor) {
IndexedRecord indexedRecord = (IndexedRecord)record;
indexedRecord.add(new org.eclipse.persistence.oxm.record.DOMRecord(dom).transformToXML());
}
/**
* Allow the platform to handle the creation of the Record for the DOM record.
* Translate the indexed record text into a DOM record.
*/
@Override
public AbstractRecord createDatabaseRowFromDOMRecord(jakarta.resource.cci.Record record, EISInteraction call, EISAccessor accessor) {
IndexedRecord indexedRecord = (IndexedRecord)record;
if (indexedRecord.size() == 0) {
return null;
}
EISDOMRecord domRecord = new EISDOMRecord();
// the record is assumed to contain either:
// - a TextMessage object if a converter was not defined
// - a string of XML if a converter was defined
Object recordData = indexedRecord.get(0);
if (recordData instanceof TextMessage) {
try {
domRecord.transformFromXML(((TextMessage)recordData).getText());
} catch (Exception ex) {
return null;
}
} else if (recordData instanceof String) {
domRecord.transformFromXML((String)recordData);
} else {
throw EISException.unsupportedMessageInOutputRecord();
}
return domRecord;
}
}