/*
 * Copyright (c) 2007, 2008, 2011, 2012, 2015 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.net4j.jms.internal.server;

import org.eclipse.net4j.internal.jms.DestinationImpl;
import org.eclipse.net4j.internal.jms.MessageImpl;
import org.eclipse.net4j.internal.jms.QueueImpl;
import org.eclipse.net4j.internal.jms.TopicImpl;
import org.eclipse.net4j.jms.server.IDestination;
import org.eclipse.net4j.jms.server.IStore;
import org.eclipse.net4j.jms.server.IStoreTransaction;
import org.eclipse.net4j.util.concurrent.RoundRobinList;

import javax.naming.Context;
import javax.naming.NamingException;

import java.util.Iterator;

/**
 * @author Eike Stepper
 */
public class ServerDestination implements IDestination
{
  private String name;

  private Type type;

  private RoundRobinList<ServerConsumer> consumers = new RoundRobinList<ServerConsumer>();

  public ServerDestination(String name, Type type)
  {
    this.name = name;
    this.type = type;
  }

  public String getName()
  {
    return name;
  }

  public Type getType()
  {
    return type;
  }

  public DestinationImpl bind(Context context, boolean rebind) throws NamingException
  {
    DestinationImpl destination = type == Type.QUEUE ? new QueueImpl(name) : new TopicImpl(name);
    if (rebind)
    {
      context.rebind(name, destination);
    }
    else
    {
      context.bind(name, destination);
    }

    return destination;
  }

  public boolean addConsumer(ServerConsumer consumer)
  {
    if (consumer.isDurable())
    {
      IStore store = Server.INSTANCE.getStore();
      IStoreTransaction transaction = store.startTransaction();
      transaction.consumerAdded(consumer);
      store.commitTransaction(transaction);
    }

    return consumers.add(consumer);
  }

  public boolean removeConsumer(final long consumerID)
  {
    final boolean[] modified = { false };
    consumers.executeWrites(new Runnable()
    {
      public void run()
      {
        for (Iterator<ServerConsumer> it = consumers.iterator(); it.hasNext();)
        {
          ServerConsumer consumer = it.next();
          if (consumer.getID() == consumerID)
          {
            it.remove();
            modified[0] = true;
            return;
          }
        }
      }
    });

    return modified[0];
  }

  /**
   * Called by worker thread of the server
   */
  public void handleClientMessage(IStoreTransaction transaction, MessageImpl message)
  {
    if (type == Type.QUEUE)
    {
      ServerConsumer consumer = consumers.element();
      if (consumer != null)
      {
        consumer.handleClientMessage(transaction, message);
      }
    }
    else
    {
      ServerConsumer[] consumers = this.consumers.toArray(new ServerConsumer[0]);
      for (ServerConsumer consumer : consumers)
      {
        consumer.handleClientMessage(transaction, message);
      }
    }
  }
}
