org/objectweb/joram/client/jms/Message.java

00001 /*
00002  * JORAM: Java(TM) Open Reliable Asynchronous Messaging
00003  * Copyright (C) 2006 - 2008 ScalAgent Distributed Technologies
00004  *
00005  * This library is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU Lesser General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2.1 of the License, or any later version.
00009  * 
00010  * This library is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Lesser General Public License for more details.
00014  * 
00015  * You should have received a copy of the GNU Lesser General Public
00016  * License along with this library; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
00018  * USA.
00019  *
00020  * Initial developer(s): ScalAgent Distributed Technologies
00021  * Contributor(s): 
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         // The destination name is unknown
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       // The destination name is unknown
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   // API part about properties
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           // Joram not support other Optional JMSX, just ignore.
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       // Should never happened
00927     }
00928   }
00929 }

Generated on Tue Sep 16 16:14:24 2008 for joram by  doxygen 1.5.0