- /*
- * @(#)BufferManagerWriteCollect.java 1.12 03/01/23
- *
- * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
- package com.sun.corba.se.internal.iiop;
- import java.util.Iterator;
- import java.util.NoSuchElementException;
- import java.util.LinkedList;
- import com.sun.corba.se.internal.orbutil.ORBConstants;
- import com.sun.corba.se.internal.iiop.messages.Message;
- import com.sun.corba.se.internal.iiop.messages.MessageBase;
- import com.sun.corba.se.internal.iiop.messages.FragmentMessage;
- /**
- * Initial implementation of the collect buffer manager.
- */
- public class BufferManagerWriteCollect extends BufferManagerWrite
- {
- private BufferQueue queue = new BufferQueue();
- private int initialFragmentSize;
- public BufferManagerWriteCollect(int initialFragmentSize) {
- this.stream = null;
- this.initialFragmentSize = initialFragmentSize;
- }
- public ByteBufferWithInfo getInitialBuffer (int size)
- {
- return new ByteBufferWithInfo(size);
- }
- public int getInitialBufferSize () {
- return initialFragmentSize;
- }
- // Set the fragment's "more fragments" bit to true, put it in the
- // queue, and allocate a new bbwi.
- public void overflow (ByteBufferWithInfo bbwi)
- {
- // Set the fragment's moreFragments field to true
- MessageBase.setFlag(bbwi.buf, Message.MORE_FRAGMENTS_BIT);
- // Enqueue the previous fragment
- queue.enqueue(bbwi);
- // Create a new bbwi
- ByteBufferWithInfo newBbwi = new ByteBufferWithInfo(getInitialBufferSize());
- newBbwi.fragmented = true;
- stream.setByteBufferWithInfo(newBbwi);
- // Now we must marshal in the fragment header/GIOP header
- // REVISIT - we can optimize this by not creating the fragment message
- // each time.
- FragmentMessage header = stream.getMessage().createFragmentMessage();
- header.write(stream);
- }
- // Send all fragments
- public void sendMessage ()
- {
- // Enqueue the last fragment
- queue.enqueue(stream.getByteBufferWithInfo());
- Iterator bufs = iterator();
- IIOPConnection conn = (IIOPConnection)stream.getConnection();
- // With the collect strategy, we must lock the connection
- // while fragments are being sent. This is so that there are
- // no interleved fragments in GIOP 1.1.
- //
- // Note that this thread must not call writeLock again in any
- // of its send methods!
- conn.writeLock();
- //conn.createOutCallDescriptor(stream.getMessage().getRequestId());
- conn.createOutCallDescriptor(MessageBase.getRequestId(stream.getMessage()));
- try {
- while (bufs.hasNext()) {
- stream.setByteBufferWithInfo((ByteBufferWithInfo)bufs.next());
- conn.sendWithoutLock(stream);
- }
- } finally {
- conn.writeUnlock();
- }
- }
- private Iterator iterator ()
- {
- return new BufferManagerWriteCollectIterator();
- }
- private class BufferManagerWriteCollectIterator implements Iterator
- {
- public boolean hasNext ()
- {
- return queue.size() != 0;
- }
- public Object next ()
- {
- return queue.dequeue();
- }
- public void remove ()
- {
- throw new UnsupportedOperationException();
- }
- }
- }