/*
 * Copyright (c) 2008-2012 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 - copied from CDORevisionPropertyHandler and adapted
 *    Eike Stepper - maintenance
 */
package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer;

import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDObject;
import org.eclipse.emf.cdo.common.id.CDOIDTemp;
import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.server.internal.hibernate.HibernateCommitContext;
import org.eclipse.emf.cdo.server.internal.hibernate.HibernateThreadContext;
import org.eclipse.emf.cdo.server.internal.hibernate.HibernateUtil;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;

import org.hibernate.HibernateException;

/**
 * @author Martin Taal
 */
public class CDOIDPropertyGetter extends CDOPropertyGetter
{
  private static final long serialVersionUID = 1L;

  public CDOIDPropertyGetter(CDORevisionTuplizer tuplizer, String propertyName)
  {
    super(tuplizer, propertyName);
  }

  @Override
  public Object get(Object target) throws HibernateException
  {
    if (target instanceof CDOID)
    {
      return target;
    }
    InternalCDORevision revision = (InternalCDORevision)target;
    if (!(HibernateUtil.getInstance().getCDOID(revision) instanceof CDOIDObject))
    {
      if (!isVirtualProperty())
      {
        final Object value = super.get(target);
        // todo: value can be null for generated values?
        if (value != null)
        {
          setCDOID(revision, value);
        }

        return value;
      }

      return null;
    }

    if (isVirtualProperty())
    {
      return HibernateUtil.getInstance().getIdValue(revision.getID());
    }

    Object id = super.get(target);
    setCDOID(revision, id);

    // TODO: does this make sense?
    // if (id.getId() == null)
    // {
    // id.setId((Serializable)id);
    // }
    return id;
  }

  private void setCDOID(CDORevision target, Object value)
  {
    final InternalCDORevision revision = (InternalCDORevision)target;
    final CDOID id = HibernateUtil.getInstance().getCDOID(revision);
    if (id == null || id instanceof CDOIDTemp)
    {
      final CDOID newCDOID = HibernateUtil.getInstance().createCDOID(new CDOClassifierRef(revision.getEClass()), value);
      revision.setID(newCDOID);
      if (HibernateThreadContext.isCommitContextSet())
      {
        final HibernateCommitContext commitContext = HibernateThreadContext.getCommitContext();
        commitContext.setNewID(id, newCDOID);
        if (id instanceof CDOIDTemp)
        {
          commitContext.getCommitContext().addIDMapping(id, newCDOID);
        }
      }
    }
  }

  @Override
  protected boolean isVirtualPropertyAllowed()
  {
    return true;
  }
}
