00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 package org.objectweb.joram.client.jms;
00024
00025 import java.util.Enumeration;
00026 import java.util.Hashtable;
00027
00028 import javax.jms.IllegalStateException;
00029 import javax.jms.JMSException;
00030 import javax.jms.MessageFormatException;
00031 import javax.jms.MessageNotWriteableException;
00032
00033 import org.objectweb.joram.client.jms.admin.AdminMessage;
00034 import org.objectweb.joram.shared.JoramTracing;
00035 import org.objectweb.joram.shared.excepts.MessageValueException;
00036 import org.objectweb.joram.shared.messages.ConversionHelper;
00037 import org.objectweb.util.monolog.api.BasicLevel;
00038
00045 public class Message implements javax.jms.Message {
00046 protected org.objectweb.joram.shared.messages.Message momMsg;
00047
00051 protected Message() {
00052 momMsg = new org.objectweb.joram.shared.messages.Message();
00053 }
00054
00055 public static Message wrapMomMessage(Session session,
00056 org.objectweb.joram.shared.messages.Message momMsg) throws JMSException {
00057 switch (momMsg.type) {
00058 case org.objectweb.joram.shared.messages.Message.SIMPLE:
00059 return new Message(session, momMsg);
00060 case org.objectweb.joram.shared.messages.Message.TEXT:
00061 return new TextMessage(session, momMsg);
00062 case org.objectweb.joram.shared.messages.Message.OBJECT:
00063 return new ObjectMessage(session, momMsg);
00064 case org.objectweb.joram.shared.messages.Message.MAP:
00065 return new MapMessage(session, momMsg);
00066 case org.objectweb.joram.shared.messages.Message.STREAM:
00067 return new StreamMessage(session, momMsg);
00068 case org.objectweb.joram.shared.messages.Message.BYTES:
00069 return new BytesMessage(session, momMsg);
00070 case org.objectweb.joram.shared.messages.Message.ADMIN:
00071 return new AdminMessage(session, momMsg);
00072 default:
00073 throw new JMSException("Unknow message type: " + momMsg.type);
00074 }
00075 }
00076
00081 protected transient Session session = null;
00082
00087 protected transient javax.jms.Destination jmsDest = null;
00088
00096 protected Message(Session session,
00097 org.objectweb.joram.shared.messages.Message momMsg) {
00098 this.session = session;
00099 this.momMsg = momMsg;
00100 setReadOnly();
00101 }
00102
00110 public void acknowledge() throws JMSException {
00111 if ((session == null) ||
00112 session.getTransacted() ||
00113 (session.getAcknowledgeMode() != javax.jms.Session.CLIENT_ACKNOWLEDGE))
00114 return;
00115 session.acknowledge();
00116 }
00117
00119 protected boolean RObody = false;
00120
00126 public void clearBody() throws JMSException {
00127 momMsg.body = null;
00128 RObody = false;
00129 }
00130
00132 public void setReadOnly() {
00133 propertiesRO = true;
00134 RObody = true;
00135 }
00136
00143 public final String getJMSMessageID() throws JMSException {
00144 return momMsg.id;
00145 }
00146
00152 public final void setJMSMessageID(String id) throws JMSException {
00153 momMsg.id = id;
00154 }
00155
00162 public final int getJMSPriority() throws JMSException {
00163 return momMsg.priority;
00164 }
00165
00171 public final void setJMSPriority(int priority) throws JMSException {
00172 if (priority >= 0 && priority <= 9)
00173 momMsg.priority = priority;
00174 else
00175 throw new JMSException("Priority of "+ priority +" is not valid"
00176 + " (should be an integer between 0 and 9).");
00177 }
00178
00187 public final javax.jms.Destination getJMSDestination() throws JMSException {
00188 if (jmsDest != null) return jmsDest;
00189
00190 if (momMsg.toId != null) {
00191 try {
00192 return Destination.newInstance(momMsg.toId, null, momMsg.toType);
00193 } catch (Exception exc) {
00194
00195 throw new JMSException(exc.getMessage());
00196 }
00197 }
00198 return null;
00199 }
00200
00209 public final void setJMSDestination(javax.jms.Destination dest) throws JMSException {
00210 jmsDest = dest;
00211 if (dest == null) {
00212 momMsg.setDestination(null, null);
00213 } else if (dest instanceof org.objectweb.joram.client.jms.Destination) {
00214 Destination d = (org.objectweb.joram.client.jms.Destination) dest;
00215 momMsg.toId = d.getName();
00216 momMsg.toType = d.getType();
00217 }
00218 }
00219
00226 public final long getJMSExpiration() throws JMSException {
00227 return momMsg.expiration;
00228 }
00229
00235 public final void setJMSExpiration(long expiration) throws JMSException {
00236 if (expiration >= 0)
00237 momMsg.expiration = expiration;
00238 }
00239
00246 public final boolean getJMSRedelivered() throws JMSException {
00247 return momMsg.redelivered;
00248 }
00249
00255 public final void setJMSRedelivered(boolean redelivered) throws JMSException {
00256 momMsg.redelivered = redelivered;
00257 }
00258
00266 public final javax.jms.Destination getJMSReplyTo() throws JMSException {
00267 if (momMsg.replyToId != null) {
00268
00269 try {
00270 return Destination.newInstance(momMsg.replyToId, null, momMsg.replyToType);
00271 } catch (Exception exc) {
00272 throw new JMSException(exc.getMessage());
00273 }
00274 }
00275 return null;
00276 }
00277
00283 public final void setJMSReplyTo(javax.jms.Destination replyTo) throws JMSException {
00284 try {
00285 Destination d = (org.objectweb.joram.client.jms.Destination) replyTo;
00286 momMsg.replyToId = d.getName();
00287 momMsg.replyToType = d.getType();
00288 } catch (NullPointerException npe) {
00289 momMsg.replyToId = null;
00290 momMsg.replyToType = null;
00291 } catch (ClassCastException cce) {
00292 throw new JMSException("Destination is not Joram compatible.");
00293 }
00294 }
00295
00302 public final long getJMSTimestamp() throws JMSException {
00303 return momMsg.timestamp;
00304 }
00305
00311 public final void setJMSTimestamp(long timestamp) throws JMSException {
00312 momMsg.timestamp = timestamp;
00313 }
00314
00321 public final String getJMSCorrelationID() throws JMSException {
00322 return momMsg.correlationId;
00323 }
00324
00330 public final void setJMSCorrelationID(String correlationID) throws JMSException {
00331 momMsg.correlationId = correlationID;
00332 }
00333
00340 public final byte[] getJMSCorrelationIDAsBytes() throws JMSException {
00341 try {
00342 return ConversionHelper.toBytes(momMsg.correlationId);
00343 } catch (MessageValueException mE) {
00344 throw new MessageFormatException(mE.getMessage());
00345 }
00346 }
00347
00353 public final void setJMSCorrelationIDAsBytes(byte[] correlationID) {
00354 momMsg.correlationId = ConversionHelper.toString(correlationID);
00355 }
00356
00363 public final int getJMSDeliveryMode() throws JMSException {
00364 if (momMsg.persistent)
00365 return javax.jms.DeliveryMode.PERSISTENT;
00366 else
00367 return javax.jms.DeliveryMode.NON_PERSISTENT;
00368 }
00369
00375 public final void setJMSDeliveryMode(int deliveryMode) throws JMSException {
00376 if (deliveryMode != javax.jms.DeliveryMode.PERSISTENT &&
00377 deliveryMode != javax.jms.DeliveryMode.NON_PERSISTENT)
00378 throw new JMSException("Invalid delivery mode.");
00379
00380 momMsg.persistent = (deliveryMode == javax.jms.DeliveryMode.PERSISTENT);
00381 }
00382
00388 public final String getJMSType() throws JMSException {
00389 return ConversionHelper.toString(momMsg.getOptionalHeader("JMSType"));
00390 }
00391
00397 public final void setJMSType(String type) throws JMSException {
00398 momMsg.setOptionalHeader("JMSType", type);
00399 }
00400
00406 public void getOptionalHeader(Hashtable h) {
00407 if (momMsg.optionalHeader == null) return;
00408 momMsg.optionalHeader.copyInto(h);
00409 }
00410
00411
00412
00413
00414
00416 public boolean propertiesRO = false;
00417
00423 public final void clearProperties() throws JMSException {
00424 propertiesRO = false;
00425 if (momMsg.properties == null) return;
00426
00427 momMsg.properties.clear();
00428 momMsg.properties = null;
00429 }
00430
00437 public final void resetPropertiesRO() throws JMSException {
00438 propertiesRO = false;
00439 }
00440
00448 public final boolean propertyExists(String name) throws JMSException {
00449 if (momMsg.properties == null)
00450 return false;
00451
00452 return momMsg.properties.containsKey(name);
00453 }
00454
00460 public void getProperties(Hashtable h) {
00461 if (momMsg.properties == null) return;
00462 momMsg.properties.copyInto(h);
00463 }
00464
00470 public final Enumeration getPropertyNames() throws JMSException {
00471 if (momMsg.properties == null)
00472 return (new Hashtable()).keys();
00473
00474 return momMsg.properties.keys();
00475 }
00476
00486 public final void setBooleanProperty(String name, boolean value) throws JMSException {
00487 doSetProperty(name, new Boolean(value));
00488 }
00489
00499 public final void setByteProperty(String name, byte value) throws JMSException {
00500 doSetProperty(name, new Byte(value));
00501 }
00502
00512 public final void setShortProperty(String name, short value) throws JMSException {
00513 doSetProperty(name, new Short(value));
00514 }
00515
00525 public final void setIntProperty(String name, int value) throws JMSException {
00526 doSetProperty(name, new Integer(value));
00527 }
00528
00538 public final void setLongProperty(String name, long value) throws JMSException {
00539 doSetProperty(name, new Long(value));
00540 }
00541
00551 public final void setFloatProperty(String name, float value) throws JMSException {
00552 doSetProperty(name, new Float(value));
00553 }
00554
00564 public final void setDoubleProperty(String name, double value) throws JMSException {
00565 doSetProperty(name, new Double(value));
00566 }
00567
00577 public final void setStringProperty(String name, String value) throws JMSException {
00578 doSetProperty(name, value);
00579 }
00580
00599 public final void setObjectProperty(String name, Object value) throws JMSException {
00600 if (value instanceof Boolean ||
00601 value instanceof Number ||
00602 value instanceof String) {
00603 doSetProperty(name, value);
00604 } else {
00605 throw new MessageFormatException("Can't set non primitive Java object as a property value.");
00606 }
00607 }
00608
00620 private final void doSetProperty(String name, Object value) throws JMSException {
00621 if (name == null || name.equals(""))
00622 throw new IllegalArgumentException("Invalid property name: " + name);
00623
00624 if (name.startsWith("JMSX")) {
00625 if (name.equals("JMSXGroupID")) {
00626 momMsg.setOptionalHeader(name, ConversionHelper.toString(value));
00627 } else if (name.equals("JMSXGroupSeq")) {
00628 try {
00629 momMsg.setOptionalHeader(name,
00630 new Integer(ConversionHelper.toInt(value)));
00631 } catch (MessageValueException mE) {
00632 throw new MessageFormatException(mE.getMessage());
00633 }
00634 } else {
00635 throw new JMSException("Property names with prefix 'JMSX' are reserved.");
00636 }
00637 } else if (name.startsWith("JMS")) {
00638 throw new JMSException("Property names with prefix 'JMS' are reserved.");
00639 } else if (name.equalsIgnoreCase("NULL") ||
00640 name.equalsIgnoreCase("TRUE") ||
00641 name.equalsIgnoreCase("FALSE") ||
00642 name.equalsIgnoreCase("NOT") ||
00643 name.equalsIgnoreCase("AND") ||
00644 name.equalsIgnoreCase("OR") ||
00645 name.equalsIgnoreCase("BETWEEN") ||
00646 name.equalsIgnoreCase("LIKE") ||
00647 name.equalsIgnoreCase("IN") ||
00648 name.equalsIgnoreCase("IS") ||
00649 name.equalsIgnoreCase("ESCAPE")) {
00650 throw new JMSException("Invalid property name cannot use SQL terminal: " + name);
00651 } else {
00652 if (propertiesRO)
00653 throw new MessageNotWriteableException("Can't set property as the message properties are READ-ONLY.");
00654
00655 momMsg.setProperty(name, value);
00656 }
00657 }
00658
00667 public final boolean getBooleanProperty(String name) throws JMSException {
00668 try {
00669 return ConversionHelper.toBoolean(doGetProperty(name));
00670 } catch (MessageValueException mE) {
00671 throw new MessageFormatException(mE.getMessage());
00672 }
00673 }
00674
00683 public final byte getByteProperty(String name) throws JMSException {
00684 try {
00685 return ConversionHelper.toByte(doGetProperty(name));
00686 } catch (MessageValueException mE) {
00687 throw new MessageFormatException(mE.getMessage());
00688 }
00689 }
00690
00699 public final short getShortProperty(String name) throws JMSException {
00700 try {
00701 return ConversionHelper.toShort(doGetProperty(name));
00702 } catch (MessageValueException mE) {
00703 throw new MessageFormatException(mE.getMessage());
00704 }
00705 }
00706
00715 public final int getIntProperty(String name) throws JMSException {
00716 try {
00717 return ConversionHelper.toInt(doGetProperty(name));
00718 } catch (MessageValueException mE) {
00719 throw new MessageFormatException(mE.getMessage());
00720 }
00721 }
00722
00731 public final long getLongProperty(String name) throws JMSException {
00732 try {
00733 return ConversionHelper.toLong(doGetProperty(name));
00734 } catch (MessageValueException mE) {
00735 throw new MessageFormatException(mE.getMessage());
00736 }
00737 }
00738
00747 public final float getFloatProperty(String name) throws JMSException {
00748 try {
00749 return ConversionHelper.toFloat(doGetProperty(name));
00750 } catch (MessageValueException mE) {
00751 throw new MessageFormatException(mE.getMessage());
00752 }
00753 }
00754
00763 public final double getDoubleProperty(String name) throws JMSException {
00764 try {
00765 return ConversionHelper.toDouble(doGetProperty(name));
00766 } catch (MessageValueException mE) {
00767 throw new MessageFormatException(mE.getMessage());
00768 }
00769 }
00770
00779 public final String getStringProperty(String name) throws JMSException {
00780 return ConversionHelper.toString(doGetProperty(name));
00781 }
00782
00790 public final Object getObjectProperty(String name) throws JMSException {
00791 return doGetProperty(name);
00792 }
00793
00799 private final Object doGetProperty(String name) {
00800 if (name == null || name.equals(""))
00801 throw new IllegalArgumentException("Invalid property name: " + name);
00802
00803 if (name.startsWith("JMSX")) {
00804 if (name.equals("JMSXDeliveryCount"))
00805 return new Integer(momMsg.deliveryCount);
00806 else
00807 return momMsg.getOptionalHeader(name);
00808 } else {
00809 return momMsg.getProperty(name);
00810 }
00811 }
00812
00818 static public Message convertJMSMessage(javax.jms.Message jmsMsg) throws JMSException {
00819 Message joramMsg = null;
00820 if (jmsMsg instanceof javax.jms.TextMessage) {
00821 joramMsg = new TextMessage();
00822 ((javax.jms.TextMessage) joramMsg).setText(((javax.jms.TextMessage) jmsMsg).getText());
00823 } else if (jmsMsg instanceof javax.jms.ObjectMessage) {
00824 joramMsg = new ObjectMessage();
00825 ((javax.jms.ObjectMessage) joramMsg).setObject(((javax.jms.ObjectMessage) jmsMsg).getObject());
00826 } else if (jmsMsg instanceof javax.jms.StreamMessage) {
00827 joramMsg = new StreamMessage();
00828 try {
00829 ((javax.jms.StreamMessage) jmsMsg).reset();
00830 while (true)
00831 ((StreamMessage) joramMsg).writeObject(((javax.jms.StreamMessage) jmsMsg).readObject());
00832 } catch (Exception mE) {}
00833 } else if (jmsMsg instanceof javax.jms.BytesMessage) {
00834 joramMsg = new BytesMessage();
00835 try {
00836 ((javax.jms.BytesMessage) jmsMsg).reset();
00837 while (true)
00838 ((BytesMessage) joramMsg).writeByte(((javax.jms.BytesMessage) jmsMsg).readByte());
00839 } catch (Exception mE) {}
00840 } else if (jmsMsg instanceof javax.jms.MapMessage) {
00841 joramMsg = new MapMessage();
00842 Enumeration mapNames = ((javax.jms.MapMessage) jmsMsg).getMapNames();
00843 String mapName;
00844 while (mapNames.hasMoreElements()) {
00845 mapName = (String) mapNames.nextElement();
00846 ((javax.jms.MapMessage) joramMsg).setObject(mapName,
00847 ((javax.jms.MapMessage)
00848 jmsMsg).getObject(mapName));
00849 }
00850 } else {
00851 joramMsg = new Message();
00852 }
00853
00854 joramMsg.setJMSDestination(jmsMsg.getJMSDestination());
00855 joramMsg.setJMSCorrelationID(jmsMsg.getJMSCorrelationID());
00856 joramMsg.setJMSReplyTo(jmsMsg.getJMSReplyTo());
00857 joramMsg.setJMSType(jmsMsg.getJMSType());
00858 joramMsg.setJMSMessageID(jmsMsg.getJMSMessageID());
00859
00860 Enumeration names = jmsMsg.getPropertyNames();
00861 if (names != null) {
00862 String name;
00863 while (names.hasMoreElements()) {
00864 name = (String) names.nextElement();
00865 try {
00866 joramMsg.setObjectProperty(name, jmsMsg.getObjectProperty(name));
00867 } catch (JMSException e) {
00868
00869 if (! name.startsWith("JMSX") && ! name.startsWith("JMS_"))
00870 throw e;
00871 }
00872 }
00873 }
00874
00875 return joramMsg;
00876 }
00877
00884 protected void prepare() throws JMSException {
00885 momMsg.redelivered = false;
00886 }
00887
00888
00892 public org.objectweb.joram.shared.messages.Message getMomMsg() {
00893 return momMsg;
00894 }
00895
00896 public String toString() {
00897 StringBuffer strbuf = new StringBuffer();
00898 toString(strbuf);
00899 return strbuf.toString();
00900 }
00901
00902 public void toString(StringBuffer strbuf) {
00903 try {
00904 strbuf.append('(');
00905 strbuf.append(super.toString());
00906 strbuf.append(",JMSMessageID=").append(getJMSMessageID());
00907 try {
00908 strbuf.append(",JMSDestination=").append(getJMSDestination());
00909 } catch (JMSException exc) {
00910 JoramTracing.dbgClient.log(BasicLevel.ERROR, "Message.toString()", exc);
00911 }
00912 strbuf.append(",JMSCorrelationID=").append(getJMSCorrelationID());
00913 strbuf.append(",JMSDeliveryMode=").append(getJMSDeliveryMode());
00914 strbuf.append(",JMSExpiration=").append(getJMSExpiration());
00915 strbuf.append(",JMSPriority=").append(getJMSPriority());
00916 strbuf.append(",JMSRedelivered=").append(getJMSRedelivered());
00917 try {
00918 strbuf.append(",JMSReplyTo=").append(getJMSReplyTo());
00919 } catch (JMSException exc) {
00920 JoramTracing.dbgClient.log(BasicLevel.ERROR, "Message.toString()", exc);
00921 }
00922 strbuf.append(",JMSTimestamp=").append(getJMSTimestamp());
00923 strbuf.append(",JMSType=").append(getJMSType());
00924 strbuf.append(')');
00925 } catch (JMSException exc) {
00926
00927 }
00928 }
00929 }