/*
 * Copyright (c) 2012, 2013, 2016 Eike Stepper (Loehne, 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:
 *    Martin Taal - initial API and implementation
 *    Eike Stepper - maintenance
 */
package org.eclipse.emf.cdo.server.internal.hibernate;

import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.branch.CDOBranchVersion;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDReference;
import org.eclipse.emf.cdo.common.id.CDOIDUtil;
import org.eclipse.emf.cdo.common.lock.CDOLockState;
import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
import org.eclipse.emf.cdo.server.IStoreAccessor;
import org.eclipse.emf.cdo.server.IView;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry;
import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionDelta;
import org.eclipse.emf.cdo.spi.server.InternalCommitContext;
import org.eclipse.emf.cdo.spi.server.InternalTransaction;

import org.eclipse.net4j.util.concurrent.RWOLockManager.LockState;
import org.eclipse.net4j.util.io.ExtendedDataInputStream;
import org.eclipse.net4j.util.om.monitor.OMMonitor;

import org.eclipse.emf.ecore.EClass;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Used during raw import.
 *
 * @author Martin Taal
 */
public class HibernateRawCommitContext implements InternalCommitContext
{
  private Map<CDOID, CDOID> idMappings = CDOIDUtil.createMap();

  private List<InternalCDORevision> dirtyObjects = new ArrayList<InternalCDORevision>();

  private List<InternalCDORevision> newObjects = new ArrayList<InternalCDORevision>();

  private int idCounter = 1;

  private CDOBranchPoint branchPoint;

  private boolean usingEcore;

  private boolean usingEtypes;

  public CDORevision getRevision(CDOID id)
  {
    for (CDORevision cdoRevision : newObjects)
    {
      if (id.equals(cdoRevision.getID()))
      {
        return cdoRevision;
      }
    }
    for (CDORevision cdoRevision : dirtyObjects)
    {
      if (id.equals(cdoRevision.getID()))
      {
        return cdoRevision;
      }
    }
    return null;
  }

  public CDOBranchPoint getBranchPoint()
  {
    if (branchPoint == null)
    {
      branchPoint = new CDOHibernateBranchPointImpl(System.currentTimeMillis());
    }
    return branchPoint;
  }

  public long getPreviousTimeStamp()
  {
    return 0;
  }

  public String getUserID()
  {
    return null;
  }

  public String getCommitComment()
  {
    return null;
  }

  public CDOBranchPoint getCommitMergeSource()
  {
    return null;
  }

  public long getLastUpdateTime()
  {
    return 0;
  }

  public long getTimeStamp()
  {
    return 0;
  }

  public boolean isTreeRestructuring()
  {
    return CDORevisionUtil.isTreeRestructuring(getDirtyObjectDeltas());
  }

  public void setLastTreeRestructuringCommit(long lastTreeRestructuringCommit)
  {
  }

  @Deprecated
  public boolean isAutoReleaseLocksEnabled()
  {
    return false;
  }

  public InternalCDOPackageRegistry getPackageRegistry()
  {
    return HibernateThreadContext.getCurrentStoreAccessor().getStore().getRepository().getPackageRegistry();
  }

  public boolean isClearResourcePathCache()
  {
    return false;
  }

  public boolean isUsingEcore()
  {
    return usingEcore;
  }

  public boolean isUsingEtypes()
  {
    return usingEtypes;
  }

  public InternalCDOPackageUnit[] getNewPackageUnits()
  {
    return new InternalCDOPackageUnit[0];
  }

  public CDOLockState[] getLocksOnNewObjects()
  {
    return null;
  }

  public CDOID[] getIDsToUnlock()
  {
    return null;
  }

  public InternalCDORevision[] getNewObjects()
  {
    return newObjects.toArray(new InternalCDORevision[0]);
  }

  public InternalCDORevision[] getDirtyObjects()
  {
    return dirtyObjects.toArray(new InternalCDORevision[0]);
  }

  public void addNewObject(InternalCDORevision cdoRevision)
  {
    cdoRevision.setVersion(1);
    CDOID newCDOID = CDOIDUtil.createTempObject(idCounter++);
    addIDMapping(cdoRevision.getID(), newCDOID);
    cdoRevision.setID(newCDOID);
    cdoRevision.setBranchPoint(getBranchPoint());
    newObjects.add(cdoRevision);
  }

