/* * Copyright (c) 2010-2012, 2016 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: * Martin Fluegge - initial API and implementation */ package org.eclipse.emf.cdo.tests; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.common.util.EMap; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EDataType; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.impl.EReferenceImpl; import java.util.HashMap; import java.util.List; import java.util.Map; import junit.framework.Test; import junit.framework.TestSuite; /** * Note! This class should never be attached to our the suites until this notification is removed. Otherwise the test * run will fail because this test cases is not yet integrated into our test framework! Only run this test as local * JUnit test case. * * @author Martin Fluegge */ @SuppressWarnings({ "unchecked", "rawtypes" }) public class MapDynamicTest extends MapTest { private EPackage dynamicPackage; private Map objects; private EStructuralFeature feature; private final EObject container; public MapDynamicTest(EObject mapContainer, EReference mapFeature, Map objects2, EPackage dynamicMapEPackge) { container = mapContainer; feature = mapFeature; objects = objects2; dynamicPackage = dynamicMapEPackge; super.setName(feature.getName() + "Test"); } @Override protected void runTest() throws Throwable { testMap(container, (EReference)feature, objects, dynamicPackage); } public static Test suite() throws Exception { TestSuite suite = new TestSuite(MapDynamicTest.class.getName()); EPackage dynamicMapEPackge = createPackage(); EFactory dynamicMapEFactoryInstance = dynamicMapEPackge.getEFactoryInstance(); for (EStructuralFeature mapFeature : mapContainerEClass.getEAllStructuralFeatures()) { EObject mapContainer = dynamicMapEFactoryInstance.create(mapContainerEClass); System.out.println(mapFeature); if (mapFeature.getName().endsWith("Map")) { Map objects = new HashMap(); List key = dummyData.get(getEDataType(mapFeature, "key")); List value = dummyData.get(getEDataType(mapFeature, "value")); System.out.println("Testing " + mapFeature.getName() + "key: " + key + " / value: " + value); for (int i = 0; i < 3; i++) { objects.put(key.get(i), value.get(i)); } // do the actual test suite.addTest(new MapDynamicTest(mapContainer, (EReference)mapFeature, objects, dynamicMapEPackge)); } } return suite; } private static EDataType getEDataType(EStructuralFeature feature, String type) throws Exception { EClass eType = (EClass)feature.getEType(); for (EStructuralFeature f : eType.getEAllStructuralFeatures()) { if (f.getName().equals(type)) { return (EDataType)f.getEType(); } } throw new Exception("Could not find " + type + " for " + feature); } private void testMap(EObject container, EReference feature, Map objects, EPackage epackage) throws Exception { boolean keyIsReference = false; boolean valueIsReference = false; boolean keyNotContained = false; boolean valueNotContained = false; String resourceName = "/test1" + count++; EClass eType = (EClass)feature.getEType(); for (EStructuralFeature f : eType.getEAllStructuralFeatures()) { if (f.getName().equals("key")) { if (f instanceof EReference) { keyIsReference = true; if (!((EReferenceImpl)f).isContainment()) { keyNotContained = true; } } } else if (f.getName().equals("value")) { if (f instanceof EReference) { valueIsReference = true; if (!((EReferenceImpl)f).isContainment()) { valueNotContained = true; } } } } { CDOSession session = openSession(); if (epackage != null) { session.getPackageRegistry().putEPackage(epackage); } CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource(resourceName); EMap map = (EMap)container.eGet(feature); for (Object key : objects.keySet()) { map.put(key, objects.get(key)); } compareSimple(objects, map); resource.getContents().add(container); if (keyNotContained && keyIsReference) // avoid dangling references if needed { for (Object key : map.keySet()) { if (key instanceof EObject) { resource.getContents().add((EObject)key); } } } if (valueNotContained && valueIsReference) // avoid dangling references if needed { for (Object value : map.values()) { if (value instanceof EObject) { resource.getContents().add((EObject)value); } } } compareSimple(objects, map); transaction.commit(); session.close(); } { CDOSession session = openSession(); if (epackage != null) { session.getPackageRegistry().putEPackage(epackage); } CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.getResource(getResourcePath(resourceName)); EObject mapHolder = resource.getContents().get(0); for (EStructuralFeature e : mapHolder.eClass().getEAllStructuralFeatures()) { System.out.println(e); } EMap map = (EMap)mapHolder.eGet(feature); compare(objects, keyIsReference, valueIsReference, map); assertEquals(map.size(), objects.size()); map.remove(0); assertEquals(map.size(), objects.size() - 1); transaction.commit(); session.close(); } { CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); if (epackage != null) { session.getPackageRegistry().putEPackage(epackage); } CDOResource resource = transaction.getResource(getResourcePath(resourceName)); EObject mapHolder = resource.getContents().get(0); EMap map = (EMap)mapHolder.eGet(feature); compare(objects, keyIsReference, valueIsReference, map); assertEquals(map.size(), objects.size() - 1); map.clear(); transaction.commit(); session.close(); } { CDOSession session = openSession(); if (epackage != null) { session.getPackageRegistry().putEPackage(epackage); } CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.getResource(getResourcePath(resourceName)); EObject mapHolder = resource.getContents().get(0); EMap map = (EMap)mapHolder.eGet(feature); assertEquals(map.size(), 0); transaction.close(); session.close(); } } private void compareSimple(Map objects, EMap map) { for (Object key : objects.keySet()) { assertEquals(true, map.keySet().contains(key)); assertEquals(true, map.values().contains(objects.get(key))); } } /** * This one looks a bit complicated but we must make sure the reference objects a compared by CDO IDs. Because the * test case is designed to be as generic as possible to allow easy enhancement. */ private void compare(Map objects, boolean keyIsReference, boolean valueIsReference, EMap map) { for (Object key : map.keySet()) { if (!keyIsReference) { assertEquals(true, objects.keySet().contains(key)); } else { boolean foundObjectWithSameID = false; for (Object keyMap : objects.keySet()) { CDOID valueID = CDOUtil.getCDOObject((EObject)key).cdoID(); CDOID valueMapID = CDOUtil.getCDOObject((EObject)keyMap).cdoID(); if (valueID.equals(valueMapID)) { foundObjectWithSameID = true; } } if (!foundObjectWithSameID) { fail("key reference with CDOID could not be found"); } } if (!valueIsReference) { assertEquals(true, objects.keySet().contains(key)); } else { boolean foundObjectWithSameID = false; for (Object valueMap : objects.values()) { CDOID valueID = CDOUtil.getCDOObject((EObject)map.get(key)).cdoID(); CDOID valueMapID = CDOUtil.getCDOObject((EObject)valueMap).cdoID(); if (valueID.equals(valueMapID)) { foundObjectWithSameID = true; } } if (!foundObjectWithSameID) { fail("value reference with CDOID could not be found"); } } } } // private static EPackage createPackage() // { // // EcoreFactory theCoreFactory = EcoreFactory.eINSTANCE; // EcorePackage theCorePackage = EcorePackage.eINSTANCE; // // mapContainerEClass = theCoreFactory.createEClass(); // mapContainerEClass.setName("MapContainer"); // // EPackage dynamicMapEPackage = theCoreFactory.createEPackage(); // dynamicMapEPackage.setName("DynamicMapPackage"); // dynamicMapEPackage.setNsPrefix("dynamicmap"); // dynamicMapEPackage.setNsURI("http:///org.mftech.examples.emf.dynamic.map"); // // dynamicMapEPackage.getEClassifiers().add(mapContainerEClass); // // // ++++++++++++++ create dynamic // // TODO provide Reference mapping // Map<EDataType, Boolean> dataTypes = new HashMap<EDataType, Boolean>(); // dataTypes.put(theCorePackage.getEBigDecimal(), true); // dataTypes.put(theCorePackage.getEBigInteger(), true); // dataTypes.put(theCorePackage.getEBoolean(), true); // dataTypes.put(theCorePackage.getEBooleanObject(), true); // dataTypes.put(theCorePackage.getEByte(), true); // // //dataTypes.put(theCorePackage.getEByteArray(), true); // dataTypes.put(theCorePackage.getEByteObject(), true); // dataTypes.put(theCorePackage.getEChar(), true); // // dataTypes.put(theCorePackage.getECharacterObject(), false); // dataTypes.put(theCorePackage.getEDate(), true); // // // dataTypes.put(theCorePackage.getEDiagnosticChain(), true); // dataTypes.put(theCorePackage.getEDouble(), true); // // dataTypes.put(theCorePackage.getEDoubleObject(), false); // dataTypes.put(theCorePackage.getEFloat(), true); // // dataTypes.put(theCorePackage.getEFloatObject(), false); // dataTypes.put(theCorePackage.getEInt(), true); // // dataTypes.put(theCorePackage.getEIntegerObject(), false); // dataTypes.put(theCorePackage.getEJavaObject(), true); // dataTypes.put(theCorePackage.getEJavaClass(), true); // dataTypes.put(theCorePackage.getELong(), true); // // dataTypes.put(theCorePackage.getELongObject(), false); // // dataTypes.put(theCorePackage.getEMap(), false); // dataTypes.put(theCorePackage.getEShort(), true); // dataTypes.put(theCorePackage.getEShortObject(), true); // dataTypes.put(theCorePackage.getEString(), true); // // System.out.println("Start"); // // int i = 0; // for (EDataType keyDataType : dataTypes.keySet()) // { // String keyName = keyDataType.getName(); // for (EDataType valueDataType : dataTypes.keySet()) // { // // String valueName = valueDataType.getName(); // String mapName = keyName + "To" + valueName + "Map"; // // EClass mapEClass = theCoreFactory.createEClass(); // mapEClass.setName(mapName); // mapEClass.setInstanceTypeName("java.util.Map$Entry"); // // EStructuralFeature key; // if (dataTypes.get(keyDataType)) // { // key = theCoreFactory.createEAttribute(); // } // else // { // key = theCoreFactory.createEReference(); // } // // key.setName("key"); // key.setEType(keyDataType); // // // EStructuralFeature value = theCoreFactory.createEAttribute(); // EStructuralFeature value; // if (dataTypes.get(valueDataType)) // { // value = theCoreFactory.createEAttribute(); // } // else // { // value = theCoreFactory.createEReference(); // } // value.setName("value"); // value.setEType(valueDataType); // // mapEClass.getEStructuralFeatures().add(key); // mapEClass.getEStructuralFeatures().add(value); // // EReference containerMapFeature = theCoreFactory.createEReference(); // // containerMapFeature.setName(mapName); // containerMapFeature.setEType(mapEClass); // containerMapFeature.setResolveProxies(false); // containerMapFeature.setUpperBound(EStructuralFeature.UNBOUNDED_MULTIPLICITY); // containerMapFeature.setContainment(true); // // dynamicMapEPackage.getEClassifiers().add(mapEClass); // mapContainerEClass.getEStructuralFeatures().add(containerMapFeature); // // System.out.println("Created " + mapName); // i++; // } // } // // System.out.println("Created " + i + " maps."); // // initDummyData(theCorePackage); // CDOUtil.prepareDynamicEPackage(dynamicMapEPackage); // return dynamicMapEPackage; // // } // private static void initDummyData(EcorePackage theCorePackage) // { // List data = new ArrayList(); // data.add("A"); // data.add("B"); // data.add("C"); // dummyData.put(theCorePackage.getEString(), data); // // data = new ArrayList(); // data.add(new BigInteger("11111111111111")); // data.add(new BigInteger("22222222222222")); // data.add(new BigInteger("333333333333333")); // dummyData.put(theCorePackage.getEBigInteger(), data); // // data = new ArrayList(); // data.add(new BigDecimal("44444444444444")); // data.add(new BigDecimal("55555555555555")); // data.add(new BigDecimal("66666666666666")); // dummyData.put(theCorePackage.getEBigDecimal(), data); // // data = new ArrayList(); // data.add(true); // data.add(false); // data.add(true); // dummyData.put(theCorePackage.getEBoolean(), data); // // data = new ArrayList(); // data.add(new Boolean(true)); // data.add(new Boolean("false")); // data.add(new Boolean(true)); // dummyData.put(theCorePackage.getEBooleanObject(), data); // // data = new ArrayList(); // data.add((byte)1); // data.add((byte)2); // data.add((byte)3); // dummyData.put(theCorePackage.getEByte(), data); // // // TODO create additional dummy Data // // dummyData.put(theCorePackage.getEByteArray(), data); // // data = new ArrayList(); // data.add(new Byte((byte)1)); // data.add(new Byte("2")); // data.add(new Byte((byte)3)); // dummyData.put(theCorePackage.getEByteObject(), data); // // data = new ArrayList(); // data.add('a'); // data.add((char)99); // data.add('c'); // dummyData.put(theCorePackage.getEChar(), data); // // data = new ArrayList(); // data.add(new Character('a')); // data.add(new Character((char)99)); // data.add(new Character('c')); // dummyData.put(theCorePackage.getECharacterObject(), data); // // data = new ArrayList(); // data.add(new Date()); // data.add(new Date()); // data.add(new Date()); // dummyData.put(theCorePackage.getEDate(), data); // // // TODO create additional dummy Data // // dummyData.put(theCorePackage.getEDiagnosticChain(), data); // // data = new ArrayList(); // data.add(111.111D); // data.add(222.222D); // data.add(333.333D); // dummyData.put(theCorePackage.getEDouble(), data); // // data = new ArrayList(); // data.add(new Double(444.444)); // data.add(new Double("555.555")); // data.add(new Double(666.666)); // dummyData.put(theCorePackage.getEDoubleObject(), data); // // data = new ArrayList(); // data.add(111.0001f); // data.add(222.0002f); // data.add(333.0003f); // dummyData.put(theCorePackage.getEFloat(), data); // // data = new ArrayList(); // data.add(new Float(444.0004f)); // data.add(new Float(555.0005d)); // data.add(new Float("666.0006")); // dummyData.put(theCorePackage.getEFloatObject(), data); // // data = new ArrayList(); // data.add(11); // data.add(22); // data.add(33); // dummyData.put(theCorePackage.getEInt(), data); // // data = new ArrayList(); // data.add(new Integer(44)); // data.add(new Integer("55")); // data.add(new Integer(66)); // dummyData.put(theCorePackage.getEIntegerObject(), data); // // data = new ArrayList(); // data.add(new Long(1)); // data.add(new Date()); // data.add(new Integer(2)); // dummyData.put(theCorePackage.getEJavaObject(), data); // // data = new ArrayList(); // data.add(Object.class); // data.add(Date.class); // data.add(Long.class); // dummyData.put(theCorePackage.getEJavaClass(), data); // // data = new ArrayList(); // data.add(10101010101L); // data.add(20202020202L); // data.add(30303030303L); // dummyData.put(theCorePackage.getELong(), data); // // data = new ArrayList(); // data.add(new Long(40404040404L)); // data.add(new Long("5050505050505")); // data.add(new Long(6060606060606L)); // dummyData.put(theCorePackage.getELongObject(), data); // // data = new ArrayList(); // // Map map = new HashMap(); // map.put(1, 2); // map.put(3, 4); // data.add(map); // map = new HashMap(); // map.put("A", "B"); // map.put("C", "D"); // data.add(map); // map = new HashMap(); // map.put('a', 'b'); // map.put('c', 'd'); // data.add(map); // dummyData.put(theCorePackage.getEMap(), data); // // data = new ArrayList(); // data.add((short)111); // data.add((short)222); // data.add((short)333); // dummyData.put(theCorePackage.getEShort(), data); // // data = new ArrayList(); // data.add(new Short((short)111)); // data.add(new Short((short)222)); // data.add(new Short((short)333)); // dummyData.put(theCorePackage.getEShortObject(), data); // // } }