/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.cxf.transport.jms;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.Topic;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.transport.jms.spec.JMSSpecConstants;
public class JMSMessageHeadersType {
private Map<String, Object> properties;
private String jmsCorrelationID;
private Integer jmsDeliveryMode;
private Long jmsExpiration;
private String jmsMessageID;
private Integer jmsPriority;
private Boolean jmsRedelivered;
private String jmsReplyTo;
private Long jmsTimeStamp;
private String jmsType;
private Long timeToLive;
private String soapjmsTargetService;
private String soapjmsBindingVersion;
private String soapjmsContentType;
private String soapjmsContentEncoding;
private String soapjmssoapAction;
private Boolean soapjmsIsFault;
private String soapjmsRequestURI;
public JMSMessageHeadersType() {
this.properties = new HashMap<>();
}
@Deprecated
public List<JMSPropertyType> getProperty() {
List<JMSPropertyType> props = new ArrayList<>();
for (String key : properties.keySet()) {
JMSPropertyType prop = new JMSPropertyType();
prop.setName(key);
prop.setValue(properties.get(key));
props.add(prop);
}
return Collections.unmodifiableList(props);
}
public void putProperty(String key, Object value) {
properties.put(key, value);
}
public Object getProperty(String key) {
return properties.get(key);
}
public Set<String> getPropertyKeys() {
return properties.keySet();
}
public String getJMSCorrelationID() {
return jmsCorrelationID;
}
public void setJMSCorrelationID(String value) {
this.jmsCorrelationID = value;
}
public boolean isSetJMSCorrelationID() {
return this.jmsCorrelationID != null;
}
public String getJMSMessageID() {
return jmsMessageID;
}
public void setJMSMessageID(String value) {
this.jmsMessageID = value;
}
public boolean isSetJMSMessageID() {
return this.jmsMessageID != null;
}
public String getJMSReplyTo() {
return jmsReplyTo;
}
public void setJMSReplyTo(String value) {
this.jmsReplyTo = value;
}
public boolean isSetJMSReplyTo() {
return this.jmsReplyTo != null;
}
public String getJMSType() {
return jmsType;
}
public void setJMSType(String value) {
this.jmsType = value;
}
public boolean isSetJMSType() {
return this.jmsType != null;
}
public String getSOAPJMSTargetService() {
return soapjmsTargetService;
}
public void setSOAPJMSTargetService(String value) {
this.soapjmsTargetService = value;
}
public boolean isSetSOAPJMSTargetService() {
return this.soapjmsTargetService != null;
}
public String getSOAPJMSBindingVersion() {
return soapjmsBindingVersion;
}
public void setSOAPJMSBindingVersion(String value) {
this.soapjmsBindingVersion = value;
}
public boolean isSetSOAPJMSBindingVersion() {
return this.soapjmsBindingVersion != null;
}
public String getSOAPJMSContentType() {
return soapjmsContentType;
}
public void setSOAPJMSContentType(String value) {
this.soapjmsContentType = value;
}
public boolean isSetSOAPJMSContentType() {
return this.soapjmsContentType != null;
}
public String getSOAPJMSContentEncoding() {
return soapjmsContentEncoding;
}
public void setSOAPJMSContentEncoding(String value) {
this.soapjmsContentEncoding = value;
}
public boolean isSetSOAPJMSContentEncoding() {
return this.soapjmsContentEncoding != null;
}
public String getSOAPJMSSOAPAction() {
return soapjmssoapAction;
}
public void setSOAPJMSSOAPAction(String value) {
this.soapjmssoapAction = value;
}
public boolean isSetSOAPJMSSOAPAction() {
return this.soapjmssoapAction != null;
}
public String getSOAPJMSRequestURI() {
return soapjmsRequestURI;
}
public void setSOAPJMSRequestURI(String value) {
this.soapjmsRequestURI = value;
}
public boolean isSetSOAPJMSRequestURI() {
return this.soapjmsRequestURI != null;
}
public void setJMSDeliveryMode(int value) {
jmsDeliveryMode = value;
}
public void unsetJMSDeliveryMode() {
jmsDeliveryMode = null;
}
public boolean isSetJMSDeliveryMode() {
return this.jmsDeliveryMode != null;
}
public int getJMSDeliveryMode() {
return jmsDeliveryMode;
}
public void setJMSExpiration(long value) {
jmsExpiration = value;
}
public void unsetJMSExpiration() {
jmsExpiration = null;
}
public boolean isSetJMSExpiration() {
return this.jmsExpiration != null;
}
public long getJMSExpiration() {
return jmsExpiration;
}
public void setJMSPriority(int value) {
jmsPriority = value;
}
public void unsetJMSPriority() {
jmsPriority = null;
}
public boolean isSetJMSPriority() {
return this.jmsPriority != null;
}
public int getJMSPriority() {
return jmsPriority;
}
public void setJMSRedelivered(boolean value) {
jmsRedelivered = value;
}
public void unsetJMSRedelivered() {
jmsRedelivered = null;
}
public boolean isSetJMSRedelivered() {
return this.jmsRedelivered != null;
}
public boolean isJMSRedelivered() {
return jmsRedelivered;
}
public void setJMSTimeStamp(long value) {
jmsTimeStamp = value;
}
public void unsetJMSTimeStamp() {
jmsTimeStamp = null;
}
public boolean isSetJMSTimeStamp() {
return this.jmsTimeStamp != null;
}
public long getJMSTimeStamp() {
return jmsTimeStamp;
}
public void setTimeToLive(long value) {
timeToLive = value;
}
public void unsetTimeToLive() {
timeToLive = null;
}
public boolean isSetTimeToLive() {
return this.timeToLive != null;
}
public long getTimeToLive() {
return timeToLive;
}
public void setSOAPJMSIsFault(boolean value) {
soapjmsIsFault = value;
}
public void unsetSOAPJMSIsFault() {
soapjmsIsFault = null;
}
public boolean isSetSOAPJMSIsFault() {
return this.soapjmsIsFault != null;
}
public boolean isSOAPJMSIsFault() {
return soapjmsIsFault;
}
public String getContentType() {
String contentType = getSOAPJMSContentType();
if (contentType == null) {
contentType = (String)getProperty(JMSSpecConstants.CONTENTTYPE_FIELD);
}
if (contentType == null) {
contentType = (String)getProperty(JMSConstants.RS_CONTENT_TYPE);
}
if (contentType == null) {
contentType = (String)getProperty(org.apache.cxf.message.Message.CONTENT_TYPE);
}
return contentType;
}
public static JMSMessageHeadersType from(Message message) throws JMSException {
JMSMessageHeadersType messageHeaders = new JMSMessageHeadersType();
messageHeaders.read(message);
return messageHeaders;
}
private void read(Message message) throws JMSException {
setJMSCorrelationID(message.getJMSCorrelationID());
setJMSDeliveryMode(Integer.valueOf(message.getJMSDeliveryMode()));
setJMSExpiration(Long.valueOf(message.getJMSExpiration()));
setJMSMessageID(message.getJMSMessageID());
setJMSPriority(Integer.valueOf(message.getJMSPriority()));
setJMSRedelivered(Boolean.valueOf(message.getJMSRedelivered()));
setJMSTimeStamp(Long.valueOf(message.getJMSTimestamp()));
setJMSType(message.getJMSType());
setSOAPJMSTargetService(message.getStringProperty(JMSSpecConstants.TARGETSERVICE_FIELD));
setSOAPJMSBindingVersion(message.getStringProperty(JMSSpecConstants.BINDINGVERSION_FIELD));
setSOAPJMSContentType(message.getStringProperty(JMSSpecConstants.CONTENTTYPE_FIELD));
setSOAPJMSContentEncoding(message.getStringProperty(JMSSpecConstants.CONTENTENCODING_FIELD));
setSOAPJMSSOAPAction(message.getStringProperty(JMSSpecConstants.SOAPACTION_FIELD));
if (message.propertyExists(JMSSpecConstants.ISFAULT_FIELD)) {
setSOAPJMSIsFault(message.getBooleanProperty(JMSSpecConstants.ISFAULT_FIELD));
}
setSOAPJMSRequestURI(message.getStringProperty(JMSSpecConstants.REQUESTURI_FIELD));
setJMSReplyTo(getDestName(message));
readProperties(message);
}
private String getDestName(Message message) throws JMSException {
Destination replyTo = message.getJMSReplyTo();
if (replyTo instanceof Queue) {
return ((Queue)replyTo).getQueueName();
} else if (replyTo instanceof Topic) {
return ((Topic)replyTo).getTopicName();
}
return null;
}
private void readProperties(Message message) throws JMSException {
Enumeration<String> enm = CastUtils.cast(message.getPropertyNames());
while (enm.hasMoreElements()) {
String name = enm.nextElement();
String val = message.getStringProperty(name);
String unescapedName = name.replace("__", ".");
putProperty(unescapedName, val);
}
}
public void writeProp(Message jmsMessage, String origName, Object value) throws JMSException {
String name = origName.replace(".", "__");
if (value == null) {
jmsMessage.setStringProperty(name, null);
return;
}
Class<?> cls = value.getClass();
if (cls == String.class) {
jmsMessage.setStringProperty(name, (String)value);
} else if (cls == Integer.TYPE || cls == Integer.class) {
jmsMessage.setIntProperty(name, (Integer)value);
} else if (cls == Double.TYPE || cls == Double.class) {
jmsMessage.setDoubleProperty(name, (Double)value);
} else if (cls == Float.TYPE || cls == Float.class) {
jmsMessage.setFloatProperty(name, (Float)value);
} else if (cls == Long.TYPE || cls == Long.class) {
jmsMessage.setLongProperty(name, (Long)value);
} else if (cls == Boolean.TYPE || cls == Boolean.class) {
jmsMessage.setBooleanProperty(name, (Boolean)value);
} else if (cls == Short.TYPE || cls == Short.class) {
jmsMessage.setShortProperty(name, (Short)value);
} else if (cls == Byte.TYPE || cls == Byte.class) {
jmsMessage.setShortProperty(name, (Byte)value);
} else {
jmsMessage.setObjectProperty(name, value);
}
}
/**
* @param jmsMessage
* @param messageProperties
*/
public void writeTo(Message jmsMessage)
throws JMSException {
setProp(jmsMessage, JMSSpecConstants.TARGETSERVICE_FIELD, soapjmsTargetService);
setProp(jmsMessage, JMSSpecConstants.BINDINGVERSION_FIELD, soapjmsBindingVersion);
setProp(jmsMessage, JMSSpecConstants.CONTENTTYPE_FIELD, soapjmsContentType);
setProp(jmsMessage, JMSSpecConstants.CONTENTENCODING_FIELD, soapjmsContentEncoding);
setProp(jmsMessage, JMSSpecConstants.SOAPACTION_FIELD, soapjmssoapAction);
setProp(jmsMessage, JMSSpecConstants.REQUESTURI_FIELD, soapjmsRequestURI);
if (isSetSOAPJMSIsFault()) {
jmsMessage.setBooleanProperty(JMSSpecConstants.ISFAULT_FIELD, isSOAPJMSIsFault());
}
for (String key : properties.keySet()) {
writeProp(jmsMessage, key, properties.get(key));
}
}
private void setProp(Message jmsMessage, String name, String value) throws JMSException {
if (value != null) {
jmsMessage.setStringProperty(name, value);
}
}
}