/*
 * Copyright (c) 2013, 2015, 2016, 2021 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:
 *    Eike Stepper - initial API and implementation
 *    Christian W. Damus (CEA LIST) - bug 420528
 */
package org.eclipse.emf.internal.cdo.object;

import org.eclipse.emf.cdo.CDOElement;
import org.eclipse.emf.cdo.CDOLock;
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.lock.CDOLockState;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.security.CDOPermission;
import org.eclipse.emf.cdo.common.util.CDOCommonUtil;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.view.CDOView;

import org.eclipse.net4j.util.properties.DefaultPropertyTester;
import org.eclipse.net4j.util.properties.IProperties;
import org.eclipse.net4j.util.properties.Properties;
import org.eclipse.net4j.util.properties.Property;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;

/**
 * @author Eike Stepper
 */
public class ObjectProperties extends Properties<EObject>
{
  public static final IProperties<EObject> INSTANCE = new ObjectProperties();

  public static final String NAMESPACE = "org.eclipse.emf.cdo.object";

  private static final String CATEGORY_CDO = "CDO"; //$NON-NLS-1$

  private ObjectProperties()
  {
    super(EObject.class);

    add(new Property<EObject>("isCDO") //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        return getCDOObject(object) != null;
      }
    });

    add(new Property<EObject>("id", //$NON-NLS-1$
        "ID", "The technical CDOID of this object.", CATEGORY_CDO)
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return null;
        }

        return cdoObject.cdoID();
      }
    });

    add(new Property<EObject>("version", //$NON-NLS-1$
        "Version", "The version of this object.", CATEGORY_CDO)
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return 0;
        }

        CDORevision revision = cdoObject.cdoRevision();
        if (revision == null)
        {
          return 0;
        }

        return revision.getVersion();
      }
    });

    add(new Property<EObject>("branch", //$NON-NLS-1$
        "Branch", "The branch of this object.", CATEGORY_CDO)
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return null;
        }

        CDORevision revision = cdoObject.cdoRevision();
        if (revision == null)
        {
          return null;
        }

        return revision.getBranch().getPathName();
      }
    });

    add(new Property<EObject>("timeStamp") //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return CDOBranchPoint.UNSPECIFIED_DATE;
        }

        CDORevision revision = cdoObject.cdoRevision();
        if (revision == null)
        {
          return CDOBranchPoint.UNSPECIFIED_DATE;
        }

        return revision.getTimeStamp();
      }
    });

    add(new Property<EObject>("modificationTime", //$NON-NLS-1$
        "Modification Time", "The modification time of this object.", CATEGORY_CDO)
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return null;
        }

        CDORevision revision = cdoObject.cdoRevision();
        if (revision == null)
        {
          return null;
        }

        return CDOCommonUtil.formatTimeStamp(revision.getTimeStamp());
      }
    });

    add(new Property<EObject>("state", //$NON-NLS-1$
        "State", "The current state of this object.", CATEGORY_CDO)
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return null;
        }

        return cdoObject.cdoState();
      }
    });

    add(new Property<EObject>("transactional") //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return false;
        }

        CDOView view = cdoObject.cdoView();
        if (view == null)
        {
          return false;
        }

        return !view.isReadOnly();
      }
    });

    add(new Property<EObject>("readable") //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return true;
        }

        return cdoObject.cdoPermission() != CDOPermission.NONE;
      }
    });

    add(new Property<EObject>("writable") //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return true;
        }

        CDOView view = cdoObject.cdoView();
        if (view == null)
        {
          return true;
        }

        return !view.isReadOnly() && cdoObject.cdoPermission() == CDOPermission.WRITE;
      }
    });

    add(new Property<EObject>("writableContainer") //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        EObject container = CDOElement.getParentOf(object);
        if (container == null)
        {
          return true;
        }

        CDOObject cdoContainer = getCDOObject(container);
        if (cdoContainer == null)
        {
          return true;
        }

        CDOView view = cdoContainer.cdoView();
        if (view == null)
        {
          return true;
        }

        return !view.isReadOnly() && cdoContainer.cdoPermission() == CDOPermission.WRITE;
      }
    });

    add(new Property<EObject>("container") //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        EObject container = CDOElement.getParentOf(object);
        if (container == null)
        {
          return false;
        }

        CDOObject cdoContainer = getCDOObject(container);
        if (cdoContainer == null)
        {
          return false;
        }

        return true;
      }
    });

    add(new Property<EObject>("children") //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        return !object.eContents().isEmpty();
      }
    });

    add(new Property<EObject>("permission", //$NON-NLS-1$
        "Permission", "The permission the current user has for this object.", CATEGORY_CDO)
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return null;
        }

        return cdoObject.cdoPermission();
      }
    });

    add(new Property<EObject>("permissionContainer") //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = null;

        EObject eContainer = object.eContainer();
        if (eContainer != null)
        {
          cdoObject = getCDOObject(eContainer);
        }

        if (cdoObject == null)
        {
          Resource resource = object.eResource();
          if (resource instanceof CDOObject)
          {
            cdoObject = (CDOObject)resource;
          }
        }

        if (cdoObject == null)
        {
          return null;
        }

        return cdoObject.cdoPermission();
      }
    });

    add(new Property<EObject>("readLocks", //$NON-NLS-1$
        "Read Locks", "The owner of read locks on this object.", CATEGORY_CDO)
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return null;
        }

        CDOLockState lockState = cdoObject.cdoLockState();
        if (lockState == null)
        {
          return null;
        }

        return lockState.getReadLockOwners();
      }
    });

    add(new Property<EObject>("readLocked")//$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return false;
        }

        CDOView view = cdoObject.cdoView();
        if (view == null)
        {
          return false;
        }

        CDOLock lock = cdoObject.cdoReadLock();
        if (lock == null)
        {
          return false;
        }

        return lock.isLocked();
      }
    });

    add(new Property<EObject>("readLockedByOthers")//$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return false;
        }

        CDOView view = cdoObject.cdoView();
        if (view == null)
        {
          return false;
        }

        CDOLock lock = cdoObject.cdoReadLock();
        if (lock == null)
        {
          return false;
        }

        return lock.isLockedByOthers();
      }
    });

    add(new Property<EObject>("writeLock", //$NON-NLS-1$
        "Write Lock", "The owner of a write lock on this object.", CATEGORY_CDO)
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return null;
        }

        CDOLockState lockState = cdoObject.cdoLockState();
        if (lockState == null)
        {
          return null;
        }

        return lockState.getWriteLockOwner();
      }
    });

    add(new Property<EObject>("writeLocked")//$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return false;
        }

        CDOView view = cdoObject.cdoView();
        if (view == null)
        {
          return false;
        }

        CDOLock lock = cdoObject.cdoWriteLock();
        if (lock == null)
        {
          return false;
        }

        return lock.isLocked();
      }
    });

    add(new Property<EObject>("writeLockedByOthers")//$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return false;
        }

        CDOView view = cdoObject.cdoView();
        if (view == null)
        {
          return false;
        }

        CDOLock lock = cdoObject.cdoWriteLock();
        if (lock == null)
        {
          return false;
        }

        return lock.isLockedByOthers();
      }
    });

    add(new Property<EObject>("writeOption", //$NON-NLS-1$
        "Write Option", "The owner of a write option on this object.", CATEGORY_CDO)
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return null;
        }

        CDOLockState lockState = cdoObject.cdoLockState();
        if (lockState == null)
        {
          return null;
        }

        return lockState.getWriteOptionOwner();
      }
    });

    add(new Property<EObject>("writeOptioned")//$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return false;
        }

        CDOView view = cdoObject.cdoView();
        if (view == null)
        {
          return false;
        }

        CDOLock lock = cdoObject.cdoWriteOption();
        if (lock == null)
        {
          return false;
        }

        return lock.isLocked();
      }
    });

    add(new Property<EObject>("writeOptionedByOthers")//$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return false;
        }

        CDOView view = cdoObject.cdoView();
        if (view == null)
        {
          return false;
        }

        CDOLock lock = cdoObject.cdoWriteOption();
        if (lock == null)
        {
          return false;
        }

        return lock.isLockedByOthers();
      }
    });

    add(new Property<EObject>("autoReleaseLocksExemption")//$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return false;
        }

        CDOView view = cdoObject.cdoView();
        if (view instanceof CDOTransaction)
        {
          CDOTransaction transaction = (CDOTransaction)view;
          return transaction.options().isAutoReleaseLocksExemption(cdoObject);
        }

        return false;
      }
    });

    add(new Property<EObject>("viewHistorical") //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return false;
        }

        CDOView view = cdoObject.cdoView();
        if (view == null)
        {
          return false;
        }

        return view.getTimeStamp() != CDOBranchPoint.UNSPECIFIED_DATE;
      }
    });

    add(new Property<EObject>("uri", "URI", "The URI of this object.", CATEGORY_CDO) //$NON-NLS-1$
    {
      @Override
      protected Object eval(EObject object)
      {
        CDOObject cdoObject = getCDOObject(object);
        if (cdoObject == null)
        {
          return null;
        }

        Resource resource = cdoObject.eResource();
        if (resource == null)
        {
          return null;
        }

        CDOID id = cdoObject.cdoID();
        String fragment = id != null ? id.toURIFragment() : resource.getURIFragment(cdoObject);
        return resource.getURI().appendFragment(fragment).toString();
      }
    });
  }

  private static CDOObject getCDOObject(EObject object)
  {
    return CDOUtil.getCDOObject(object, false);
  }

  public static void main(String[] args)
  {
    new Tester().dumpContributionMarkup();
    new ElementTester().dumpContributionMarkup();
  }

  /**
   * @author Eike Stepper
   */
  public static final class Tester extends DefaultPropertyTester<EObject>
  {
    public Tester()
    {
      super(NAMESPACE, INSTANCE);
    }
  }

  /**
   * @author Eike Stepper
   */
  public static final class ElementTester extends CDOElementTester
  {
    public ElementTester()
    {
      super(NAMESPACE, INSTANCE);
    }
  }
}
