/*
 * Copyright (c) 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.emf.internal.cdo.view;

import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.cdo.view.CDOViewRegistry;
import org.eclipse.emf.cdo.view.CDOViewRegistry.Registration;

import org.eclipse.net4j.util.container.Container;

import java.util.HashMap;
import java.util.Map;

/**
 * @author Eike Stepper
 * @since 4.2
 * @see CDOView
 */
public class CDOViewRegistryImpl extends Container<Registration>implements CDOViewRegistry
{
  public static final CDOViewRegistryImpl INSTANCE = new CDOViewRegistryImpl();

  private final Map<Integer, Registration> ids = new HashMap<Integer, Registration>();

  private final Map<CDOView, Registration> views = new HashMap<CDOView, Registration>();

  private int lastID;

  public CDOViewRegistryImpl()
  {
  }

  public synchronized Registration[] getElements()
  {
    return ids.values().toArray(new Registration[ids.size()]);
  }

  public synchronized int[] getIDs()
  {
    int[] result = new int[ids.size()];

    int i = 0;
    for (Integer id : ids.keySet())
    {
      result[i++] = id;
    }

    return result;
  }

  public synchronized CDOView[] getViews()
  {
    return views.keySet().toArray(new CDOView[views.size()]);
  }

  public synchronized int getID(CDOView view)
  {
    Registration registration = views.get(view);
    if (registration != null)
    {
      return registration.getID();
    }

    return NOT_REGISTERED;
  }

  public synchronized CDOView getView(int id)
  {
    Registration registration = ids.get(id);
    if (registration != null)
    {
      return registration.getView();
    }

    return null;
  }

  void register(CDOView view)
  {
    Registration registration;
    synchronized (this)
    {
      if (views.containsKey(view))
      {
        return;
      }

      int id = ++lastID;
      registration = new RegistrationImpl(id, view);

      ids.put(id, registration);
      views.put(view, registration);
    }

    fireElementAddedEvent(registration);
  }

  void deregister(CDOView view)
  {
    Registration registration;
    synchronized (this)
    {
      registration = views.remove(view);
      if (registration != null)
      {
        int id = registration.getID();
        ids.remove(id);
      }
    }

    fireElementRemovedEvent(registration);
  }

  /**
   * @author Eike Stepper
   */
  private static final class RegistrationImpl implements Registration
  {
    private final int id;

    private final CDOView view;

    public RegistrationImpl(int id, CDOView view)
    {
      this.id = id;
      this.view = view;
    }

    public int getID()
    {
      return id;
    }

    public CDOView getView()
    {
      return view;
    }
  }
}
