/* * @(#)BufferManagerFactory.java 1.15 04/06/21 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package com.sun.corba.se.impl.encoding; import com.sun.corba.se.impl.encoding.BufferManagerRead; import com.sun.corba.se.impl.encoding.BufferManagerReadGrow; import com.sun.corba.se.impl.encoding.BufferManagerReadStream; import com.sun.corba.se.impl.encoding.BufferManagerWrite; import com.sun.corba.se.impl.protocol.giopmsgheaders.Message; import com.sun.corba.se.impl.logging.ORBUtilSystemException; import com.sun.corba.se.spi.logging.CORBALogDomains; import com.sun.corba.se.spi.ior.iiop.GIOPVersion; import com.sun.corba.se.spi.orb.ORB; import org.omg.CORBA.INTERNAL; /** * Creates read/write buffer managers to handle over/under flow * in CDR*putStream. */ public class BufferManagerFactory { public static final int GROW = 0; public static final int COLLECT = 1; public static final int STREAM = 2; // The next two methods allow creation of BufferManagers based on GIOP version. // We may want more criteria to be involved in this decision. // These are only used for sending messages (so could be fragmenting) public static BufferManagerRead newBufferManagerRead( GIOPVersion version, byte encodingVersion, ORB orb) { // REVISIT - On the reading side, shouldn't we monitor the incoming // fragments on a given connection to determine what fragment size // they're using, then use that ourselves? if (encodingVersion != Message.CDR_ENC_VERSION) { return new BufferManagerReadGrow(orb); } switch (version.intValue()) { case GIOPVersion.VERSION_1_0: return new BufferManagerReadGrow(orb); case GIOPVersion.VERSION_1_1: case GIOPVersion.VERSION_1_2: // The stream reader can handle fragmented and // non fragmented messages return new BufferManagerReadStream(orb); default: // REVISIT - what is appropriate? throw new INTERNAL("Unknown GIOP version: " + version); } } public static BufferManagerRead newBufferManagerRead( int strategy, byte encodingVersion, ORB orb) { if (encodingVersion != Message.CDR_ENC_VERSION) { if (strategy != BufferManagerFactory.GROW) { ORBUtilSystemException wrapper = ORBUtilSystemException.get((ORB)orb, CORBALogDomains.RPC_ENCODING); throw wrapper.invalidBuffMgrStrategy("newBufferManagerRead"); } return new BufferManagerReadGrow(orb); } switch (strategy) { case BufferManagerFactory.GROW: return new BufferManagerReadGrow(orb); case BufferManagerFactory.COLLECT: throw new INTERNAL("Collect strategy invalid for reading"); case BufferManagerFactory.STREAM: return new BufferManagerReadStream(orb); default: throw new INTERNAL("Unknown buffer manager read strategy: " + strategy); } } public static BufferManagerWrite newBufferManagerWrite( int strategy, byte encodingVersion, ORB orb) { if (encodingVersion != Message.CDR_ENC_VERSION) { if (strategy != BufferManagerFactory.GROW) { ORBUtilSystemException wrapper = ORBUtilSystemException.get((ORB)orb, CORBALogDomains.RPC_ENCODING); throw wrapper.invalidBuffMgrStrategy("newBufferManagerWrite"); } return new BufferManagerWriteGrow(orb); } switch (strategy) { case BufferManagerFactory.GROW: return new BufferManagerWriteGrow(orb); case BufferManagerFactory.COLLECT: return new BufferManagerWriteCollect(orb); case BufferManagerFactory.STREAM: return new BufferManagerWriteStream(orb); default: throw new INTERNAL("Unknown buffer manager write strategy: " + strategy); } } public static BufferManagerWrite newBufferManagerWrite( GIOPVersion version, byte encodingVersion, ORB orb) { if (encodingVersion != Message.CDR_ENC_VERSION) { return new BufferManagerWriteGrow(orb); } return BufferManagerFactory.newBufferManagerWrite( orb.getORBData().getGIOPBuffMgrStrategy(version), encodingVersion, orb); } public static BufferManagerRead defaultBufferManagerRead(ORB orb) { return new BufferManagerReadGrow(orb); } }