001 package com.mockrunner.mock.jms; 002 003 import java.io.ByteArrayInputStream; 004 import java.io.ByteArrayOutputStream; 005 import java.io.ObjectInputStream; 006 import java.io.ObjectOutputStream; 007 import java.io.Serializable; 008 009 import javax.jms.JMSException; 010 import javax.jms.MessageNotWriteableException; 011 import javax.jms.ObjectMessage; 012 013 import com.mockrunner.base.NestedApplicationException; 014 015 /** 016 * Mock implementation of JMS <code>ObjectMessage</code>. 017 */ 018 public class MockObjectMessage extends MockMessage implements ObjectMessage 019 { 020 private Serializable object; 021 022 public MockObjectMessage() 023 { 024 this(null); 025 } 026 027 public MockObjectMessage(Serializable object) 028 { 029 this.object = object; 030 } 031 032 public void setObject(Serializable object) throws JMSException 033 { 034 if(!isInWriteMode()) 035 { 036 throw new MessageNotWriteableException("Message is in read mode"); 037 } 038 this.object = object; 039 } 040 041 public Serializable getObject() throws JMSException 042 { 043 return object; 044 } 045 046 public void clearBody() throws JMSException 047 { 048 super.clearBody(); 049 object = null; 050 } 051 052 /** 053 * Calls the <code>equals</code> method of the underlying 054 * object. If both objects are <code>null</code>, this 055 * method returns <code>true</code>. 056 */ 057 public boolean equals(Object otherObject) 058 { 059 if(null == otherObject) return false; 060 if(!(otherObject instanceof MockObjectMessage)) return false; 061 MockObjectMessage otherMessage = (MockObjectMessage)otherObject; 062 if(null == object && null == otherMessage.object) return true; 063 return object.equals(otherMessage.object); 064 } 065 066 public int hashCode() 067 { 068 if(null == object) return 0; 069 return object.hashCode(); 070 } 071 072 public Object clone() 073 { 074 MockObjectMessage message = (MockObjectMessage)super.clone(); 075 try 076 { 077 ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); 078 ObjectOutputStream objectOutStream = new ObjectOutputStream(byteOutStream); 079 objectOutStream.writeObject(object); 080 objectOutStream.flush(); 081 ByteArrayInputStream byteInStream = new ByteArrayInputStream(byteOutStream.toByteArray()); 082 ObjectInputStream objectInStream = new ObjectInputStream(byteInStream); 083 message.object = (Serializable)objectInStream.readObject(); 084 return message; 085 } 086 catch(Exception exc) 087 { 088 throw new NestedApplicationException(exc); 089 } 090 } 091 092 public String toString() 093 { 094 return this.getClass().getName() + ": " + object; 095 } 096 }