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

import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOCustomTypeUserType;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOENumIntegerType;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOENumStringType;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOIDExternalUserType;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDORevisionTuplizer;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOSyntheticIdPropertyHandler;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOSyntheticVersionPropertyHandler;
import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.FeatureMapEntryTuplizer;
import org.eclipse.emf.cdo.spi.common.revision.CDOFeatureMapEntry;

import org.eclipse.emf.teneo.annotations.pamodel.PAnnotatedEClass;
import org.eclipse.emf.teneo.extension.ExtensionManager;
import org.eclipse.emf.teneo.hibernate.mapper.EntityMapper;
import org.eclipse.emf.teneo.hibernate.mapper.MappingContext;
import org.eclipse.emf.teneo.simpledom.Element;

/**
 * Mapping context for CDO. It provides cdo classes as propertyhandler etc.
 *
 * @author <a href="mtaal@elver.org">Martin Taal</a>
 * @since 3.0
 */
public class CDOMappingContext extends MappingContext
{
  public CDOMappingContext()
  {
  }

  /** Add a tuplizer element or not */
  @Override
  public void addTuplizerElement(Element entityElement, PAnnotatedEClass aclass)
  {
    Element tuplizerElement = new Element("tuplizer").addAttribute("entity-mode", "dynamic-map").addAttribute("class", //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
        CDORevisionTuplizer.class.getName());
    entityElement.add(0, tuplizerElement);
    tuplizerElement = new Element("tuplizer").addAttribute("entity-mode", "pojo").addAttribute("class", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
        CDORevisionTuplizer.class.getName());
    entityElement.add(0, tuplizerElement);

    if (entityElement.getAttributeValue("name") != null)
    {
      entityElement.addAttribute("proxy", CDORevision.class.getName());
      entityElement.removeAttribute("name");
    }
  }

  @Override
  public void setExtensionManager(ExtensionManager extensionManager)
  {
    super.setExtensionManager(extensionManager);
    extensionManager.registerExtension(EntityMapper.class.getName(), CDOEntityMapper.class.getName());
  }

  @Override
  public String getComponentPropertyHandlerName()
  {
    return super.getComponentPropertyHandlerName();
  }

  @Override
  public String getIdPropertyHandlerName()
  {
    return null;
  }

  @Override
  public String getPropertyHandlerName()
  {
    return super.getPropertyHandlerName();
  }

  @Override
  public String getVersionPropertyHandlerName()
  {
    return null;
  }

  @Override
  public String getExternalUserType()
  {
    return CDOIDExternalUserType.class.getName();
  }

  @Override
  public String getComponentFeatureMapTuplizer()
  {
    return FeatureMapEntryTuplizer.class.getName();
  }

  @Override
  public String getFeatureMapEntryClassName()
  {
    return CDOFeatureMapEntry.class.getName();
  }

  @Override
  public String getEnumUserType()
  {
    return CDOENumStringType.class.getName();
  }

  @Override
  public String getEnumIntegerUserType()
  {
    return CDOENumIntegerType.class.getName();
  }

  @Override
  public String getSyntheticIdPropertyHandlerName()
  {
    return CDOSyntheticIdPropertyHandler.class.getName();
  }

  @Override
  public String getSyntheticVersionPropertyHandlerName()
  {
    return CDOSyntheticVersionPropertyHandler.class.getName();
  }

  @Override
  public String getDynamicEnumUserType()
  {
    return CDOENumStringType.class.getName();
  }

  @Override
  public String getDynamicEnumIntegerUserType()
  {
    return CDOENumIntegerType.class.getName();
  }

  @Override
  public String getDefaultUserType()
  {
    return CDOCustomTypeUserType.class.getName();
  }

  @Override
  public String getXSDDateUserType()
  {
    return super.getXSDDateUserType();
  }

  @Override
  public String getXSDDateTimeUserType()
  {
    return super.getXSDDateTimeUserType();
  }
}
