001    package com.mockrunner.mock.connector.cci;
002    
003    import java.io.IOException;
004    import java.io.InputStream;
005    import java.io.OutputStream;
006    
007    import javax.resource.cci.Streamable;
008    
009    import com.mockrunner.base.NestedApplicationException;
010    import com.mockrunner.util.common.ArrayUtil;
011    import com.mockrunner.util.common.StreamUtil;
012    
013    /**
014     * Streamable <code>Record</code> backed by a byte array.
015     */
016    public class MockStreamableByteArrayRecord extends MockRecord implements Streamable
017    {
018        private byte[] content;
019        
020        public MockStreamableByteArrayRecord()
021        {
022            this(MockStreamableByteArrayRecord.class.getName());
023        }
024        
025        public MockStreamableByteArrayRecord(String name)
026        {
027            this(name, name);
028        }
029    
030        public MockStreamableByteArrayRecord(String name, String description)
031        {
032            super(name, description);
033            content = null;
034        }
035        
036        /**
037         * Returns a copy of the underlying byte array.
038         * @return the underlying data
039         */
040        public byte[] getContent()
041        {
042            if(null == content) return null;
043            return (byte[])content.clone();
044        }
045    
046        /**
047         * Sets the content of this record. The specified array
048         * will be copied.
049         * @param content the content
050         */
051        public void setContent(byte[] content)
052        {
053            if(null == content)
054            {
055                this.content = null;
056            }
057            else
058            {
059                this.content = (byte[])content.clone();
060            }
061        }
062    
063        public void read(InputStream stream) throws IOException
064        {
065            if(null == stream)
066            {
067                this.content = null;
068            }
069            else
070            {
071                this.content = StreamUtil.getStreamAsByteArray(stream);
072            }
073        }
074    
075        public void write(OutputStream stream) throws IOException
076        {
077            if(null != stream && null != this.content)
078            {
079                stream.write(this.content);
080                stream.flush();
081            }  
082        }
083        
084        public boolean equals(Object object)
085        {
086            if(!super.equals(object)) return false;
087            MockStreamableByteArrayRecord other = (MockStreamableByteArrayRecord)object;
088            return ArrayUtil.areArraysEqual(content, other.content);
089        }
090    
091        public int hashCode()
092        {
093            return super.hashCode() * 31 + ArrayUtil.computeHashCode(content);
094        }
095    
096        public Object clone()
097        {
098            try
099            {
100                MockStreamableByteArrayRecord clone = (MockStreamableByteArrayRecord)super.clone();
101                clone.setContent(this.content);
102                return clone;
103            } 
104            catch(Exception exc)
105            {
106                throw new NestedApplicationException(exc);
107            }
108        }
109    }