diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java | 1278 |
1 files changed, 639 insertions, 639 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java index fc6098ca79..7afd0bc65b 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java @@ -1,639 +1,639 @@ -/* - * Copyright (c) 2004 - 2011 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 - * Stefan Winkler - Bug 332912 - Caching subtype-relationships in the CDOPackageRegistry - * Erdal Karaca - added support for HASHMAP CDO Type - */ -package org.eclipse.emf.cdo.common.model; - -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.revision.CDORevision; -import org.eclipse.emf.cdo.internal.common.bundle.OM; -import org.eclipse.emf.cdo.internal.common.messages.Messages; -import org.eclipse.emf.cdo.internal.common.model.CDOClassInfoImpl; -import org.eclipse.emf.cdo.internal.common.model.CDOPackageInfoImpl; -import org.eclipse.emf.cdo.internal.common.model.CDOPackageUnitImpl; -import org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl; - -import org.eclipse.net4j.util.io.ExtendedDataInput; -import org.eclipse.net4j.util.io.ExtendedDataOutput; - -import org.eclipse.emf.common.notify.Adapter; -import org.eclipse.emf.common.util.EList; -import org.eclipse.emf.common.util.Enumerator; -import org.eclipse.emf.common.util.TreeIterator; -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.EEnumLiteral; -import org.eclipse.emf.ecore.EGenericType; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EPackage; -import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.ecore.EcorePackage; -import org.eclipse.emf.ecore.InternalEObject; -import org.eclipse.emf.ecore.resource.ResourceSet; -import org.eclipse.emf.ecore.util.EcoreUtil; -import org.eclipse.emf.ecore.util.FeatureMap; -import org.eclipse.emf.ecore.util.FeatureMapUtil; - -import java.io.IOException; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Various static helper methods for dealing with CDO meta models. - * - * @author Eike Stepper - * @since 2.0 - * @apiviz.uses {@link CDOType} - - provides - */ -public final class CDOModelUtil implements CDOModelConstants -{ - private static CDOType[] coreTypes; - - static - { - List<CDOType> types = new ArrayList<CDOType>(); - registerCoreType(types, EcorePackage.eINSTANCE.getEBigDecimal(), CDOType.BIG_DECIMAL); - registerCoreType(types, EcorePackage.eINSTANCE.getEBigInteger(), CDOType.BIG_INTEGER); - registerCoreType(types, EcorePackage.eINSTANCE.getEBooleanObject(), CDOType.BOOLEAN_OBJECT); - registerCoreType(types, EcorePackage.eINSTANCE.getEBoolean(), CDOType.BOOLEAN); - registerCoreType(types, EcorePackage.eINSTANCE.getEByteArray(), CDOType.BYTE_ARRAY); - registerCoreType(types, EcorePackage.eINSTANCE.getEByteObject(), CDOType.BYTE_OBJECT); - registerCoreType(types, EcorePackage.eINSTANCE.getEByte(), CDOType.BYTE); - registerCoreType(types, EcorePackage.eINSTANCE.getECharacterObject(), CDOType.CHARACTER_OBJECT); - registerCoreType(types, EcorePackage.eINSTANCE.getEChar(), CDOType.CHAR); - registerCoreType(types, EcorePackage.eINSTANCE.getEDate(), CDOType.DATE); - registerCoreType(types, EcorePackage.eINSTANCE.getEDoubleObject(), CDOType.DOUBLE_OBJECT); - registerCoreType(types, EcorePackage.eINSTANCE.getEDouble(), CDOType.DOUBLE); - registerCoreType(types, EcorePackage.eINSTANCE.getEFloatObject(), CDOType.FLOAT_OBJECT); - registerCoreType(types, EcorePackage.eINSTANCE.getEFloat(), CDOType.FLOAT); - registerCoreType(types, EcorePackage.eINSTANCE.getEIntegerObject(), CDOType.INTEGER_OBJECT); - registerCoreType(types, EcorePackage.eINSTANCE.getEInt(), CDOType.INT); - registerCoreType(types, EcorePackage.eINSTANCE.getEJavaClass(), null); - registerCoreType(types, EcorePackage.eINSTANCE.getEJavaObject(), null); - registerCoreType(types, EcorePackage.eINSTANCE.getELongObject(), CDOType.LONG_OBJECT); - registerCoreType(types, EcorePackage.eINSTANCE.getELong(), CDOType.LONG); - registerCoreType(types, EcorePackage.eINSTANCE.getEShortObject(), CDOType.SHORT_OBJECT); - registerCoreType(types, EcorePackage.eINSTANCE.getEShort(), CDOType.SHORT); - registerCoreType(types, EcorePackage.eINSTANCE.getEString(), CDOType.STRING); - coreTypes = types.toArray(new CDOType[types.size()]); - } - - private static void registerCoreType(List<CDOType> types, EClassifier classifier, CDOType type) - { - int index = classifier.getClassifierID(); - while (index >= types.size()) - { - types.add(null); - } - - types.set(index, type); - } - - private CDOModelUtil() - { - } - - /** - * @since 2.0 - */ - public static boolean isCorePackage(EPackage ePackage) - { - return CDOModelConstants.CORE_PACKAGE_URI.equals(ePackage.getNsURI()); - } - - /** - * @since 2.0 - */ - public static boolean isRoot(EClass eClass) - { - return isCorePackage(eClass.getEPackage()) && CDOModelConstants.ROOT_CLASS_NAME.equals(eClass.getName()); - } - - /** - * @since 2.0 - */ - public static boolean isResourcePackage(EPackage ePackage) - { - return CDOModelConstants.RESOURCE_PACKAGE_URI.equals(ePackage.getNsURI()); - } - - /** - * @since 2.0 - */ - public static boolean isResource(EClass eClass) - { - return isResourcePackage(eClass.getEPackage()) && CDOModelConstants.RESOURCE_CLASS_NAME.equals(eClass.getName()); - } - - /** - * @since 2.0 - */ - public static boolean isResourceFolder(EClass eClass) - { - return isResourcePackage(eClass.getEPackage()) - && CDOModelConstants.RESOURCE_FOLDER_CLASS_NAME.equals(eClass.getName()); - } - - /** - * @since 2.0 - */ - public static boolean isResourceNode(EClass eClass) - { - return isResourcePackage(eClass.getEPackage()) - && (CDOModelConstants.RESOURCE_NODE_CLASS_NAME.equals(eClass.getName()) - || CDOModelConstants.RESOURCE_CLASS_NAME.equals(eClass.getName()) || CDOModelConstants.RESOURCE_FOLDER_CLASS_NAME - .equals(eClass.getName())); - } - - /** - * @since 4.0 - */ - public static boolean isTypesPackage(EPackage ePackage) - { - return CDOModelConstants.TYPES_PACKAGE_URI.equals(ePackage.getNsURI()); - } - - /** - * @since 2.0 - */ - public static boolean isSystemPackage(EPackage ePackage) - { - return isCorePackage(ePackage) || isResourcePackage(ePackage) || isTypesPackage(ePackage); - } - - /** - * @since 4.0 - */ - public static boolean isLob(EClassifier eClassifier) - { - return isTypesPackage(eClassifier.getEPackage()) - && (CDOModelConstants.BLOB_CLASS_NAME.equals(eClassifier.getName()) || CDOModelConstants.CLOB_CLASS_NAME - .equals(eClassifier.getName())); - } - - /** - * @since 2.0 - */ - public static CDOType getType(EStructuralFeature feature) - { - if (FeatureMapUtil.isFeatureMap(feature)) - { - return CDOType.FEATURE_MAP_ENTRY; - } - - return CDOModelUtil.getType(feature.getEType()); - } - - /** - * @since 4.0 - */ - public static CDOType getType(byte typeID) - { - return CDOTypeImpl.getType(typeID); - } - - /** - * @since 2.0 - */ - public static CDOType getType(EClassifier classifier) - { - if (classifier instanceof EClass) - { - return CDOType.OBJECT; - } - - if (classifier instanceof EEnum) - { - return CDOType.ENUM_ORDINAL; - } - - EDataType eDataType = (EDataType)classifier; - EPackage ePackage = eDataType.getEPackage(); - - if (isCorePackage(ePackage)) - { - CDOType type = getCoreType(eDataType); - if (type != null) - { - return type; - } - } - else if (isTypesPackage(ePackage)) - { - String name = eDataType.getName(); - if (CDOModelConstants.BLOB_CLASS_NAME.equals(name)) - { - return CDOType.BLOB; - } - - if (CDOModelConstants.CLOB_CLASS_NAME.equals(name)) - { - return CDOType.CLOB; - } - - throw new IllegalArgumentException("Illegal data type: " + eDataType); - } - - return CDOType.CUSTOM; - } - - /** - * Core types includes also complex data like EAnnotation, and EEnum - * - * @since 2.0 - */ - public static CDOType getCoreType(EClassifier eDataType) - { - int index = eDataType.getClassifierID(); - if (0 <= index && index < coreTypes.length) - { - return coreTypes[index]; - } - - return null; - } - - /** - * @since 2.0 - */ - public static CDOType getPrimitiveType(Class<? extends Object> primitiveType) - { - if (primitiveType == String.class) - { - return CDOType.STRING; - } - - if (primitiveType == Boolean.class) - { - return CDOType.BOOLEAN; - } - - if (primitiveType == Integer.class) - { - return CDOType.INT; - } - - if (primitiveType == Double.class) - { - return CDOType.DOUBLE; - } - - if (primitiveType == Float.class) - { - return CDOType.FLOAT; - } - - if (primitiveType == Long.class) - { - return CDOType.LONG; - } - - if (primitiveType == Date.class) - { - return CDOType.DATE; - } - - if (primitiveType == Byte.class) - { - return CDOType.BYTE; - } - - if (primitiveType == Character.class) - { - return CDOType.CHAR; - } - - if (primitiveType == Object[].class) - { - return CDOType.OBJECT_ARRAY; - } - - if (EEnumLiteral.class.isAssignableFrom(primitiveType) || Enumerator.class.isAssignableFrom(primitiveType)) - { - return CDOType.ENUM_LITERAL; - } - - if (Map.class.isAssignableFrom(primitiveType)) - { - return CDOType.MAP; - } - - throw new IllegalArgumentException(MessageFormat.format(Messages.getString("CDOModelUtil.7"), primitiveType)); //$NON-NLS-1$ - } - - /** - * @since 4.0 - */ - public static CDOType getTypeOfObject(Object object) - { - if (object instanceof BigDecimal) - { - return CDOType.BIG_DECIMAL; - } - - if (object instanceof BigInteger) - { - return CDOType.BIG_INTEGER; - } - - if (object instanceof Boolean) - { - return CDOType.BOOLEAN_OBJECT; - } - - if (object instanceof Byte) - { - return CDOType.BYTE_OBJECT; - } - - if (object instanceof byte[]) - { - return CDOType.BYTE_ARRAY; - } - - if (object instanceof Character) - { - return CDOType.CHARACTER_OBJECT; - } - - if (object instanceof Date) - { - return CDOType.DATE; - } - - if (object instanceof Double) - { - return CDOType.DOUBLE_OBJECT; - } - - if (object instanceof EEnumLiteral) - { - return CDOType.ENUM_LITERAL; - } - - if (object instanceof FeatureMap.Entry) - { - return CDOType.FEATURE_MAP_ENTRY; - } - - if (object instanceof Float) - { - return CDOType.FLOAT_OBJECT; - } - - if (object instanceof Integer) - { - return CDOType.INTEGER_OBJECT; - } - - if (object instanceof Long) - { - return CDOType.LONG_OBJECT; - } - - if (object instanceof Short) - { - return CDOType.SHORT_OBJECT; - } - - if (object instanceof String) - { - return CDOType.STRING; - } - - if (object instanceof CDOID || object instanceof CDORevision) - { - return CDOType.OBJECT; - } - - if (object == null) - { - return CDOType.OBJECT; - } - - throw new IllegalArgumentException("Object type " + object.getClass().getName() + " is not supported."); - } - - /** - * @since 2.0 - */ - public static CDOPackageInfo getPackageInfo(Object value, CDOPackageRegistry packageRegistry) - { - if (value instanceof EPackage) - { - return packageRegistry.getPackageInfo((EPackage)value); - } - - if (value instanceof CDOPackageInfo) - { - CDOPackageInfo packageInfo = (CDOPackageInfo)value; - if (packageInfo.getPackageUnit().getPackageRegistry() == packageRegistry) - { - return packageInfo; - } - } - - return null; - } - - /** - * @since 2.0 - */ - public static CDOClassInfo getClassInfo(EClass eClass) - { - synchronized (eClass) - { - EList<Adapter> adapters = eClass.eAdapters(); - CDOClassInfo classInfo = (CDOClassInfo)EcoreUtil.getAdapter(adapters, CDOClassInfo.class); - if (classInfo == null) - { - classInfo = new CDOClassInfoImpl(); - adapters.add(classInfo); - } - - return classInfo; - } - } - - /** - * @since 2.0 - */ - public static EStructuralFeature[] getAllPersistentFeatures(EClass eClass) - { - CDOClassInfo classInfo = getClassInfo(eClass); - return classInfo.getAllPersistentFeatures(); - } - - /** - * @since 2.0 - */ - public static CDOPackageUnit createPackageUnit() - { - return new CDOPackageUnitImpl(); - } - - /** - * @since 2.0 - */ - public static CDOPackageInfo createPackageInfo() - { - return new CDOPackageInfoImpl(); - } - - /** - * @since 3.0 - */ - public static EPackage readPackage(ExtendedDataInput in, ResourceSet resourceSet, boolean lookForResource) - throws IOException - { - String uri = in.readString(); - boolean zipped = in.readBoolean(); - byte[] bytes = in.readByteArray(); - return EMFUtil.createEPackage(uri, bytes, zipped, resourceSet, lookForResource); - } - - /** - * @since 2.0 - */ - public static void writePackage(ExtendedDataOutput out, EPackage ePackage, boolean zipped, - EPackage.Registry packageRegistry) throws IOException - { - checkCrossResourceURIs(ePackage); - - byte[] bytes = EMFUtil.getEPackageBytes(ePackage, zipped, packageRegistry); - out.writeString(ePackage.getNsURI()); - out.writeBoolean(zipped); - out.writeByteArray(bytes); - } - - /** - * @since 3.0 - */ - public static void checkCrossResourceURIs(EPackage ePackage) - { - TreeIterator<EObject> it = ePackage.eAllContents(); - while (it.hasNext()) - { - EObject e = it.next(); - for (EObject r : e.eCrossReferences()) - { - EObject refTarget = null; - - if (r.eIsProxy()) - { - String msg = "Package '%s' contains unresolved proxy '%s'"; - msg = String.format(msg, ePackage.getNsURI(), ((InternalEObject)r).eProxyURI()); - throw new IllegalStateException(msg); - } - - if (r.eResource() != null && r.eResource() != e.eResource()) - { - // It's a ref into another resource - EPackage pkg = null; - if (r instanceof EClassifier) - { - refTarget = r; - pkg = ((EClassifier)r).getEPackage(); - } - else if (r instanceof EStructuralFeature) - { - refTarget = r; - EStructuralFeature feature = (EStructuralFeature)r; - EClass ownerClass = (EClass)feature.eContainer(); - pkg = ownerClass.getEPackage(); - } - else if (r instanceof EGenericType) - { - EGenericType genType = (EGenericType)r; - EClassifier c = genType.getEClassifier(); - if (c != null) - { - refTarget = c; - pkg = c.getEPackage(); - } - } - - if (pkg == null) - { - continue; - } - - while (pkg.getESuperPackage() != null) - { - pkg = pkg.getESuperPackage(); - } - - String resourceURI = refTarget.eResource().getURI().toString(); - if (!resourceURI.toString().equals(pkg.getNsURI())) - { - String msg = "URI of the resource (%s) does not match the nsURI (%s) of the top-level package;\n" - + "this can be fixed by calling Resource.setURI(URI) after loading the packages,\n" - + "or by configuring a URI mapping from nsURI's to location URI's before loading the packages,\n" - + "and then loading them with their nsURI's"; - msg = String.format(msg, resourceURI, pkg.getNsURI()); - throw new IllegalStateException(msg); - } - } - } - } - } - - /** - * @since 4.0 - */ - public static Map<EClass, List<EClass>> getSubTypes(EPackage.Registry packageRegistry) - { - Map<EClass, List<EClass>> result = new HashMap<EClass, List<EClass>>(); - for (String nsURI : packageRegistry.keySet()) - { - EPackage ePackage = packageRegistry.getEPackage(nsURI); - getSubTypes(ePackage, result); - } - - return result; - } - - private static void getSubTypes(EPackage ePackage, Map<EClass, List<EClass>> result) - { - for (EClassifier classifier : ePackage.getEClassifiers()) - { - if (classifier instanceof EClass) - { - EClass eClass = (EClass)classifier; - for (EClass eSuperType : eClass.getEAllSuperTypes()) - { - if (eSuperType.eIsProxy()) - { - OM.LOG.warn("getSubTypes encountered a proxy EClass which will be ignored: " + eSuperType); - continue; - } - - List<EClass> list = result.get(eSuperType); - if (list == null) - { - list = new ArrayList<EClass>(); - result.put(eSuperType, list); - } - - list.add(eClass); - } - } - } - } -} +/*
+ * Copyright (c) 2004 - 2012 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
+ * Stefan Winkler - Bug 332912 - Caching subtype-relationships in the CDOPackageRegistry
+ * Erdal Karaca - added support for HASHMAP CDO Type
+ */
+package org.eclipse.emf.cdo.common.model;
+
+import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.cdo.internal.common.bundle.OM;
+import org.eclipse.emf.cdo.internal.common.messages.Messages;
+import org.eclipse.emf.cdo.internal.common.model.CDOClassInfoImpl;
+import org.eclipse.emf.cdo.internal.common.model.CDOPackageInfoImpl;
+import org.eclipse.emf.cdo.internal.common.model.CDOPackageUnitImpl;
+import org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl;
+
+import org.eclipse.net4j.util.io.ExtendedDataInput;
+import org.eclipse.net4j.util.io.ExtendedDataOutput;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.Enumerator;
+import org.eclipse.emf.common.util.TreeIterator;
+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.EEnumLiteral;
+import org.eclipse.emf.ecore.EGenericType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.FeatureMap;
+import org.eclipse.emf.ecore.util.FeatureMapUtil;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Various static helper methods for dealing with CDO meta models.
+ *
+ * @author Eike Stepper
+ * @since 2.0
+ * @apiviz.uses {@link CDOType} - - provides
+ */
+public final class CDOModelUtil implements CDOModelConstants
+{
+ private static CDOType[] coreTypes;
+
+ static
+ {
+ List<CDOType> types = new ArrayList<CDOType>();
+ registerCoreType(types, EcorePackage.eINSTANCE.getEBigDecimal(), CDOType.BIG_DECIMAL);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEBigInteger(), CDOType.BIG_INTEGER);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEBooleanObject(), CDOType.BOOLEAN_OBJECT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEBoolean(), CDOType.BOOLEAN);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEByteArray(), CDOType.BYTE_ARRAY);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEByteObject(), CDOType.BYTE_OBJECT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEByte(), CDOType.BYTE);
+ registerCoreType(types, EcorePackage.eINSTANCE.getECharacterObject(), CDOType.CHARACTER_OBJECT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEChar(), CDOType.CHAR);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEDate(), CDOType.DATE);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEDoubleObject(), CDOType.DOUBLE_OBJECT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEDouble(), CDOType.DOUBLE);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEFloatObject(), CDOType.FLOAT_OBJECT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEFloat(), CDOType.FLOAT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEIntegerObject(), CDOType.INTEGER_OBJECT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEInt(), CDOType.INT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEJavaClass(), null);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEJavaObject(), null);
+ registerCoreType(types, EcorePackage.eINSTANCE.getELongObject(), CDOType.LONG_OBJECT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getELong(), CDOType.LONG);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEShortObject(), CDOType.SHORT_OBJECT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEShort(), CDOType.SHORT);
+ registerCoreType(types, EcorePackage.eINSTANCE.getEString(), CDOType.STRING);
+ coreTypes = types.toArray(new CDOType[types.size()]);
+ }
+
+ private static void registerCoreType(List<CDOType> types, EClassifier classifier, CDOType type)
+ {
+ int index = classifier.getClassifierID();
+ while (index >= types.size())
+ {
+ types.add(null);
+ }
+
+ types.set(index, type);
+ }
+
+ private CDOModelUtil()
+ {
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static boolean isCorePackage(EPackage ePackage)
+ {
+ return CDOModelConstants.CORE_PACKAGE_URI.equals(ePackage.getNsURI());
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static boolean isRoot(EClass eClass)
+ {
+ return isCorePackage(eClass.getEPackage()) && CDOModelConstants.ROOT_CLASS_NAME.equals(eClass.getName());
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static boolean isResourcePackage(EPackage ePackage)
+ {
+ return CDOModelConstants.RESOURCE_PACKAGE_URI.equals(ePackage.getNsURI());
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static boolean isResource(EClass eClass)
+ {
+ return isResourcePackage(eClass.getEPackage()) && CDOModelConstants.RESOURCE_CLASS_NAME.equals(eClass.getName());
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static boolean isResourceFolder(EClass eClass)
+ {
+ return isResourcePackage(eClass.getEPackage())
+ && CDOModelConstants.RESOURCE_FOLDER_CLASS_NAME.equals(eClass.getName());
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static boolean isResourceNode(EClass eClass)
+ {
+ return isResourcePackage(eClass.getEPackage())
+ && (CDOModelConstants.RESOURCE_NODE_CLASS_NAME.equals(eClass.getName())
+ || CDOModelConstants.RESOURCE_CLASS_NAME.equals(eClass.getName()) || CDOModelConstants.RESOURCE_FOLDER_CLASS_NAME
+ .equals(eClass.getName()));
+ }
+
+ /**
+ * @since 4.0
+ */
+ public static boolean isTypesPackage(EPackage ePackage)
+ {
+ return CDOModelConstants.TYPES_PACKAGE_URI.equals(ePackage.getNsURI());
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static boolean isSystemPackage(EPackage ePackage)
+ {
+ return isCorePackage(ePackage) || isResourcePackage(ePackage) || isTypesPackage(ePackage);
+ }
+
+ /**
+ * @since 4.0
+ */
+ public static boolean isLob(EClassifier eClassifier)
+ {
+ return isTypesPackage(eClassifier.getEPackage())
+ && (CDOModelConstants.BLOB_CLASS_NAME.equals(eClassifier.getName()) || CDOModelConstants.CLOB_CLASS_NAME
+ .equals(eClassifier.getName()));
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static CDOType getType(EStructuralFeature feature)
+ {
+ if (FeatureMapUtil.isFeatureMap(feature))
+ {
+ return CDOType.FEATURE_MAP_ENTRY;
+ }
+
+ return CDOModelUtil.getType(feature.getEType());
+ }
+
+ /**
+ * @since 4.0
+ */
+ public static CDOType getType(byte typeID)
+ {
+ return CDOTypeImpl.getType(typeID);
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static CDOType getType(EClassifier classifier)
+ {
+ if (classifier instanceof EClass)
+ {
+ return CDOType.OBJECT;
+ }
+
+ if (classifier instanceof EEnum)
+ {
+ return CDOType.ENUM_ORDINAL;
+ }
+
+ EDataType eDataType = (EDataType)classifier;
+ EPackage ePackage = eDataType.getEPackage();
+
+ if (isCorePackage(ePackage))
+ {
+ CDOType type = getCoreType(eDataType);
+ if (type != null)
+ {
+ return type;
+ }
+ }
+ else if (isTypesPackage(ePackage))
+ {
+ String name = eDataType.getName();
+ if (CDOModelConstants.BLOB_CLASS_NAME.equals(name))
+ {
+ return CDOType.BLOB;
+ }
+
+ if (CDOModelConstants.CLOB_CLASS_NAME.equals(name))
+ {
+ return CDOType.CLOB;
+ }
+
+ throw new IllegalArgumentException("Illegal data type: " + eDataType);
+ }
+
+ return CDOType.CUSTOM;
+ }
+
+ /**
+ * Core types includes also complex data like EAnnotation, and EEnum
+ *
+ * @since 2.0
+ */
+ public static CDOType getCoreType(EClassifier eDataType)
+ {
+ int index = eDataType.getClassifierID();
+ if (0 <= index && index < coreTypes.length)
+ {
+ return coreTypes[index];
+ }
+
+ return null;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static CDOType getPrimitiveType(Class<? extends Object> primitiveType)
+ {
+ if (primitiveType == String.class)
+ {
+ return CDOType.STRING;
+ }
+
+ if (primitiveType == Boolean.class)
+ {
+ return CDOType.BOOLEAN;
+ }
+
+ if (primitiveType == Integer.class)
+ {
+ return CDOType.INT;
+ }
+
+ if (primitiveType == Double.class)
+ {
+ return CDOType.DOUBLE;
+ }
+
+ if (primitiveType == Float.class)
+ {
+ return CDOType.FLOAT;
+ }
+
+ if (primitiveType == Long.class)
+ {
+ return CDOType.LONG;
+ }
+
+ if (primitiveType == Date.class)
+ {
+ return CDOType.DATE;
+ }
+
+ if (primitiveType == Byte.class)
+ {
+ return CDOType.BYTE;
+ }
+
+ if (primitiveType == Character.class)
+ {
+ return CDOType.CHAR;
+ }
+
+ if (primitiveType == Object[].class)
+ {
+ return CDOType.OBJECT_ARRAY;
+ }
+
+ if (EEnumLiteral.class.isAssignableFrom(primitiveType) || Enumerator.class.isAssignableFrom(primitiveType))
+ {
+ return CDOType.ENUM_LITERAL;
+ }
+
+ if (Map.class.isAssignableFrom(primitiveType))
+ {
+ return CDOType.MAP;
+ }
+
+ throw new IllegalArgumentException(MessageFormat.format(Messages.getString("CDOModelUtil.7"), primitiveType)); //$NON-NLS-1$
+ }
+
+ /**
+ * @since 4.0
+ */
+ public static CDOType getTypeOfObject(Object object)
+ {
+ if (object instanceof BigDecimal)
+ {
+ return CDOType.BIG_DECIMAL;
+ }
+
+ if (object instanceof BigInteger)
+ {
+ return CDOType.BIG_INTEGER;
+ }
+
+ if (object instanceof Boolean)
+ {
+ return CDOType.BOOLEAN_OBJECT;
+ }
+
+ if (object instanceof Byte)
+ {
+ return CDOType.BYTE_OBJECT;
+ }
+
+ if (object instanceof byte[])
+ {
+ return CDOType.BYTE_ARRAY;
+ }
+
+ if (object instanceof Character)
+ {
+ return CDOType.CHARACTER_OBJECT;
+ }
+
+ if (object instanceof Date)
+ {
+ return CDOType.DATE;
+ }
+
+ if (object instanceof Double)
+ {
+ return CDOType.DOUBLE_OBJECT;
+ }
+
+ if (object instanceof EEnumLiteral)
+ {
+ return CDOType.ENUM_LITERAL;
+ }
+
+ if (object instanceof FeatureMap.Entry)
+ {
+ return CDOType.FEATURE_MAP_ENTRY;
+ }
+
+ if (object instanceof Float)
+ {
+ return CDOType.FLOAT_OBJECT;
+ }
+
+ if (object instanceof Integer)
+ {
+ return CDOType.INTEGER_OBJECT;
+ }
+
+ if (object instanceof Long)
+ {
+ return CDOType.LONG_OBJECT;
+ }
+
+ if (object instanceof Short)
+ {
+ return CDOType.SHORT_OBJECT;
+ }
+
+ if (object instanceof String)
+ {
+ return CDOType.STRING;
+ }
+
+ if (object instanceof CDOID || object instanceof CDORevision)
+ {
+ return CDOType.OBJECT;
+ }
+
+ if (object == null)
+ {
+ return CDOType.OBJECT;
+ }
+
+ throw new IllegalArgumentException("Object type " + object.getClass().getName() + " is not supported.");
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static CDOPackageInfo getPackageInfo(Object value, CDOPackageRegistry packageRegistry)
+ {
+ if (value instanceof EPackage)
+ {
+ return packageRegistry.getPackageInfo((EPackage)value);
+ }
+
+ if (value instanceof CDOPackageInfo)
+ {
+ CDOPackageInfo packageInfo = (CDOPackageInfo)value;
+ if (packageInfo.getPackageUnit().getPackageRegistry() == packageRegistry)
+ {
+ return packageInfo;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static CDOClassInfo getClassInfo(EClass eClass)
+ {
+ synchronized (eClass)
+ {
+ EList<Adapter> adapters = eClass.eAdapters();
+ CDOClassInfo classInfo = (CDOClassInfo)EcoreUtil.getAdapter(adapters, CDOClassInfo.class);
+ if (classInfo == null)
+ {
+ classInfo = new CDOClassInfoImpl();
+ adapters.add(classInfo);
+ }
+
+ return classInfo;
+ }
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static EStructuralFeature[] getAllPersistentFeatures(EClass eClass)
+ {
+ CDOClassInfo classInfo = getClassInfo(eClass);
+ return classInfo.getAllPersistentFeatures();
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static CDOPackageUnit createPackageUnit()
+ {
+ return new CDOPackageUnitImpl();
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static CDOPackageInfo createPackageInfo()
+ {
+ return new CDOPackageInfoImpl();
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static EPackage readPackage(ExtendedDataInput in, ResourceSet resourceSet, boolean lookForResource)
+ throws IOException
+ {
+ String uri = in.readString();
+ boolean zipped = in.readBoolean();
+ byte[] bytes = in.readByteArray();
+ return EMFUtil.createEPackage(uri, bytes, zipped, resourceSet, lookForResource);
+ }
+
+ /**
+ * @since 2.0
+ */
+ public static void writePackage(ExtendedDataOutput out, EPackage ePackage, boolean zipped,
+ EPackage.Registry packageRegistry) throws IOException
+ {
+ checkCrossResourceURIs(ePackage);
+
+ byte[] bytes = EMFUtil.getEPackageBytes(ePackage, zipped, packageRegistry);
+ out.writeString(ePackage.getNsURI());
+ out.writeBoolean(zipped);
+ out.writeByteArray(bytes);
+ }
+
+ /**
+ * @since 3.0
+ */
+ public static void checkCrossResourceURIs(EPackage ePackage)
+ {
+ TreeIterator<EObject> it = ePackage.eAllContents();
+ while (it.hasNext())
+ {
+ EObject e = it.next();
+ for (EObject r : e.eCrossReferences())
+ {
+ EObject refTarget = null;
+
+ if (r.eIsProxy())
+ {
+ String msg = "Package '%s' contains unresolved proxy '%s'";
+ msg = String.format(msg, ePackage.getNsURI(), ((InternalEObject)r).eProxyURI());
+ throw new IllegalStateException(msg);
+ }
+
+ if (r.eResource() != null && r.eResource() != e.eResource())
+ {
+ // It's a ref into another resource
+ EPackage pkg = null;
+ if (r instanceof EClassifier)
+ {
+ refTarget = r;
+ pkg = ((EClassifier)r).getEPackage();
+ }
+ else if (r instanceof EStructuralFeature)
+ {
+ refTarget = r;
+ EStructuralFeature feature = (EStructuralFeature)r;
+ EClass ownerClass = (EClass)feature.eContainer();
+ pkg = ownerClass.getEPackage();
+ }
+ else if (r instanceof EGenericType)
+ {
+ EGenericType genType = (EGenericType)r;
+ EClassifier c = genType.getEClassifier();
+ if (c != null)
+ {
+ refTarget = c;
+ pkg = c.getEPackage();
+ }
+ }
+
+ if (pkg == null)
+ {
+ continue;
+ }
+
+ while (pkg.getESuperPackage() != null)
+ {
+ pkg = pkg.getESuperPackage();
+ }
+
+ String resourceURI = refTarget.eResource().getURI().toString();
+ if (!resourceURI.toString().equals(pkg.getNsURI()))
+ {
+ String msg = "URI of the resource (%s) does not match the nsURI (%s) of the top-level package;\n"
+ + "this can be fixed by calling Resource.setURI(URI) after loading the packages,\n"
+ + "or by configuring a URI mapping from nsURI's to location URI's before loading the packages,\n"
+ + "and then loading them with their nsURI's";
+ msg = String.format(msg, resourceURI, pkg.getNsURI());
+ throw new IllegalStateException(msg);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @since 4.0
+ */
+ public static Map<EClass, List<EClass>> getSubTypes(EPackage.Registry packageRegistry)
+ {
+ Map<EClass, List<EClass>> result = new HashMap<EClass, List<EClass>>();
+ for (String nsURI : packageRegistry.keySet())
+ {
+ EPackage ePackage = packageRegistry.getEPackage(nsURI);
+ getSubTypes(ePackage, result);
+ }
+
+ return result;
+ }
+
+ private static void getSubTypes(EPackage ePackage, Map<EClass, List<EClass>> result)
+ {
+ for (EClassifier classifier : ePackage.getEClassifiers())
+ {
+ if (classifier instanceof EClass)
+ {
+ EClass eClass = (EClass)classifier;
+ for (EClass eSuperType : eClass.getEAllSuperTypes())
+ {
+ if (eSuperType.eIsProxy())
+ {
+ OM.LOG.warn("getSubTypes encountered a proxy EClass which will be ignored: " + eSuperType);
+ continue;
+ }
+
+ List<EClass> list = result.get(eSuperType);
+ if (list == null)
+ {
+ list = new ArrayList<EClass>();
+ result.put(eSuperType, list);
+ }
+
+ list.add(eClass);
+ }
+ }
+ }
+ }
+}
|