/** * <copyright> * * Copyright (c) 2005, 2006, 2007, 2008 Springsite BV (The Netherlands) 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 * </copyright> * * $Id: MappingUtil.java,v 1.7 2008/12/16 20:40:29 mtaal Exp $ */ package org.eclipse.emf.teneo.hibernate.mapper; import java.util.Properties; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.teneo.PersistenceOptions; import org.eclipse.emf.teneo.annotations.mapper.BasicPamodelBuilder; import org.eclipse.emf.teneo.annotations.mapper.EClassAnnotator; import org.eclipse.emf.teneo.annotations.mapper.EDataTypeAnnotator; import org.eclipse.emf.teneo.annotations.mapper.EFeatureAnnotator; import org.eclipse.emf.teneo.annotations.mapper.ManyToOneReferenceAnnotator; import org.eclipse.emf.teneo.annotations.mapper.OneToManyAttributeAnnotator; import org.eclipse.emf.teneo.annotations.mapper.OneToManyReferenceAnnotator; import org.eclipse.emf.teneo.annotations.mapper.OneToOneReferenceAnnotator; import org.eclipse.emf.teneo.annotations.mapper.PersistenceMappingBuilder; import org.eclipse.emf.teneo.annotations.mapper.SingleAttributeAnnotator; import org.eclipse.emf.teneo.annotations.pamodel.PAnnotatedEReference; import org.eclipse.emf.teneo.annotations.pamodel.PAnnotatedModel; import org.eclipse.emf.teneo.annotations.parser.EAnnotationParserImporter; import org.eclipse.emf.teneo.annotations.xml.XmlPersistenceMapper; import org.eclipse.emf.teneo.extension.ExtensionManager; import org.eclipse.emf.teneo.extension.ExtensionManagerFactory; import org.eclipse.emf.teneo.extension.ExtensionUtil; import org.eclipse.emf.teneo.hibernate.annotations.HbAnnotationModelBuilder; import org.eclipse.emf.teneo.hibernate.annotations.HbEAnnotationParserImporter; import org.eclipse.emf.teneo.hibernate.annotations.HbEClassAnnotator; import org.eclipse.emf.teneo.hibernate.annotations.HbEDataTypeAnnotator; import org.eclipse.emf.teneo.hibernate.annotations.HbEFeatureAnnotator; import org.eclipse.emf.teneo.hibernate.annotations.HbManyToOneReferenceAnnotator; import org.eclipse.emf.teneo.hibernate.annotations.HbOneToManyAttributeAnnotator; import org.eclipse.emf.teneo.hibernate.annotations.HbOneToManyReferenceAnnotator; import org.eclipse.emf.teneo.hibernate.annotations.HbOneToOneReferenceAnnotator; import org.eclipse.emf.teneo.hibernate.annotations.HbSingleAttributeAnnotator; import org.eclipse.emf.teneo.hibernate.annotations.HbXmlPersistenceMapper; import org.eclipse.emf.teneo.hibernate.hbmodel.HbAnnotatedETypeElement; /** * Contains some utility methods. * * @author <a href="mailto:mtaal@elver.org">Martin Taal</a> * @version $Revision: 1.7 $ */ public class MappingUtil { /** * Separate utility method, generates a hibernate mapping for a set of * epackages and options. The hibernate.hbm.xml is returned as a string. The * mapping is not registered or used in any other way by Elver. */ public static String generateMapping(EPackage[] epackages, Properties props) { final ExtensionManager extensionManager = ExtensionManagerFactory .getInstance().create(); return generateMapping(epackages, props, extensionManager); } public static String generateMapping(EPackage[] epackages, Properties props, ExtensionManager extensionManager) { registerHbExtensions(extensionManager); // DCB: Use Hibernate-specific annotation processing mechanism. This // allows use of // Hibernate-specific annotations. final PersistenceOptions po = extensionManager.getExtension( PersistenceOptions.class, new Object[] { props }); final PAnnotatedModel paModel = extensionManager.getExtension( PersistenceMappingBuilder.class).buildMapping(epackages, po, extensionManager); final HibernateMappingGenerator hmg = extensionManager .getExtension(HibernateMappingGenerator.class); hmg.setPersistenceOptions(po); return hmg.generateToString(paModel); } /** * Determine the collection element set, bag or list. Only used in case * Teneo operates for non-emf code */ public static String getCollectionElement(HbAnnotatedETypeElement hbFeature) { final boolean hasOrderBy = hbFeature instanceof PAnnotatedEReference && ((PAnnotatedEReference) hbFeature).getOrderBy() != null; if (!hbFeature.getOneToMany().isList() || hasOrderBy) { return "set"; } else if (hbFeature.getOneToMany().isList() && !hbFeature.getOneToMany().isIndexed()) { return "bag"; } else { return "list"; } } /** Registers default hb extensions */ public static void registerHbExtensions(ExtensionManager extensionManager) { extensionManager.registerExtension(ExtensionUtil.createExtension( BasicPamodelBuilder.class, HbAnnotationModelBuilder.class)); extensionManager.registerExtension(ExtensionUtil.createExtension( EAnnotationParserImporter.class, HbEAnnotationParserImporter.class)); extensionManager.registerExtension(ExtensionUtil.createExtension( XmlPersistenceMapper.class, HbXmlPersistenceMapper.class)); extensionManager.registerExtension(ExtensionUtil.createExtension( SingleAttributeAnnotator.class, HbSingleAttributeAnnotator.class)); extensionManager.registerExtension(ExtensionUtil.createExtension( EClassAnnotator.class, HbEClassAnnotator.class)); extensionManager.registerExtension(ExtensionUtil.createExtension( EFeatureAnnotator.class, HbEFeatureAnnotator.class)); extensionManager.registerExtension(ExtensionUtil.createExtension( OneToManyAttributeAnnotator.class, HbOneToManyAttributeAnnotator.class)); extensionManager.registerExtension(ExtensionUtil.createExtension( EDataTypeAnnotator.class, HbEDataTypeAnnotator.class)); extensionManager.registerExtension(ExtensionUtil.createExtension( OneToManyReferenceAnnotator.class, HbOneToManyReferenceAnnotator.class)); extensionManager.registerExtension(ExtensionUtil.createExtension( OneToOneReferenceAnnotator.class, HbOneToOneReferenceAnnotator.class)); extensionManager.registerExtension(ExtensionUtil.createExtension( ManyToOneReferenceAnnotator.class, HbManyToOneReferenceAnnotator.class)); } }