All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.acplt.oncrpc.XdrUnion Maven / Gradle / Ivy

There is a newer version: 1.1.6
Show newest version
/*
 * $Header: /home/harald/repos/remotetea.sf.net/remotetea/src/org/acplt/oncrpc/XdrUnion.java,v 1.1 2003/08/13 12:03:41 haraldalbrecht Exp $
 *
 * Copyright (c) 1999, 2000
 * Lehrstuhl fuer Prozessleittechnik (PLT), RWTH Aachen
 * D-52064 Aachen, Germany.
 * All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Library General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this program (see the file LICENSE.txt for more
 * details); if not, write to the Free Software Foundation, Inc.,
 * 675 Mass Ave, Cambridge, MA 02139, USA.
 */

package org.acplt.oncrpc;

import java.io.IOException;
import java.io.InvalidClassException;

/**
 * The abstract base class XdrUnion helps (de-)serializing
 * polymorphic classes. This class should not be confused with C unions in
 * general. Instead XdrUnion is an object-oriented construct
 * which helps in deploying polymorphism. For examples on how to use this,
 * please take a look at the "ACPLTea Java Library" package, which is also
 * available from www.acplt.org/ks. As a sidenote, the
 * serialization scheme implemented by XdrUnion is only a question
 * of getting used to it: after serializing the type code of the polymorphic
 * class, the variant part is serialized first before the common part. This
 * behaviour stems from the ACPLT C++ Communication Library and has been
 * retained for compatibility reasons. As it doesn't hurt, you won't mind
 * anyway.
 *
 * 

To use polymorphism with XDR streams, you'll have to derive your own base * class (let's call it foo from XdrUnion * and implement the two methods * {@link #xdrEncodeCommon(XdrEncodingStream)} and * {@link #xdrDecodeCommon(XdrDecodingStream)}. Do not overwrite * the methods xdrEncode and xdrDecode! * *

Then, in your foo-derived classes, like bar * and baz, implement the other two methods * {@link #xdrEncodeVariant(XdrEncodingStream)} and * {@link #xdrDecodeVariant(XdrDecodingStream)}. In addition, implement * {@link #getXdrTypeCode} to return an int, uniquely identifying your * class. Note that this identifier only needs to be unique within the scope * of your foo class. * * @version $Revision: 1.1 $ $Date: 2003/08/13 12:03:41 $ $State: Exp $ $Locker: $ * @author Harald Albrecht */ public abstract class XdrUnion implements XdrAble { /** * Returns the so-called type code which identifies a derived class when * encoded or decoded. Note that the type code is not globally unique, but * rather it is only unique within the derived classes of a direct descend * of XdrUnion. If foo is derived from XdrUnion * and foo is the base class for bar and * baz, then the type code needs only be unique between * bar and baz. * * @return Type code identifying an object's class when encoding or * decoding the object into or from a XDR stream. */ public abstract int getXdrTypeCode(); /** * Encodes -- that is: serializes -- an object into a XDR stream in * compliance to RFC 1832. * * @throws OncRpcException if an ONC/RPC error occurs. * @throws IOException if an I/O error occurs. */ public void xdrEncode(XdrEncodingStream xdr) throws OncRpcException, IOException { // // For historial reasons (read: "for dumb and pure idiotic reasons") // and compatibility with the ACPLT/KS C++ Communication Library we // encode/decode the variant part *first* before encoding/decoding // the common part. // xdr.xdrEncodeInt(getXdrTypeCode()); xdrEncodeVariant(xdr); xdrEncodeCommon(xdr); } /** * Decodes -- that is: deserializes -- an object from a XDR stream in * compliance to RFC 1832. * * @throws OncRpcException if an ONC/RPC error occurs. * @throws IOException if an I/O error occurs. */ public void xdrDecode(XdrDecodingStream xdr) throws OncRpcException, IOException { // // Make sure that when deserializing this object's state that // the stream provides state information indeed intended for this // particular class. // int xdrTypeCode = xdr.xdrDecodeInt(); if ( xdrTypeCode != getXdrTypeCode() ) { throw(new InvalidClassException(this.getClass().getName(), "non-matching XDR type code received.")); } // // For historial reasons (read: "for dumb and pure idiotic reasons") // and compatibility with the ACPLT/KS C++ Communication Library we // encode/decode the variant part *first* before encoding/decoding // the common part. // xdrDecodeVariant(xdr); xdrDecodeCommon(xdr); } /** * Encodes -- that is: serializes -- the common part of an object into * a XDR stream in compliance to RFC 1832. Note that the common part is * deserialized after the variant part. * * @param xdr An XDR encoding stream * * @throws OncRpcException if an ONC/RPC error occurs. * @throws IOException if an I/O error occurs. */ public abstract void xdrEncodeCommon(XdrEncodingStream xdr) throws OncRpcException, IOException; /** * Decodes -- that is: deserializes -- the common part of an object from * a XDR stream in compliance to RFC 1832. Note that the common part is * deserialized after the variant part. * * @param xdr An XDR decoding stream * * @throws OncRpcException if an ONC/RPC error occurs. * @throws IOException if an I/O error occurs. */ public abstract void xdrDecodeCommon(XdrDecodingStream xdr) throws OncRpcException, IOException; /** * Encodes -- that is: serializes -- the variant part of an object into * a XDR stream in compliance to RFC 1832. Note that the variant part is * deserialized before the common part. * * @param xdr An XDR encoding stream * * @throws OncRpcException if an ONC/RPC error occurs. * @throws IOException if an I/O error occurs. */ public abstract void xdrEncodeVariant(XdrEncodingStream xdr) throws OncRpcException, IOException; /** * Decodes -- that is: deserializes -- the variant part of an object from * a XDR stream in compliance to RFC 1832. Note that the variant part is * deserialized before the common part. * * @param xdr An XDR decoding stream * * @throws OncRpcException if an ONC/RPC error occurs. * @throws IOException if an I/O error occurs. */ public abstract void xdrDecodeVariant(XdrDecodingStream xdr) throws OncRpcException, IOException; } // End of XdrUnion.java





© 2015 - 2024 Weber Informatics LLC | Privacy Policy