001    /**
002     *
003     * Copyright 2004 Protique Ltd
004     *
005     * Licensed under the Apache License, Version 2.0 (the "License");
006     * you may not use this file except in compliance with the License.
007     * You may obtain a copy of the License at
008     *
009     * http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     *
017     **/
018    
019    package org.activemq.io.impl;
020    import java.io.DataOutput;
021    import java.io.IOException;
022    import org.activemq.message.Packet;
023    import org.activemq.message.TransactionType;
024    import org.activemq.message.XATransactionInfo;
025    
026    /**
027     * Writes a TransactionInfo object to a Stream
028     */
029    
030    public class XATransactionInfoWriter extends AbstractPacketWriter {
031    
032        /**
033         * Return the type of Packet
034         *
035         * @return integer representation of the type of Packet
036         */
037    
038        public int getPacketType() {
039            return Packet.XA_TRANSACTION_INFO;
040        }
041    
042        /**
043         * Write a Packet instance to data output stream
044         *
045         * @param packet  the instance to be seralized
046         * @param dataOut the output stream
047         * @throws java.io.IOException thrown if an error occurs
048         */
049    
050        public void writePacket(Packet packet, DataOutput dataOut) throws IOException {
051            super.writePacket(packet, dataOut);
052            XATransactionInfo info = (XATransactionInfo) packet;
053            dataOut.writeByte(info.getType());
054            switch (info.getType()) {
055                case TransactionType.START:
056                case TransactionType.PRE_COMMIT:
057                case TransactionType.COMMIT:
058                case TransactionType.RECOVER:
059                case TransactionType.ROLLBACK:
060                case TransactionType.END:
061                case TransactionType.FORGET:
062                case TransactionType.JOIN:
063                case TransactionType.COMMIT_ONE_PHASE:
064                    assert info.getXid() != null;
065                    info.getXid().write(dataOut);
066                    break;
067                case TransactionType.SET_TX_TIMEOUT:
068                    dataOut.writeInt(info.getTransactionTimeout());
069                    break;
070                case TransactionType.XA_RECOVER:
071                    //recover should take a flag.
072                    break;
073                case TransactionType.GET_TX_TIMEOUT:
074                case TransactionType.GET_RM_ID:
075                    break;
076                default:
077                    throw new IllegalArgumentException("Invalid type code: " + info.getType());
078            }
079        }
080    
081    }