/** * <copyright> * * Copyright (c) 2009, 2010 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 - Initial API and implementation * * </copyright> * * $Id: DataGeneratorFactory.java,v 1.14 2011/08/25 12:33:42 mtaal Exp $ */ package org.eclipse.emf.texo.datagenerator; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Collection; import java.util.Date; import java.util.Locale; import javax.xml.datatype.Duration; import javax.xml.namespace.QName; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EDataType; import org.eclipse.emf.ecore.EEnum; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.FeatureMapUtil; import org.eclipse.emf.ecore.xml.type.XMLTypePackage; import org.eclipse.emf.texo.datagenerator.attributegenerators.BigDecimalDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.BigIntegerDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.BooleanDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.ByteArrayDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.ByteDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.CharDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.CollectionDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.DateDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.DoubleDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.DurationDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.EEnumDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.FloatDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.IntegerDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.JavaClassDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.LongDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.NullDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.QNameDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.ShortDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.StringDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.StringFileDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.XMLDateDataGenerator; import org.eclipse.emf.texo.datagenerator.attributegenerators.XMLDateTimeDataGenerator; /** * Generates data generators for EStructuralFeatures, EClasses and EDataTypes. Can be overridden if more types of * DataGenerators should be added. * * @author <a href="mailto:mtaal@elver.org">Martin Taal</a> * @version $Revision: 1.14 $ */ public class DataGeneratorFactory { private boolean useDataFiles = true; /** * Creates an {@link EClassDataGenerator}. * * @param eClass * the EClass used to create the EClassDataGenerator * @param modelDataGenerator * the modelDataGenerator which calls this factory * @return a new instance of the EClassDataGenerator */ public EClassDataGenerator createEClassDataGenerator(final EClass eClass, final ModelDataGenerator modelDataGenerator) { final EClassDataGenerator eClassDataGenerator = new EClassDataGenerator(); eClassDataGenerator.setModelDataGenerator(modelDataGenerator); eClassDataGenerator.setEClass(eClass); return eClassDataGenerator; } /** * Creates a DataGenerator for an {@link EStructuralFeature}. Calls other methods to create the correct * {@link EAttributeDataGenerator} and {@link EReferenceDataGenerator}. * * @param eClass * the EClass for which this data generator is called * @param eStructuralFeature * the EStructuralFeature used to create the correct DataGenerator * @param modelDataGenerator * the modelDataGenerator which calls this factory * @return a new instance of a subclass of EStructuralFeatureDataGenerator * @see EReferenceDataGenerator * @see EAttributeDataGenerator * @see EDataTypeDataGenerator */ public EStructuralFeatureDataGenerator createEStructuralFeatureDataGenerator(EClass eClass, final EStructuralFeature eStructuralFeature, final ModelDataGenerator modelDataGenerator) { if (eStructuralFeature instanceof EReference) { return createEReferenceDataGenerator((EReference) eStructuralFeature, modelDataGenerator); } if (FeatureMapUtil.isFeatureMap(eStructuralFeature)) { final FeatureMapDataGenerator featureMapDataGenerator = new FeatureMapDataGenerator(); featureMapDataGenerator.setEStructuralFeature(eStructuralFeature); featureMapDataGenerator.setModelDataGenerator(modelDataGenerator); featureMapDataGenerator.setFeatures(eClass); return featureMapDataGenerator; } return createEAttributeDataGenerator((EAttribute) eStructuralFeature, modelDataGenerator); } protected EReferenceDataGenerator createEReferenceDataGenerator(final EReference eReference, final ModelDataGenerator modelDataGenerator) { final EReferenceDataGenerator eReferenceDataGenerator = new EReferenceDataGenerator(); eReferenceDataGenerator.setEReference(eReference); eReferenceDataGenerator.setModelDataGenerator(modelDataGenerator); return eReferenceDataGenerator; } protected EAttributeDataGenerator createEAttributeDataGenerator(final EAttribute eAttribute, final ModelDataGenerator modelDataGenerator) { final EAttributeDataGenerator eAttributeDataGenerator = new EAttributeDataGenerator(); eAttributeDataGenerator.setModelDataGenerator(modelDataGenerator); eAttributeDataGenerator.setEAttribute(eAttribute); return eAttributeDataGenerator; } protected EDataTypeDataGenerator createEDataTypeDataGenerator(final EDataType eDataType, final ModelDataGenerator modelDataGenerator, EAttribute eAttribute) { EDataTypeDataGenerator eDataTypeDataGenerator = null; if (DataGeneratorUtils.getEnumBaseDataTypeIfObject(eDataType) != null || eDataType instanceof EEnum) { eDataTypeDataGenerator = new EEnumDataGenerator(); } else { Class<?> clz = DataGeneratorUtils.getInstanceClass(eDataType); final boolean isArray = clz.isArray(); if (isArray) { clz = clz.getComponentType(); } if (QName.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new QNameDataGenerator(); } else if (Class.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new JavaClassDataGenerator(); } else if (Collection.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new CollectionDataGenerator(); } else if (DataGeneratorUtils.getEnumBaseDataTypeIfObject(eDataType) != null || eDataType instanceof EEnum) { eDataTypeDataGenerator = new EEnumDataGenerator(); } else if (char.class.isAssignableFrom(clz) || Character.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new CharDataGenerator(); } else if (boolean.class.isAssignableFrom(clz) || Boolean.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new BooleanDataGenerator(); } else if (int.class.isAssignableFrom(clz) || Integer.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new IntegerDataGenerator(); } else if (short.class.isAssignableFrom(clz) || Short.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new ShortDataGenerator(); } else if (byte.class.isAssignableFrom(clz) || Byte.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new ByteDataGenerator(); } else if (byte[].class.isAssignableFrom(clz) || Byte[].class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new ByteArrayDataGenerator(); } else if (long.class.isAssignableFrom(clz) || Long.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new LongDataGenerator(); } else if (double.class.isAssignableFrom(clz) || Double.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new DoubleDataGenerator(); } else if (float.class.isAssignableFrom(clz) || Float.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new FloatDataGenerator(); } else if (Date.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new DateDataGenerator(); } else if (eDataType == XMLTypePackage.eINSTANCE.getDate()) { eDataTypeDataGenerator = new XMLDateDataGenerator(); } else if (eDataType == XMLTypePackage.eINSTANCE.getDateTime()) { eDataTypeDataGenerator = new XMLDateTimeDataGenerator(); } else if (BigDecimal.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new BigDecimalDataGenerator(); } else if (BigInteger.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new BigIntegerDataGenerator(); } else if (Duration.class.isAssignableFrom(clz)) { eDataTypeDataGenerator = new DurationDataGenerator(); } else if (String.class.isAssignableFrom(clz) && eAttribute == null) { eDataTypeDataGenerator = new StringDataGenerator(); } else if (String.class.isAssignableFrom(clz)) { final String path = "/org/eclipse/emf/texo/datagenerator/data/general/"; //$NON-NLS-1$ final String name = eAttribute.getName().toLowerCase(Locale.ENGLISH); StringFileDataGenerator stringFileDataGenerator = null; if (eAttribute.isID()) { // generates unique id values eDataTypeDataGenerator = new StringDataGenerator(); } else if (name.equals("description") || name.equals("title")) { //$NON-NLS-1$ //$NON-NLS-2$ stringFileDataGenerator = new StringFileDataGenerator(); stringFileDataGenerator.setDataContent(path + "description.txt"); //$NON-NLS-1$ stringFileDataGenerator.setValuesPerEAttribute(5); } else if (name.equals("name")) { //$NON-NLS-1$ stringFileDataGenerator = new StringFileDataGenerator(); stringFileDataGenerator.setDataContent(path + "description.txt"); //$NON-NLS-1$ stringFileDataGenerator.setValuesPerEAttribute(2); } else if (name.equals("city")) { //$NON-NLS-1$ stringFileDataGenerator = new StringFileDataGenerator(); stringFileDataGenerator.setDataContent(path + "city.txt"); //$NON-NLS-1$ } else if (name.equals("firstname")) { //$NON-NLS-1$ stringFileDataGenerator = new StringFileDataGenerator(); stringFileDataGenerator.setDataContent(path + "firstname.txt"); //$NON-NLS-1$ } else if (name.equals("lastname")) { //$NON-NLS-1$ stringFileDataGenerator = new StringFileDataGenerator(); stringFileDataGenerator.setDataContent(path + "lastname.txt"); //$NON-NLS-1$ } else if (name.equals("zipcode")) { //$NON-NLS-1$ stringFileDataGenerator = new StringFileDataGenerator(); stringFileDataGenerator.setDataContent(path + "us_zip.txt"); //$NON-NLS-1$ } else if (name.equals("zip")) { //$NON-NLS-1$ stringFileDataGenerator = new StringFileDataGenerator(); stringFileDataGenerator.setDataContent(path + "us_zip.txt"); //$NON-NLS-1$ } else if (name.equals("street")) { //$NON-NLS-1$ stringFileDataGenerator = new StringFileDataGenerator(); stringFileDataGenerator.setDataContent(path + "street.txt"); //$NON-NLS-1$ } if (useDataFiles && stringFileDataGenerator != null) { eDataTypeDataGenerator = stringFileDataGenerator; } else { eDataTypeDataGenerator = new StringDataGenerator(); } } else if (!eAttribute.isRequired()) { eDataTypeDataGenerator = new NullDataGenerator(); } else { throw new UnsupportedOperationException("EAttribute " //$NON-NLS-1$ + eAttribute + " with EDataType " //$NON-NLS-1$ + eDataType.getName() + " not supported"); //$NON-NLS-1$ } } eDataTypeDataGenerator.setModelDataGenerator(modelDataGenerator); eDataTypeDataGenerator.setEDataType(eDataType); return eDataTypeDataGenerator; } public boolean isUseDataFiles() { return useDataFiles; } public void setUseDataFiles(boolean useDataFiles) { this.useDataFiles = useDataFiles; } }