Package net.timewalker.ffmq3.remote.session

Source Code of net.timewalker.ffmq3.remote.session.RemoteQueueBrowserEnumeration

/*
* This file is part of FFMQ.
*
* FFMQ is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* FFMQ 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with FFMQ; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
package net.timewalker.ffmq3.remote.session;

import java.util.NoSuchElementException;

import javax.jms.JMSException;
import javax.jms.Message;

import net.timewalker.ffmq3.common.message.AbstractMessage;
import net.timewalker.ffmq3.common.session.AbstractQueueBrowserEnumeration;
import net.timewalker.ffmq3.storage.message.MessageSerializationLevel;
import net.timewalker.ffmq3.transport.PacketTransportEndpoint;
import net.timewalker.ffmq3.transport.packet.query.CloseBrowserEnumerationQuery;
import net.timewalker.ffmq3.transport.packet.query.QueueBrowserFetchElementQuery;
import net.timewalker.ffmq3.transport.packet.query.QueueBrowserGetEnumerationQuery;
import net.timewalker.ffmq3.transport.packet.response.QueueBrowserFetchElementResponse;
import net.timewalker.ffmq3.transport.packet.response.QueueBrowserGetEnumerationResponse;
import net.timewalker.ffmq3.utils.ErrorTools;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* RemoteQueueBrowserEnumeration
*/
public final class RemoteQueueBrowserEnumeration extends AbstractQueueBrowserEnumeration
{
  private static final Log log = LogFactory.getLog(RemoteQueueBrowserEnumeration.class);
 
  // Parent connection
  private PacketTransportEndpoint transportEndpoint;
  // Parent session
  private RemoteSession session;
 
  // Attributes
  private AbstractMessage nextMessage;
  private boolean endOfQueueReached;
 
  /**
   * Constructor
   */
  public RemoteQueueBrowserEnumeration( RemoteSession session , RemoteQueueBrowser browser )
  {
    super(browser,null);
    this.transportEndpoint = session.getTransportEndpoint();
    this.session = session;
  }
 
  /**
     * Initialize the remote endpoint for this session
     */
    protected void remoteInit() throws JMSException
    {
        QueueBrowserGetEnumerationQuery query = new QueueBrowserGetEnumerationQuery();
        query.setSessionId(session.getId());
        query.setBrowserId(browser.getId());
        QueueBrowserGetEnumerationResponse response = (QueueBrowserGetEnumerationResponse)transportEndpoint.blockingRequest(query);
        this.id = response.getEnumId();
        log.debug("Remote queue browser enumeration ID is "+id);
    }

    private AbstractMessage fetchNext() throws JMSException
    {
      if (nextMessage != null) // Already fetched ?
      return nextMessage;

      // Lookup next candidate
      QueueBrowserFetchElementQuery query = new QueueBrowserFetchElementQuery();
      query.setSessionId(session.getId());
      query.setBrowserId(browser.getId());
      query.setEnumId(id);
      QueueBrowserFetchElementResponse response = (QueueBrowserFetchElementResponse)transportEndpoint.blockingRequest(query);
    nextMessage = response.getMessage();
   
    if (nextMessage == null)
    {
      endOfQueueReached = true;
      close(); // Auto-close enumeration at end of queue
    }
   
    return nextMessage;
    }
   
  /* (non-Javadoc)
   * @see java.util.Enumeration#hasMoreElements()
   */
  public boolean hasMoreElements()
  {
    if (endOfQueueReached)
      return false;
    try
    {
      checkNotClosed();
      Message msg = fetchNext();
      return msg != null;
    }
    catch (JMSException e)
    {
      throw new IllegalStateException(e.toString());
    }
  }

  /* (non-Javadoc)
   * @see java.util.Enumeration#nextElement()
   */
  public Object nextElement()
  {
    if (endOfQueueReached)
      throw new NoSuchElementException();
     
    try
    {
      checkNotClosed();
      AbstractMessage msg = fetchNext();
      if (msg != null)
      {
        nextMessage = null; // Consume fetched message

        // Make sure the message is fully deserialized and marked as read-only
        msg.ensureDeserializationLevel(MessageSerializationLevel.FULL);
        msg.markAsReadOnly();
       
        return msg;
      }
     
      throw new NoSuchElementException();
    }
    catch (NoSuchElementException e)
    {
      throw e;
    }
    catch (JMSException e)
    {
      throw new IllegalStateException(e.toString());
    }
  }
 
  /* (non-Javadoc)
   * @see net.timewalker.ffmq3.common.session.AbstractQueueBrowserEnumeration#onQueueBrowserEnumerationClose()
   */
  protected void onQueueBrowserEnumerationClose()
  {
      try
        {
        CloseBrowserEnumerationQuery query = new CloseBrowserEnumerationQuery();
        query.setSessionId(session.getId());
        query.setBrowserId(browser.getId());
        query.setEnumId(id);
        transportEndpoint.blockingRequest(query);
        }
      catch (JMSException e)
        {
            ErrorTools.log(e, log);
        }
  }
}
TOP

Related Classes of net.timewalker.ffmq3.remote.session.RemoteQueueBrowserEnumeration

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.