/** * Copyright (c) 2002-2010 IBM Corporation 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: * IBM - Initial API and implementation */ package org.eclipse.emf.codegen.ecore.genmodel.impl; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.emf.codegen.ecore.genmodel.GenClassifier; import org.eclipse.emf.codegen.ecore.genmodel.GenDataType; import org.eclipse.emf.codegen.ecore.genmodel.GenEnum; import org.eclipse.emf.codegen.ecore.genmodel.GenJDKLevel; import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage; import org.eclipse.emf.codegen.ecore.genmodel.GenTypeParameter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.util.UniqueEList; import org.eclipse.emf.ecore.EAnnotation; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EDataType; import org.eclipse.emf.ecore.EEnum; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.ETypeParameter; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.ENotificationImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.util.ExtendedMetaData; import org.eclipse.emf.ecore.xml.type.XMLTypePackage; /** * <!-- begin-user-doc --> * An implementation of the model object '<em><b>Gen Data Type</b></em>'. * <!-- end-user-doc --> * <p> * The following features are implemented: * </p> * <ul> * <li>{@link org.eclipse.emf.codegen.ecore.genmodel.impl.GenDataTypeImpl#getEcoreDataType <em>Ecore Data Type</em>}</li> * </ul> * * @generated */ public class GenDataTypeImpl extends GenClassifierImpl implements GenDataType { /** * The cached value of the '{@link #getEcoreDataType() <em>Ecore Data Type</em>}' reference. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getEcoreDataType() * @generated * @ordered */ protected EDataType ecoreDataType; protected GenDataTypeImpl() { super(); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override protected EClass eStaticClass() { return GenModelPackage.Literals.GEN_DATA_TYPE; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public EDataType getEcoreDataType() { if (ecoreDataType != null && ecoreDataType.eIsProxy()) { InternalEObject oldEcoreDataType = (InternalEObject)ecoreDataType; ecoreDataType = (EDataType)eResolveProxy(oldEcoreDataType); if (ecoreDataType != oldEcoreDataType) { if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.RESOLVE, GenModelPackage.GEN_DATA_TYPE__ECORE_DATA_TYPE, oldEcoreDataType, ecoreDataType)); } } return ecoreDataType; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public EDataType basicGetEcoreDataType() { return ecoreDataType; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void setEcoreDataType(EDataType newEcoreDataType) { EDataType oldEcoreDataType = ecoreDataType; ecoreDataType = newEcoreDataType; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, GenModelPackage.GEN_DATA_TYPE__ECORE_DATA_TYPE, oldEcoreDataType, ecoreDataType)); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public Object eGet(int featureID, boolean resolve, boolean coreType) { switch (featureID) { case GenModelPackage.GEN_DATA_TYPE__ECORE_DATA_TYPE: if (resolve) return getEcoreDataType(); return basicGetEcoreDataType(); } return super.eGet(featureID, resolve, coreType); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public void eSet(int featureID, Object newValue) { switch (featureID) { case GenModelPackage.GEN_DATA_TYPE__ECORE_DATA_TYPE: setEcoreDataType((EDataType)newValue); return; } super.eSet(featureID, newValue); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public void eUnset(int featureID) { switch (featureID) { case GenModelPackage.GEN_DATA_TYPE__ECORE_DATA_TYPE: setEcoreDataType((EDataType)null); return; } super.eUnset(featureID); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public boolean eIsSet(int featureID) { switch (featureID) { case GenModelPackage.GEN_DATA_TYPE__ECORE_DATA_TYPE: return ecoreDataType != null; } return super.eIsSet(featureID); } @Override public EClassifier getEcoreClassifier() { return getEcoreDataType(); } @Override protected EModelElement basicGetEcoreModelElement() { return ecoreDataType; } @Override public String getImportedMetaType() { return getGenModel().getImportedName("org.eclipse.emf.ecore.EDataType"); } public String getQualifiedInstanceClassName() { return getRawQualifiedInstanceClassName().replace('$','.'); } public String getRawQualifiedInstanceClassName() { return getInternalQualifiedInstanceClassName(getEffectiveComplianceLevel().getValue() >= GenJDKLevel.JDK50); } protected String getInternalQualifiedInstanceClassName(boolean includeTemplateArguments) { return getType(null, getEcoreDataType(), false, !includeTemplateArguments); } public String getRawImportedInstanceClassName() { return getGenModel().getImportedName(getInternalQualifiedInstanceClassName(false)); } public String getRawInstanceClassName() { String internalQualifiedInstanceClassName = getInternalQualifiedInstanceClassName(false); return internalQualifiedInstanceClassName == null ? null : internalQualifiedInstanceClassName.replace('$', '.'); } public String getImportedInstanceClassName() { return getGenModel().getImportedName(getRawQualifiedInstanceClassName()); } @Override public String getImportedParameterizedInstanceClassName() { String result = getImportedInstanceClassName(); if (getEffectiveComplianceLevel().getValue() >= GenJDKLevel.JDK50) { if (getEffectiveItemType() != null) { result += "<" + getEffectiveItemType().getObjectType().getImportedParameterizedInstanceClassName() + ">"; } else if (!getEcoreDataType().getETypeParameters().isEmpty()) { result += "<"; for (Iterator<ETypeParameter> i = getEcoreDataType().getETypeParameters().iterator(); i.hasNext(); ) { i.next(); result += "?"; if (i.hasNext()) { result += ", "; } } result += ">"; } } return result; } @Override public String getImportedWildcardInstanceClassName() { String result = getImportedInstanceClassName(); if (getEffectiveComplianceLevel().getValue() >= GenJDKLevel.JDK50) { if (getEffectiveItemType() != null) { result += "<?>"; } else if (!getEcoreDataType().getETypeParameters().isEmpty()) { result += "<"; for (Iterator<ETypeParameter> i = getEcoreDataType().getETypeParameters().iterator(); i.hasNext(); ) { i.next(); result += "?"; if (i.hasNext()) { result += ", "; } } result += ">"; } } return result; } public String getImportedWildcardObjectInstanceClassName() { String result = getObjectInstanceClassName(); if (getEffectiveComplianceLevel().getValue() >= GenJDKLevel.JDK50) { if (getEffectiveItemType() != null) { result += "<?>"; } else if (!getEcoreDataType().getETypeParameters().isEmpty()) { result += "<"; for (Iterator<ETypeParameter> i = getEcoreDataType().getETypeParameters().iterator(); i.hasNext(); ) { i.next(); result += "?"; if (i.hasNext()) { result += ", "; } } result += ">"; } } return result; } @Override public String getImportedBoundedWildcardInstanceClassName() { String result = getImportedInstanceClassName(); if (getEffectiveComplianceLevel().getValue() >= GenJDKLevel.JDK50) { if (getEffectiveItemType() != null) { result += "<? extends " + getEffectiveItemType().getObjectType().getImportedParameterizedInstanceClassName() + ">"; } else if (!getEcoreDataType().getETypeParameters().isEmpty()) { result += "<"; for (Iterator<ETypeParameter> i = getEcoreDataType().getETypeParameters().iterator(); i.hasNext(); ) { i.next(); result += "?"; if (i.hasNext()) { result += ", "; } } result += ">"; } } return result; } public String getImportedParameterizedObjectInstanceClassName() { boolean erased = getEffectiveComplianceLevel().getValue() < GenJDKLevel.JDK50; String result = getImportedType(null, getEcoreDataType(), true, erased); if (!erased) { if (getEffectiveItemType() != null) { result += "<" + getEffectiveItemType().getObjectType().getImportedParameterizedInstanceClassName() + ">"; } else if (!getEcoreDataType().getETypeParameters().isEmpty()) { result += "<"; for (Iterator<ETypeParameter> i = getEcoreDataType().getETypeParameters().iterator(); i.hasNext(); ) { i.next(); result += "?"; if (i.hasNext()) { result += ", "; } } result += ">"; } } return result; } public String getObjectInstanceClassName() { return getImportedType(null, getEcoreDataType(), true, true); } public boolean isSerializable() { return getEcoreDataType().isSerializable(); } public String getSerializableFlag() { String result = !getEcoreDataType().isSerializable() ? "!" : ""; return result + "IS_SERIALIZABLE"; } public String getGeneratedInstanceClassFlag() { String result = this instanceof GenEnum || getBaseType() instanceof GenEnum ? "" : "!"; return result + "IS_GENERATED_INSTANCE_CLASS"; } public boolean isPrimitiveType() { return isPrimitiveType(getEcoreDataType()); } public boolean isArrayType() { String instanceClassName = getEcoreDataType().getInstanceClassName(); return instanceClassName != null && instanceClassName.indexOf('[') != -1; } public boolean isObjectType() { EDataType eDataType = getEcoreDataType(); return "java.lang.Object".equals(eDataType.getInstanceClassName()) || isRemappedXMLType(eDataType); } public String getPrimitiveValueFunction() { Class<?> instanceClass = getEcoreDataType().getInstanceClass(); if (instanceClass == java.lang.Boolean.TYPE) return "booleanValue"; if (instanceClass == java.lang.Byte.TYPE) return "byteValue"; if (instanceClass == java.lang.Character.TYPE) return "charValue"; if (instanceClass == java.lang.Double.TYPE) return "doubleValue"; if (instanceClass == java.lang.Float.TYPE) return "floatValue"; if (instanceClass == java.lang.Integer.TYPE) return "intValue"; if (instanceClass == java.lang.Long.TYPE) return "longValue"; if (instanceClass == java.lang.Short.TYPE) return "shortValue"; return null; } @Override public String getModelInfo() { StringBuffer result = new StringBuffer(); EDataType eDataType = getEcoreDataType(); if (eDataType.eIsSet(EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS_NAME) || eDataType.eIsSet(EcorePackage.Literals.ECLASSIFIER__INSTANCE_TYPE_NAME)) { appendModelSetting(result, "instanceClass", getRawQualifiedInstanceClassName()); } if (!isSerializable()) { appendModelSetting(result, "serializeable", "false"); } if (!getGenTypeParameters().isEmpty()) { StringBuilder typeParameterNames = new StringBuilder(); for (Iterator<GenTypeParameter> i = getGenTypeParameters().iterator(); i.hasNext(); ) { typeParameterNames.append(i.next().getName()); if (i.hasNext()) { typeParameterNames.append(' '); } } appendModelSetting(result, "typeParameters", typeParameterNames.toString()); for (GenTypeParameter genTypeParameter : getGenTypeParameters()) { String info = genTypeParameter.getQualifiedModelInfo(); if (info.length() != 0) { result.append(info); result.append(' '); } } } appendAnnotationInfo(result, getEcoreDataType()); return result.toString().trim(); } public GenDataType getBaseType() { EDataType baseType = getExtendedMetaData().getBaseType(getEcoreDataType()); return baseType == null ? null : (GenDataType)findGenClassifier(baseType); } public GenDataType getItemType() { EDataType itemType = getExtendedMetaData().getItemType(getEcoreDataType()); return itemType == null ? null : (GenDataType)findGenClassifier(itemType); } public GenDataType getEffectiveItemType() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { EDataType itemType = getExtendedMetaData().getItemType(eDataType); if (itemType != null) { return (GenDataType)findGenClassifier(itemType); } } return null; } public List<GenDataType> getMemberTypes() { List<GenDataType> result = new ArrayList<GenDataType>(); for (EDataType memberType : getExtendedMetaData().getMemberTypes(getEcoreDataType())) { result.add((GenDataType)findGenClassifier(memberType)); } return result; } public List<GenDataType> getEffectiveMemberTypes() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { List<GenDataType> result = new ArrayList<GenDataType>(); for (EDataType memberType : getExtendedMetaData().getMemberTypes(eDataType)) { result.add((GenDataType)findGenClassifier(memberType)); } if (!result.isEmpty()) { return result; } } return null; } public GenDataType getObjectType() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); EDataType eDataType = getEcoreDataType(); EClassifier eClassifier = extendedMetaData.getType(eDataType.getEPackage(), extendedMetaData.getName(eDataType) + ":Object"); if (eClassifier instanceof EDataType) { GenDataType result = findGenDataType((EDataType)eClassifier); if (result != null) { return result; } } return this; } public String getMinLiteral() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { String min = extendedMetaData.getMinExclusiveFacet(eDataType); if (min != null) { return min; } min = extendedMetaData.getMinInclusiveFacet(eDataType); if (min != null) { return min; } } return null; } public boolean isMinInclusive() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { String min = extendedMetaData.getMinExclusiveFacet(eDataType); if (min != null) { return false; } min = extendedMetaData.getMinInclusiveFacet(eDataType); if (min != null) { return true; } } return true; } public String getMaxLiteral() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { String max = extendedMetaData.getMaxExclusiveFacet(eDataType); if (max != null) { return max; } max = extendedMetaData.getMaxInclusiveFacet(eDataType); if (max != null) { return max; } } return null; } public boolean isMaxInclusive() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { String max = extendedMetaData.getMaxExclusiveFacet(eDataType); if (max != null) { return false; } max = extendedMetaData.getMaxInclusiveFacet(eDataType); if (max != null) { return true; } } return true; } public String getLengthAccessorFunction() { if (isArrayType()) { return "length"; } else if ("java.lang.String".equals(getEcoreDataType().getInstanceClassName())) { return "length()"; } else { return "size()"; } } public int getMinLength() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { int minLength = extendedMetaData.getMinLengthFacet(eDataType); if (minLength != -1) { return minLength; } minLength = extendedMetaData.getLengthFacet(eDataType); if (minLength != -1) { return minLength; } } return -1; } public int getMaxLength() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { int maxLength = extendedMetaData.getMaxLengthFacet(eDataType); if (maxLength != -1) { return maxLength; } maxLength = extendedMetaData.getLengthFacet(eDataType); if (maxLength != -1) { return maxLength; } } return -1; } public int getTotalDigits() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { int totalDigits = extendedMetaData.getTotalDigitsFacet(eDataType); if (totalDigits != -1) { if (validTotalDigits(eDataType, totalDigits)) { return totalDigits; } else { return -1; } } } return -1; } protected boolean validTotalDigits(EDataType eDataType, int totalDigits) { if (totalDigits > 0) { if (eDataType.getInstanceClassName() == "java.math.BigDecimal") { return true; } else { StringBuilder literal = new StringBuilder("1"); for (int digitCount = totalDigits; digitCount > 0; --digitCount) { literal.append("0"); } return !"".equals(getStaticValue(literal.toString())) && !"".equals(getStaticValue(literal.insert(0, "-").toString())); } } else { return false; } } public int getFractionDigits() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { int fractionDigits = extendedMetaData.getFractionDigitsFacet(eDataType); if (fractionDigits != -1) { return fractionDigits; } } return -1; } public List<String> getEnumerationLiterals() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { List<String> literals = extendedMetaData.getEnumerationFacet(eDataType); if (!literals.isEmpty()) { return literals; } } return Collections.emptyList(); } public String getWhiteSpace() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { int whiteSpace = extendedMetaData.getWhiteSpaceFacet(eDataType); if (whiteSpace != ExtendedMetaData.UNSPECIFIED_WHITE_SPACE) { return ExtendedMetaData.WHITE_SPACE_KINDS[whiteSpace]; } } return ExtendedMetaData.WHITE_SPACE_KINDS[ExtendedMetaData.UNSPECIFIED_WHITE_SPACE]; } protected static final List<String> xmlCalendarTypes = Arrays.asList (new String[] { "date", "dateTime", "gDay", "gMonth", "gMonthDay", "gYear", "gYearMonth", "time" }); public boolean isXMLCalendar() { return isDerivedType(getEcoreDataType(), XMLTypePackage.eNS_URI, null, xmlCalendarTypes); } public boolean isXMLDuration() { return isDerivedType(getEcoreDataType(), XMLTypePackage.eNS_URI, "duration", null); } public boolean isXMLBoolean() { return isDerivedType(getEcoreDataType(), XMLTypePackage.eNS_URI, "boolean", null); } public List<List<String>> getPatterns() { List<List<String>> result = new ArrayList<List<String>>(); ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { List<String> patterns = extendedMetaData.getPatternFacet(eDataType); if (!patterns.isEmpty()) { List<String> literals = new ArrayList<String>(); for (String pattern : patterns) { literals.add(Literals.toLiteral(pattern)); } result.add(literals); } } return result; } public void initialize(EDataType eDataType) { if (eDataType != getEcoreDataType()) { setEcoreDataType(eDataType); } List<ETypeParameter> typeParameters = eDataType.getETypeParameters(); LOOP: for (int i = 0; i < typeParameters.size(); ++i) { ETypeParameter typeParameter = typeParameters.get(i); for (int j = 0; j < getGenTypeParameters().size(); ++j) { GenTypeParameter genTypeParameter = getGenTypeParameters().get(j); if (genTypeParameter.getEcoreTypeParameter() == typeParameter) { genTypeParameter.initialize(typeParameter); if (i != j) { getGenTypeParameters().move(i, j); } continue LOOP; } } GenTypeParameter genTypeParameter = getGenModel().createGenTypeParameter(); getGenTypeParameters().add(genTypeParameter); genTypeParameter.initialize(typeParameter); } } public boolean reconcile(GenDataType oldGenDataTypeVersion) { if (getEcoreDataType().getName().equals(oldGenDataTypeVersion.getEcoreDataType().getName())) { for (int i = 0, size = Math.min(getGenTypeParameters().size(), oldGenDataTypeVersion.getGenTypeParameters().size()); i < size; i++) { GenTypeParameter genTypeParameter = getGenTypeParameters().get(i); GenTypeParameter oldGenTypeParameterVersion = oldGenDataTypeVersion.getGenTypeParameters().get(i); genTypeParameter.reconcile(oldGenTypeParameterVersion); } reconcileSettings(oldGenDataTypeVersion); return true; } else { return false; } } protected void reconcileSettings(GenDataType oldGenDataTypeVersion) { reconcileGenAnnotations(oldGenDataTypeVersion); } public boolean reconcile() { try { EDataType eDataType = getEcoreDataType(); if (eDataType == null || eDataType.eIsProxy() || eDataType.eResource() == null) { return false; } else { for (Iterator<GenTypeParameter> i = getGenTypeParameters().iterator(); i.hasNext(); ) { GenTypeParameter genTypeParameter = i.next(); if (!genTypeParameter.reconcile()) { i.remove(); } } return true; } } catch (RuntimeException exception) { return false; } } @Override public List<String> getGenConstraints() { List<String> constraints = new UniqueEList<String>(super.getGenConstraints()); ExtendedMetaData extendedMetaData = getExtendedMetaData(); EDataType eDataType = getEcoreDataType(); // White space is not a constraint; it should affect createFromString only. // // if (extendedMetaData.getWhiteSpaceFacet(eDataType) != ExtendedMetaData.UNSPECIFIED_WHITE_SPACE) // { // constraints.add("WhiteSpace"); // } if (!extendedMetaData.getEnumerationFacet(eDataType).isEmpty()) { constraints.add("Enumeration"); } if (!extendedMetaData.getPatternFacet(eDataType).isEmpty()) { constraints.add("Pattern"); } if (validTotalDigits(eDataType, extendedMetaData.getTotalDigitsFacet(eDataType))) { constraints.add("TotalDigits"); } if (extendedMetaData.getFractionDigitsFacet(eDataType) != -1) { constraints.add("FractionDigits"); } if (extendedMetaData.getLengthFacet(eDataType) != -1) { constraints.add("MinLength"); constraints.add("MaxLength"); } if (extendedMetaData.getMinLengthFacet(eDataType) != -1) { constraints.add("MinLength"); } if (extendedMetaData.getMaxLengthFacet(eDataType) != -1) { constraints.add("MaxLength"); } if (extendedMetaData.getMinExclusiveFacet(eDataType) != null || extendedMetaData.getMinInclusiveFacet(eDataType) != null) { constraints.add("Min"); } if (extendedMetaData.getMaxExclusiveFacet(eDataType) != null || extendedMetaData.getMaxInclusiveFacet(eDataType) != null) { constraints.add("Max"); } if (getItemType() != null) { constraints.add("ItemType"); } if (!getMemberTypes().isEmpty()) { constraints.add("MemberTypes"); } return constraints; } @Override public List<String> getAllGenConstraints() { List<GenDataType> allBaseTypes = new ArrayList<GenDataType>(); if (getExtendedMetaData().getEnumerationFacet(getEcoreDataType()).isEmpty()) { for (GenDataType baseType = getBaseType(); baseType != null; baseType = baseType.getBaseType()) { allBaseTypes.add(baseType); if (!getExtendedMetaData().getEnumerationFacet(baseType.getEcoreDataType()).isEmpty()) { break; } } } return collectGenConstraints(allBaseTypes, getGenConstraints(), null); } @Override public GenClassifier getConstraintImplementor(String constraint) { for (GenDataType baseType = this; baseType != null; baseType = baseType.getBaseType()) { if (baseType.getGenConstraints().contains(constraint)) { return baseType; } } return null; } public GenClassifier getConstraintDelegate(String constraint) { for (GenDataType baseType = getBaseType(); baseType != null; baseType = baseType.getBaseType()) { if (baseType.getGenConstraints().contains(constraint)) { return baseType; } } return null; } /** * First follows base types in extended metadata, returning the first data type from Ecore or XMLTypes encountered. * In none, looks for a serializable Ecore data type that represents the Java type. * This Ecore type matching is unfortunately not so great, but required for backwards compatibility. */ EDataType getBasicType() { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType eDataType = getEcoreDataType(); eDataType != null; eDataType = extendedMetaData.getBaseType(eDataType)) { String namespace = extendedMetaData.getNamespace(eDataType); if (EcorePackage.eNS_URI.equals(namespace)) { if (eDataType.getEPackage() != EcorePackage.eINSTANCE) { return (EDataType)EcorePackage.eINSTANCE.getEClassifier(eDataType.getName()); } return eDataType; } if (XMLTypePackage.eNS_URI.equals(namespace)) { if (eDataType.getEPackage() != XMLTypePackage.eINSTANCE) { return (EDataType)XMLTypePackage.eINSTANCE.getEClassifier(eDataType.getName()); } return eDataType; } } String instanceClassName = getEcoreDataType().getInstanceClassName(); for (EClassifier eClassifier : EcorePackage.eINSTANCE.getEClassifiers()) { if (eClassifier instanceof EDataType && eClassifier.getInstanceClassName().equals(instanceClassName)) { EDataType eDataType = (EDataType)eClassifier; if (eDataType.isSerializable()) { return eDataType; } } } return null; } boolean useFactoryFor(EDataType eDataType) { String nsURI = eDataType.getEPackage().getNsURI(); if (XMLTypePackage.eNS_URI.equals(nsURI)) { // Some XML types declare nebulous Object mappings. // They actually map to internal types that shouldn't be generated into code. // String name = eDataType.getName(); return "Date".equals(name) || "DateTime".equals(name) || "Duration".equals(name) || "GDay".equals(name) || "GMonth".equals(name) || "GMonthDay".equals(name) || "GYear".equals(name) || "GYearMonth".equals(name) || "NOTATION".equals(name) || "QName".equals(name) || "Time".equals(name) || "ENTITIES".equals(name) || "ENTITIESBASE".equals(name) || "IDREFS".equals(name) || "IDREFSBase".equals(name) || "NMTOKENS".equals(name) || "NMTOKENSBase".equals(name); } else if (EcorePackage.eNS_URI.equals(nsURI)) { // EDate is far too often overridden to provide a different mapping, and therefore the default is somewhat obscure. // So, it's best to delegate to the factory. // if ("EDate".equals(eDataType.getName())) { return true; } else if ("EJavaObject".equals(eDataType.getName())) { ExtendedMetaData extendedMetaData = getExtendedMetaData(); for (EDataType base = getEcoreDataType(); base != null; base = extendedMetaData.getBaseType(base)) { if (!extendedMetaData.getMemberTypes(base).isEmpty()) { return true; } } } return false; } return true; } public String getStaticValue(String literal) { return getStaticValue(literal, true); } public String getStaticValue(String literal, boolean includeCast) { EDataType eDataType = getEcoreDataType(); if (eDataType instanceof EEnum) { GenEnum genEnum = findGenEnum((EEnum)eDataType); if (genEnum != null) { return genEnum.getStaticValue(literal); } } if (!hasConversionDelegate()) { // If there is a base XML or Ecore type, use one of the two corresponding built-in factories to create a value from the literal string. // EDataType base = getBasicType(); if (base != null && !useFactoryFor(base)) { Object value = isPrimitiveType() ? base.getDefaultValue() : null; if (literal != null) { try { value = EcoreUtil.createFromString(base, literal); } catch (Exception e) { return ""; // cause a syntax error } } // Get the Java literal expression for the value. // if (value == null) return "null"; Class<?> typeClass = getInstanceClass(base); return Literals.toLiteral(value, typeClass != null && !typeClass.isPrimitive(), getGenModel()); } } // Otherwise, produce an expression that uses the appropriate factory to create a value from the literal. // if (literal == null) return "null"; StringBuilder result = new StringBuilder(getGenPackage().getQualifiedEFactoryInstanceAccessor()); result.append(".createFromString("); result.append(getGenPackage().getImportedPackageInterfaceName()); result.append(".eINSTANCE.get"); result.append(getName()); result.append("(), "); result.append(Literals.toStringLiteral(literal, getGenModel())); result.append(')'); // If the type isn't Object, we need to cast. If it's a primitive, we need to unbox. // if (includeCast ? !isObjectType() : isPrimitiveType()) { StringBuilder cast = new StringBuilder(); if (isPrimitiveType()) { cast.append("(("); cast.append(getObjectInstanceClassName()); cast.append(')'); cast.append(result); cast.append(")."); cast.append(getPrimitiveValueFunction()); cast.append("()"); } else { cast.append('('); cast.append(getImportedParameterizedInstanceClassName()); cast.append(')'); cast.append(result); } result = cast; } return result.toString(); } protected String getCreatorBody() { EDataType eDataType = getEcoreDataType(); EAnnotation eAnnotation = eDataType.getEAnnotation(GenModelPackage.eNS_URI); return eAnnotation == null ? null : (String)eAnnotation.getDetails().get("create"); } public boolean hasCreatorBody() { return getCreatorBody() != null; } public String getCreatorBody(String indentation) { return indentAndImport(getCreatorBody(), indentation); } public boolean hasConversionDelegate() { List<String> conversionDelegates = EcoreUtil.getConversionDelegates(getGenPackage().getEcorePackage()); if (!conversionDelegates.isEmpty()) { EDataType eDataType = getEcoreDataType(); for (String eDataTypeDelegateURI : conversionDelegates) { if (eDataType.getEAnnotation(eDataTypeDelegateURI) != null) { return true; } } } return false; } protected String getConverterBody() { EDataType eDataType = getEcoreDataType(); EAnnotation eAnnotation = eDataType.getEAnnotation(GenModelPackage.eNS_URI); return eAnnotation == null ? null : (String)eAnnotation.getDetails().get("convert"); } public boolean hasConverterBody() { return getConverterBody() != null; } public String getConverterBody(String indentation) { return indentAndImport(getConverterBody(), indentation); } }