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

import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDProvider;
import org.eclipse.emf.cdo.common.protocol.CDODataInput;
import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
import org.eclipse.emf.cdo.common.revision.CDOListFactory;
import org.eclipse.emf.cdo.common.revision.CDORevisionFactory;
import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.spi.server.InternalRepository;
import org.eclipse.emf.cdo.spi.workspace.InternalCDOWorkspace;
import org.eclipse.emf.cdo.spi.workspace.InternalCDOWorkspaceBase;
import org.eclipse.emf.cdo.transaction.CDOTransaction;

import org.eclipse.net4j.util.io.ExtendedDataInputStream;
import org.eclipse.net4j.util.io.ExtendedDataOutputStream;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

/**
 * @author Eike Stepper
 */
public abstract class AbstractCDOWorkspaceBase implements InternalCDOWorkspaceBase
{
  private InternalCDOWorkspace workspace;

  private Set<CDOID> ids;

  protected AbstractCDOWorkspaceBase()
  {
  }

  public void init(InternalCDOWorkspace workspace)
  {
    this.workspace = workspace;
  }

  public final InternalCDOWorkspace getWorkspace()
  {
    return workspace;
  }

  public final synchronized Set<CDOID> getIDs()
  {
    if (ids == null)
    {
      ids = doGetIDs();
    }

    return ids;
  }

  @Deprecated
  public final void updateAfterCommit(CDOTransaction transaction)
  {
    throw new UnsupportedOperationException();
  }

  public final synchronized void registerChangedOrDetachedObject(InternalCDORevision revision)
  {
    getIDs().add(revision.getID());
    doRegisterChangedOrDetachedObject(revision);
  }

  public final synchronized void registerAddedAndDetachedObject(InternalCDORevision revision)
  {
    doRegisterAddedAndDetachedObject(revision);
    deregisterObject(revision.getID());
  }

  public final synchronized void registerAddedObject(CDOID id)
  {
    getIDs().add(id);
    doRegisterAddedObject(id);
  }

  public final synchronized void deregisterObject(CDOID id)
  {
    if (ids != null)
    {
      ids.remove(id);
    }

    doDeregisterObject(id);
  }

  public final synchronized void clear()
  {
    ids = new HashSet<CDOID>();
    doClear();
  }

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

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

  protected CDODataInput createCDODataInput(ExtendedDataInputStream edis) throws IOException
  {
    InternalCDOPackageRegistry packageRegistry = workspace.getLocalRepository().getPackageRegistry(false);
    InternalCDOBranchManager branchManager = workspace.getLocalRepository().getBranchManager();
    CDORevisionFactory revisionFactory = CDORevisionFactory.DEFAULT;
    CDOListFactory listFactory = CDOListFactory.DEFAULT;

    return CDOCommonUtil.createCDODataInput(edis, packageRegistry, branchManager, null, revisionFactory, listFactory,
        null);
  }

  protected CDODataOutput createCDODataOutput(ExtendedDataOutputStream edos)
  {
    InternalRepository localRepository = workspace.getLocalRepository();
    InternalCDOPackageRegistry packageRegistry = localRepository.getPackageRegistry(false);
    CDOIDProvider idProvider = CDOIDProvider.NOOP;

    return CDOCommonUtil.createCDODataOutput(edos, packageRegistry, idProvider, localRepository);
  }

  protected abstract void doClear();

  protected abstract Set<CDOID> doGetIDs();

  protected abstract void doRegisterChangedOrDetachedObject(InternalCDORevision revision);

  protected abstract void doRegisterAddedAndDetachedObject(InternalCDORevision revision);

  protected abstract void doRegisterAddedObject(CDOID id);

  protected abstract void doDeregisterObject(CDOID id);
}