  public void addDirtyObject(InternalCDORevision cdoRevision)
  {
    cdoRevision.setBranchPoint(getBranchPoint());
    dirtyObjects.add(cdoRevision);
  }

  public InternalCDORevisionDelta[] getDirtyObjectDeltas()
  {
    return null;
  }

  public CDOID[] getDetachedObjects()
  {
    return new CDOID[0];
  }

  public Map<CDOID, EClass> getDetachedObjectTypes()
  {
    return Collections.emptyMap();
  }

  public CDOBranchVersion[] getDetachedObjectVersions()
  {
    return new CDOBranchVersion[0];
  }

  public Map<CDOID, InternalCDORevision> getOldRevisions()
  {
    return null;
  }

  public Map<CDOID, InternalCDORevision> getNewRevisions()
  {
    return null;
  }

  public ExtendedDataInputStream getLobs()
  {
    return null;
  }

  public Map<CDOID, CDOID> getIDMappings()
  {
    return idMappings;
  }

  public CDOCommitInfo createCommitInfo()
  {
    return null;
  }

  public byte getRollbackReason()
  {
    return CDOProtocolConstants.ROLLBACK_REASON_UNKNOWN;
  }

  public String getRollbackMessage()
  {
    return null;
  }

  public List<CDOIDReference> getXRefs()
  {
    return null;
  }

  public List<LockState<Object, IView>> getPostCommmitLockStates()
  {
    return null;
  }

  public void setDirtyObjects(List<InternalCDORevision> dirtyObjects)
  {
    this.dirtyObjects = dirtyObjects;
  }

  public void setNewObjects(List<InternalCDORevision> newObjects)
  {
    this.newObjects = newObjects;
  }

  public IStoreAccessor getAccessor()
  {
    return null;
  }

  public void preWrite()
  {
  }

  public void write(OMMonitor monitor)
  {
  }

  public void commit(OMMonitor monitor)
  {
  }

  public void rollback(String message)
  {
  }

  public void postCommit(boolean success)
  {
  }

  public InternalCDORevision[] getDetachedRevisions()
  {
    return new InternalCDORevision[0];
  }

  public InternalCDORevision[] getDetachedRevisions(boolean check)
  {
    return getDetachedRevisions();
  }

  public void setClearResourcePathCache(boolean clearResourcePathCache)
  {
  }

  public void setUsingEcore(boolean usingEcore)
  {
    this.usingEcore = usingEcore;
  }

  public void setUsingEtypes(boolean usingEtypes)
  {
    this.usingEtypes = usingEtypes;
  }

  public void setNewPackageUnits(InternalCDOPackageUnit[] newPackageUnits)
  {
  }

  public void setLocksOnNewObjects(CDOLockState[] locksOnNewObjects)
  {
  }

  public void setIDsToUnlock(CDOID[] idsToUnlock)
  {
  }

  public void setNewObjects(InternalCDORevision[] newObjects)
  {
  }

  public void setDirtyObjectDeltas(InternalCDORevisionDelta[] dirtyObjectDeltas)
  {
  }

  public void setDetachedObjects(CDOID[] detachedObjects)
  {
  }

  public void setDetachedObjectTypes(Map<CDOID, EClass> detachedObjectTypes)
  {
  }

  public void setDetachedObjectVersions(CDOBranchVersion[] detachedObjectVersions)
  {
  }

  public void setLastUpdateTime(long lastUpdateTime)
  {
  }

  @Deprecated
  public void setAutoReleaseLocksEnabled(boolean on)
  {
  }

  public void setCommitNumber(int commitNumber)
  {
  }

  public void setCommitComment(String comment)
  {
  }

  public void setCommitMergeSource(CDOBranchPoint mergeSource)
  {
  }

  public void setLobs(ExtendedDataInputStream in)
  {
  }

  public void addIDMapping(CDOID oldID, CDOID newID)
  {
    // this can happen if an id is recreated to itself
    idMappings.remove(newID);
    idMappings.put(oldID, newID);
  }

  public void applyIDMappings(OMMonitor monitor)
  {
  }

  public InternalTransaction getTransaction()
  {
    return null;
  }

  public byte getSecurityImpact()
  {
    return 0;
  }

  public <T> T getData(Object key)
  {
    return null;
  }

  public <T> T setData(Object key, T data)
  {
    return null;
  }

  public void setSecurityImpact(byte securityImpact, Set<? extends Object> impactedRules)
  {
  }
}
