/*
 * Copyright (c) 2010-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.cdo.workspace;

import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.internal.workspace.FolderCDOWorkspaceBase;
import org.eclipse.emf.cdo.internal.workspace.WorkspaceProperties;
import org.eclipse.emf.cdo.server.IStore;
import org.eclipse.emf.cdo.session.CDOSessionConfigurationFactory;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.view.CDOView;

import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.properties.IProperties;

import org.eclipse.emf.ecore.EObject;

import java.io.File;
import java.util.Set;

/**
 * Various static helper methods for dealing with {@link CDOWorkspace workspaces}.
 *
 * @author Eike Stepper
 */
public final class CDOWorkspaceUtil
{
  private CDOWorkspaceUtil()
  {
  }

  /**
   * @since 4.1
   */
  public static IProperties<CDOWorkspace> getProperties()
  {
    return WorkspaceProperties.INSTANCE;
  }

  /**
   * @since 4.1
   */
  public static CDOWorkspace getWorkspace(EObject object)
  {
    CDOView view = CDOUtil.getCDOObject(object).cdoView();
    if (view == null || view.isClosed())
    {
      return null;
    }

    IListener[] listeners = view.getListeners();
    if (listeners != null)
    {
      for (int i = 0; i < listeners.length; i++)
      {
        IListener listener = listeners[i];
        if (listener instanceof org.eclipse.emf.cdo.internal.workspace.CDOWorkspaceImpl.ViewAdapter)
        {
          org.eclipse.emf.cdo.internal.workspace.CDOWorkspaceImpl.ViewAdapter adapter = (org.eclipse.emf.cdo.internal.workspace.CDOWorkspaceImpl.ViewAdapter)listener;
          return adapter.getWorkspace();
        }
      }
    }

    return null;
  }

  /**
   * @since 4.1
   */
  public static boolean isDirty(EObject object)
  {
    CDOObject cdoObject = CDOUtil.getCDOObject(object);
    if (object == null)
    {
      return false;
    }

    CDOWorkspace workspace = getWorkspace(cdoObject);
    CDOWorkspaceBase2 base = getWorkspaceBase2(workspace.getBase());
    return base.containsID(cdoObject.cdoID());
  }

  /**
   * @since 4.1
   */
  public static CDOWorkspaceBase2 getWorkspaceBase2(final CDOWorkspaceBase base)
  {
    if (base instanceof CDOWorkspaceBase2)
    {
      return (CDOWorkspaceBase2)base;
    }

    return new DelegatingWorkspaceBase2(base);
  }

  public static CDOWorkspaceBase createFolderWorkspaceBase(File folder)
  {
    return new FolderCDOWorkspaceBase(folder);
  }

  /**
   * Returns a new configuration that can be used to checkout a new {@link CDOWorkspace} or open an existing one.
   *
   * @since 4.1
   */
  public static CDOWorkspaceConfiguration createWorkspaceConfiguration()
  {
    return new org.eclipse.emf.cdo.internal.workspace.CDOWorkspaceConfigurationImpl();
  }

  /**
   * @deprecated Use {@link #createWorkspaceConfiguration()} and {@link CDOWorkspaceConfiguration#open()}
   */
  @Deprecated
  public static CDOWorkspace open(IStore local, CDOWorkspaceBase base, CDOSessionConfigurationFactory remote)
  {
    CDOWorkspaceConfiguration config = createWorkspaceConfiguration();
    config.setStore(local);
    config.setBase(base);
    config.setRemote(remote);
    return config.open();
  }

  /**
   * @deprecated Use {@link #createWorkspaceConfiguration()} and {@link CDOWorkspaceConfiguration#checkout()}
   */
  @Deprecated
  public static CDOWorkspace checkout(IStore local, CDOWorkspaceBase base, CDOSessionConfigurationFactory remote)
  {
    return checkout(local, base, remote, null);
  }

  /**
   * @deprecated Use {@link #createWorkspaceConfiguration()} and {@link CDOWorkspaceConfiguration#checkout()}
   */
  @Deprecated
  public static CDOWorkspace checkout(IStore local, CDOWorkspaceBase base, CDOSessionConfigurationFactory remote,
      String branchPath)
  {
    return checkout(local, base, remote, branchPath, CDOBranchPoint.UNSPECIFIED_DATE);
  }

  /**
   * @deprecated Use {@link #createWorkspaceConfiguration()} and {@link CDOWorkspaceConfiguration#checkout()}
   */
  @Deprecated
  public static CDOWorkspace checkout(IStore local, CDOWorkspaceBase base, CDOSessionConfigurationFactory remote,
      long timeStamp)
  {
    return checkout(local, base, remote, null, timeStamp);
  }

  /**
   * @deprecated Use {@link #createWorkspaceConfiguration()} and {@link CDOWorkspaceConfiguration#checkout()}
   */
  @Deprecated
  public static CDOWorkspace checkout(IStore local, CDOWorkspaceBase base, CDOSessionConfigurationFactory remote,
      String branchPath, long timeStamp)
  {
    CDOWorkspaceConfiguration config = createWorkspaceConfiguration();
    config.setStore(local);
    config.setBase(base);
    config.setRemote(remote);
    config.setBranchPath(branchPath);
    config.setTimeStamp(timeStamp);
    return config.checkout();
  }

  /**
   * @author Eike Stepper
   */
  private static final class DelegatingWorkspaceBase2 implements CDOWorkspaceBase2
  {
    private final CDOWorkspaceBase delegate;

    private DelegatingWorkspaceBase2(CDOWorkspaceBase base)
    {
      delegate = base;
    }

    public CDOWorkspace getWorkspace()
    {
      return delegate.getWorkspace();
    }

    public Set<CDOID> getIDs()
    {
      return delegate.getIDs();
    }

    public CDORevision getRevision(CDOID id)
    {
      return delegate.getRevision(id);
    }

    public boolean isEmpty()
    {
      return getIDs().isEmpty();
    }

    public boolean containsID(CDOID id)
    {
      return getIDs().contains(id);
    }

    public boolean isAddedObject(CDOID id)
    {
      return containsID(id) && getRevision(id) == null;
    }
  }
}
