/* * Copyright (c) 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: * Eike Stepper - initial API and implementation */ package org.eclipse.emf.cdo.server.hibernate.teneo; import org.eclipse.emf.cdo.eresource.EresourcePackage; import org.eclipse.emf.cdo.server.internal.hibernate.CDOHibernateConstants; import org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOIDUserType; import org.eclipse.emf.teneo.annotations.pamodel.PAnnotatedEClass; import org.eclipse.emf.teneo.annotations.pamodel.PAnnotatedEStructuralFeature; import org.eclipse.emf.teneo.hibernate.mapper.EntityMapper; import org.eclipse.emf.teneo.simpledom.Element; import java.util.List; /** * Adds mapping for econtainer and eresource. * * @author <a href="mtaal@elver.org">Martin Taal</a> * @since 3.0 */ public class CDOEntityMapper extends EntityMapper { private PAnnotatedEClass currentEntity; private boolean addedExtraMappings; public CDOEntityMapper() { } @Override public void processEntity(PAnnotatedEClass entity) { // not the nicest solution currentEntity = entity; try { addedExtraMappings = false; super.processEntity(entity); } finally { currentEntity = null; } } // add container and resource mappings @Override protected void processFeatures(List<PAnnotatedEStructuralFeature> features) { super.processFeatures(features); final Element entityElement = getHbmContext().getCurrent(); entityElement.addAttribute("lazy", "true"); if (!addedExtraMappings && currentEntity.getPaSuperEntity() == null) { final Element resourceElement = entityElement.addElement("property"); //$NON-NLS-1$ resourceElement.addAttribute("name", CDOHibernateConstants.RESOURCE_PROPERTY); //$NON-NLS-1$ resourceElement.addElement("column").addAttribute("name", CDOHibernateConstants.RESOURCE_PROPERTY_COLUMN); //$NON-NLS-1$//$NON-NLS-2$ resourceElement.addAttribute("type", CDOIDUserType.class.getName()); //$NON-NLS-1$ final Element containerElement = entityElement.addElement("property"); //$NON-NLS-1$ containerElement.addAttribute("name", CDOHibernateConstants.CONTAINER_PROPERTY).addAttribute("type", "string"); //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$ final Element columnElement = containerElement.addElement("column").addAttribute("name", //$NON-NLS-1$ //$NON-NLS-2$ CDOHibernateConstants.CONTAINER_PROPERTY_COLUMN); final Element versionElement = entityElement.addElement("version"); //$NON-NLS-1$ // add cdo_teneo prefix to prop name prevent name clashes with // efeatures which are accidentally called version // https://bugs.eclipse.org/bugs/show_bug.cgi?id=378050 versionElement.addAttribute("name", "cdo_teneo_" + getHbmContext().getVersionColumnName()); //$NON-NLS-1$ versionElement.addElement("meta").addAttribute("attribute", "version").setText("true"); versionElement.addElement("column").addAttribute("name", getHbmContext().getVersionColumnName()); //$NON-NLS-1$//$NON-NLS-2$ versionElement.addAttribute("type", Integer.class.getName()); //$NON-NLS-1$ final Element timeStampElement = entityElement.addElement("property"); //$NON-NLS-1$ timeStampElement.addAttribute("name", CDOHibernateConstants.COMMITTIMESTAMP_PROPERTY); //$NON-NLS-1$ timeStampElement.addAttribute("type", Long.class.getName()); //$NON-NLS-1$ if (getHbmContext().getCurrentEClass() == EresourcePackage.eINSTANCE.getCDOResourceNode()) { // not nice but teneo will assign the first unique-key the number c0 // and there is only one unique constraint columnElement.addAttribute("unique-key", "c0"); //$NON-NLS-1$//$NON-NLS-2$ } addedExtraMappings = true; } } }