/**
* Copyright (c) 2004-2007 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.test.core.ecore;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.change.ChangePackage;
import org.eclipse.emf.ecore.impl.EReferenceImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.AESCipherImpl;
import org.eclipse.emf.ecore.resource.impl.DESCipherImpl;
import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
import org.eclipse.emf.test.common.TestUtil;
import org.eclipse.emf.test.core.AllSuites;
import org.eclipse.emf.test.models.key.Item;
import org.eclipse.emf.test.models.key.KeyFactory;
import org.eclipse.emf.test.models.key.KeyPackage;
import org.eclipse.emf.test.models.key.Root;
import org.eclipse.emf.test.models.lib.Address;
import org.eclipse.emf.test.models.lib.Book;
import org.eclipse.emf.test.models.lib.Cafeteria;
import org.eclipse.emf.test.models.lib.LibFactory;
import org.eclipse.emf.test.models.lib.Library;
import org.eclipse.emf.test.models.lib.Person;
import org.junit.Before;
import org.junit.Test;
public class PersistenceTest
{
private EObject john;
private EObject mary;
private EObject herbie;
private EAttribute name;
private EAttribute brand;
private EReference children;
private EReference father;
private EReference cars;
@Before
public void setUp()
{
EPackage pack = EcoreFactory.eINSTANCE.createEPackage();
pack.setName("pack");
pack.setNsPrefix("pack");
pack.setNsURI("http://mypack");
EPackage.Registry.INSTANCE.put(pack.getNsURI(), pack);
EClass person = EcoreFactory.eINSTANCE.createEClass();
pack.getEClassifiers().add(person);
person.setName("Person");
name = EcoreFactory.eINSTANCE.createEAttribute();
person.getEStructuralFeatures().add(name);
name.setName("name");
name.setEType(EcorePackage.Literals.ESTRING);
children = EcoreFactory.eINSTANCE.createEReference();
person.getEStructuralFeatures().add(children);
children.setName("children");
children.setEType(person);
children.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
father = EcoreFactory.eINSTANCE.createEReference();
person.getEStructuralFeatures().add(father);
father.setName("father");
father.setEType(person);
children.setEOpposite(father);
father.setEOpposite(children);
EClass car = EcoreFactory.eINSTANCE.createEClass();
pack.getEClassifiers().add(car);
car.setName("Car");
brand = EcoreFactory.eINSTANCE.createEAttribute();
car.getEStructuralFeatures().add(brand);
brand.setName("brand");
brand.setEType(EcorePackage.Literals.ESTRING);
cars = EcoreFactory.eINSTANCE.createEReference();
person.getEStructuralFeatures().add(cars);
cars.setName("cars");
cars.setEType(car);
cars.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
cars.setContainment(true);
john = pack.getEFactoryInstance().create(person);
john.eSet(name, "John");
mary = pack.getEFactoryInstance().create(person);
mary.eSet(name, "Mary");
herbie = pack.getEFactoryInstance().create(car);
herbie.eSet(brand, "vw");
@SuppressWarnings("unchecked")
List<EObject> johnChildren = ((List<EObject>)john.eGet(children));
johnChildren.add(mary);
assertEquals(john, mary.eGet(father));
@SuppressWarnings("unchecked")
List<EObject> johnCars = ((List<EObject>)john.eGet(cars));
johnCars.add(herbie);
assertEquals(john, herbie.eContainer());
}
@Test
public void testOneTextFile() throws Exception
{
oneFileTest(new XMIResourceFactoryImpl());
}
@Test
public void testOneZipFile() throws Exception
{
oneFileTest(new XMIResourceFactoryImpl()
{
@Override
public Resource createResource(URI uri)
{
XMIResource xmiResource = (XMIResource)super.createResource(uri);
xmiResource.setUseZip(true);
return xmiResource;
}
});
}
@Test
public void testTwoTextFiles() throws Exception
{
twoFileTest(new XMIResourceFactoryImpl(), new XMIResourceFactoryImpl());
}
@Test
public void testOneTextAndOneZipFiles() throws Exception
{
twoFileTest(new XMIResourceFactoryImpl(), new XMIResourceFactoryImpl()
{
@Override
public Resource createResource(URI uri)
{
XMIResource xmiResource = (XMIResource)super.createResource(uri);
xmiResource.setUseZip(true);
return xmiResource;
}
});
}
@Test
public void testTwoZipFiles() throws Exception
{
Resource.Factory zipResourceFactory = new XMIResourceFactoryImpl()
{
@Override
public Resource createResource(URI uri)
{
XMIResource xmiResource = (XMIResource)super.createResource(uri);
xmiResource.setUseZip(true);
return xmiResource;
}
};
twoFileTest(zipResourceFactory, zipResourceFactory);
}
public void oneFileTest(Resource.Factory resourceFactory) throws Exception
{
URI uri = URI.createFileURI(TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID) + "/people.pep");
new File(uri.toFileString()).delete();
Resource resource = resourceFactory.createResource(uri);
resource.getContents().add(john);
resource.getContents().add(mary);
assertEquals(resource, john.eResource());
assertEquals(resource, mary.eResource());
resource.save(null);
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("pep", resourceFactory);
Resource loadedResource = resourceSet.getResource(uri, true);
assertNotNull(loadedResource);
assertEquals(2, loadedResource.getContents().size());
checkIsJohn(loadedResource.getContents().get(0));
checkIsMary(loadedResource.getContents().get(1));
new File(uri.toFileString()).delete();
assertFalse(new File(uri.toFileString()).exists());
}
public void twoFileTest(Resource.Factory johnResourceFactory, Resource.Factory maryResourceFactory) throws Exception
{
URI johnURI = URI.createFileURI(TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID) + "/f1/people.john");
new File(johnURI.toFileString()).delete();
URI maryURI = URI.createFileURI(TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID) + "/f1/f2/people.mary");
new File(maryURI.toFileString()).delete();
Resource johnResource = johnResourceFactory.createResource(johnURI);
johnResource.getContents().add(john);
Resource maryResource = maryResourceFactory.createResource(maryURI);
maryResource.getContents().add(mary);
assertEquals(johnResource, john.eResource());
assertEquals(maryResource, mary.eResource());
johnResource.save(null);
maryResource.save(null);
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("john", johnResourceFactory);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("mary", maryResourceFactory);
Resource loadedResource = resourceSet.getResource(johnURI, true);
assertNotNull(loadedResource);
assertEquals(1, loadedResource.getContents().size());
EObject eObject = loadedResource.getContents().get(0);
checkIsJohn(eObject);
checkIsMary((EObject)((List<?>)eObject.eGet(children)).get(0));
resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("john", johnResourceFactory);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("mary", maryResourceFactory);
loadedResource = resourceSet.getResource(maryURI, true);
assertNotNull(loadedResource);
assertEquals(1, loadedResource.getContents().size());
eObject = loadedResource.getContents().get(0);
checkIsMary(eObject);
checkIsJohn((EObject)eObject.eGet(father));
new File(johnURI.toFileString()).delete();
assertFalse(new File(johnURI.toFileString()).exists());
new File(maryURI.toFileString()).delete();
assertFalse(new File(maryURI.toFileString()).exists());
}
private void checkIsJohn(EObject person)
{
assertEquals(john.eGet(name), person.eGet(name));
assertEquals(1, ((List<?>)person.eGet(children)).size());
assertEquals(mary.eGet(name), ((EObject)((List<?>)person.eGet(children)).get(0)).eGet(name));
assertEquals(1, ((List<?>)person.eGet(cars)).size());
assertEquals(herbie.eGet(brand), ((EObject)((List<?>)person.eGet(cars)).get(0)).eGet(brand));
}
private void checkIsMary(EObject person)
{
assertEquals(mary.eGet(name), person.eGet(name));
assertEquals(john.eGet(name), ((EObject)person.eGet(father)).eGet(name));
assertTrue(((List<?>)person.eGet(cars)).isEmpty());
}
@Test
public void testEDataType() throws Exception
{
EPackage pack = EcoreFactory.eINSTANCE.createEPackage();
pack.setName("localpack");
pack.setNsPrefix("localpack");
pack.setNsURI("http://mylocalpack");
EPackage.Registry.INSTANCE.put(pack.getNsURI(), pack);
EDataType date = EcoreFactory.eINSTANCE.createEDataType();
pack.getEClassifiers().add(date);
date.setName("Date");
date.setInstanceClass(Date.class);
date.setSerializable(true);
EDataType foo = EcoreFactory.eINSTANCE.createEDataType();
pack.getEClassifiers().add(foo);
foo.setName("Foo");
foo.setInstanceClassName("org.Foo");
foo.setSerializable(true);
EClass person = EcoreFactory.eINSTANCE.createEClass();
pack.getEClassifiers().add(person);
person.setName("Person");
EAttribute birthday = EcoreFactory.eINSTANCE.createEAttribute();
person.getEStructuralFeatures().add(birthday);
birthday.setName("birthday");
birthday.setEType(date);
long dateValue = System.currentTimeMillis();
EObject john = pack.getEFactoryInstance().create(person);
john.eSet(birthday, new Date(dateValue));
XMIResource xmiResource = new XMIResourceImpl();
xmiResource.setURI(URI.createFileURI("foo.xmi"));
xmiResource.getContents().add(john);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
xmiResource.save(baos, null);
XMIResource loadedXMIResource = new XMIResourceImpl();
loadedXMIResource.load(new ByteArrayInputStream(baos.toByteArray()), null);
assertEquals(1, loadedXMIResource.getContents().size());
EObject loadedJohn = loadedXMIResource.getContents().get(0);
assertTrue(loadedJohn.eGet(birthday) instanceof Date);
assertEquals(dateValue, ((Date)loadedJohn.eGet(birthday)).getTime());
}
/*
* Bugzilla 126647
*/
@Test
public void testCrossResourceContainment_XMLResourceUUID() throws Exception
{
EPackage pack = EcoreFactory.eINSTANCE.createEPackage();
pack.setName("pack");
pack.setNsURI("http://www.eclipse.org/emf/pack/person");
EClass person = EcoreFactory.eINSTANCE.createEClass();
person.setName("Person");
pack.getEClassifiers().add(person);
EAttribute name = EcoreFactory.eINSTANCE.createEAttribute();
name.setName("name");
name.setEType(EcorePackage.Literals.ESTRING);
person.getEStructuralFeatures().add(name);
EReference children = EcoreFactory.eINSTANCE.createEReference();
children.setName("children");
children.setEType(person);
children.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
children.setContainment(true);
children.setResolveProxies(true);
person.getEStructuralFeatures().add(children);
EObject john = EcoreUtil.create(person);
john.eSet(name, "john");
EObject mary = EcoreUtil.create(person);
mary.eSet(name, "mary");
@SuppressWarnings("unchecked")
List<EObject> johnChildren = ((List<EObject>)john.eGet(children));
johnChildren.add(mary);
assertNull(john.eResource());
assertNull(mary.eResource());
assertEquals(john, mary.eContainer());
XMLResource johnResource = new XMLResourceImpl(URI.createFileURI("john"))
{
@Override
protected boolean useUUIDs()
{
return true;
}
};
johnResource.setID(john, (String)john.eGet(name));
johnResource.setID(mary, (String)mary.eGet(name));
johnResource.getContents().add(john);
assertEquals(john, johnResource.getEObject((String)john.eGet(name)));
assertEquals(mary, johnResource.getEObject((String)mary.eGet(name)));
//
assertEquals(johnResource, john.eResource());
assertEquals(johnResource, mary.eResource());
assertEquals(john, mary.eContainer());
XMLResource maryResource = new XMLResourceImpl(URI.createFileURI("mary"))
{
@Override
protected boolean useUUIDs()
{
return true;
}
};
maryResource.getContents().add(mary);
assertEquals(john, johnResource.getEObject((String)john.eGet(name)));
assertNull(johnResource.getEObject((String)mary.eGet(name)));
assertNull(maryResource.getEObject((String)john.eGet(name)));
assertEquals(mary, maryResource.getEObject((String)mary.eGet(name)));
//
assertEquals(johnResource, john.eResource());
assertEquals(maryResource, mary.eResource());
assertEquals(john, mary.eContainer());
maryResource.getContents().remove(mary);
assertEquals(john, johnResource.getEObject((String)john.eGet(name)));
assertEquals(mary, johnResource.getEObject((String)mary.eGet(name)));
assertNull(maryResource.getEObject((String)john.eGet(name)));
assertNull(maryResource.getEObject((String)mary.eGet(name)));
//
assertEquals(johnResource, john.eResource());
assertEquals(johnResource, mary.eResource());
assertEquals(john, mary.eContainer());
}
/*
* Bugzilla 126650
*/
@Test
public void testCrossResourceContainment_Dynamic_ResourceSet() throws Exception
{
EPackage pack = EcoreFactory.eINSTANCE.createEPackage();
pack.setName("pack");
pack.setNsURI("http://www.eclipse.org/emf/pack/person");
EClass person = EcoreFactory.eINSTANCE.createEClass();
person.setName("Person");
pack.getEClassifiers().add(person);
EAttribute name = EcoreFactory.eINSTANCE.createEAttribute();
name.setName("name");
name.setEType(EcorePackage.Literals.ESTRING);
person.getEStructuralFeatures().add(name);
EReference children = EcoreFactory.eINSTANCE.createEReference();
children.setName("children");
children.setEType(person);
children.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
children.setContainment(true);
children.setResolveProxies(true);
person.getEStructuralFeatures().add(children);
EReference spouse = EcoreFactory.eINSTANCE.createEReference();
spouse.setName("spouse");
spouse.setEType(person);
spouse.setContainment(true);
spouse.setResolveProxies(true);
person.getEStructuralFeatures().add(spouse);
EClass house = EcoreFactory.eINSTANCE.createEClass();
house.setName("House");
pack.getEClassifiers().add(house);
EAttribute postalCode = EcoreFactory.eINSTANCE.createEAttribute();
postalCode.setName("postalCode");
postalCode.setEType(EcorePackage.Literals.ESTRING);
house.getEStructuralFeatures().add(postalCode);
EReference home = EcoreFactory.eINSTANCE.createEReference();
home.setName("home");
home.setEType(house);
home.setContainment(true);
home.setResolveProxies(true);
person.getEStructuralFeatures().add(home);
EReference owner = EcoreFactory.eINSTANCE.createEReference();
owner.setName("owner");
owner.setEType(person);
house.getEStructuralFeatures().add(owner);
owner.setEOpposite(home);
home.setEOpposite(owner);
EReference houses = EcoreFactory.eINSTANCE.createEReference();
houses.setName("houses");
houses.setEType(house);
houses.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
houses.setContainment(true);
houses.setResolveProxies(true);
person.getEStructuralFeatures().add(houses);
EReference landlord = EcoreFactory.eINSTANCE.createEReference();
landlord.setName("landlord");
landlord.setEType(person);
house.getEStructuralFeatures().add(landlord);
landlord.setEOpposite(houses);
houses.setEOpposite(landlord);
EObject john = EcoreUtil.create(person);
john.eSet(name, "john");
EObject jane = EcoreUtil.create(person);
jane.eSet(name, "jane");
john.eSet(spouse, jane);
EObject mary = EcoreUtil.create(person);
mary.eSet(name, "mary");
@SuppressWarnings("unchecked")
List<EObject> johnChildren = ((List<EObject>)john.eGet(children));
johnChildren.add(mary);
EObject johnsHome = EcoreUtil.create(house);
johnsHome.eSet(postalCode, "abcdefg");
john.eSet(home, johnsHome);
EObject house1 = EcoreUtil.create(house);
house1.eSet(postalCode, "house 1");
@SuppressWarnings("unchecked")
List<EObject> johnHouses = ((List<EObject>)john.eGet(houses));
johnHouses.add(house1);
assertNull(john.eResource());
assertNull(jane.eResource());
assertNull(mary.eResource());
assertNull(johnsHome.eResource());
assertNull(house1.eResource());
assertEquals(john, jane.eContainer());
assertEquals(john, mary.eContainer());
assertEquals(john, johnsHome.eContainer());
assertEquals(john, johnsHome.eGet(owner));
assertEquals(john, house1.eContainer());
assertEquals(john, house1.eGet(landlord));
URI johnURI = URI.createFileURI("john.xmi");
URI uri2 = URI.createFileURI("uri2.xmi");
Resource johnResource = new XMIResourceImpl(johnURI);
johnResource.getContents().add(john);
assertEquals(johnResource, john.eResource());
assertEquals(johnResource, jane.eResource());
assertEquals(johnResource, mary.eResource());
assertEquals(johnResource, johnsHome.eResource());
assertEquals(johnResource, house1.eResource());
assertEquals(john, jane.eContainer());
assertEquals(john, mary.eContainer());
assertEquals(john, johnsHome.eContainer());
assertEquals(john, johnsHome.eGet(owner));
assertEquals(john, house1.eContainer());
assertEquals(john, house1.eGet(landlord));
Resource resource2 = new XMIResourceImpl(uri2);
resource2.getContents().add(jane);
resource2.getContents().add(mary);
resource2.getContents().add(johnsHome);
resource2.getContents().add(house1);
assertEquals(johnResource, john.eResource());
assertEquals(resource2, jane.eResource());
assertEquals(resource2, mary.eResource());
assertEquals(resource2, johnsHome.eResource());
assertEquals(resource2, house1.eResource());
assertEquals(john, jane.eContainer());
assertEquals(john, mary.eContainer());
assertEquals(john, johnsHome.eContainer());
assertEquals(john, johnsHome.eGet(owner));
assertEquals(john, house1.eContainer());
assertEquals(john, house1.eGet(landlord));
ByteArrayOutputStream johnBAOS = new ByteArrayOutputStream();
johnResource.save(johnBAOS, null);
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
resource2.save(baos2, null);
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getPackageRegistry().put(pack.getNsURI(), pack);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
johnResource = resourceSet.createResource(johnURI);
johnResource.load(new ByteArrayInputStream(johnBAOS.toByteArray()), null);
resource2 = resourceSet.createResource(uri2);
resource2.load(new ByteArrayInputStream(baos2.toByteArray()), null);
john = johnResource.getContents().get(0);
jane = resource2.getContents().get(0);
mary = resource2.getContents().get(1);
johnsHome = resource2.getContents().get(2);
house1 = resource2.getContents().get(3);
assertEquals("john", john.eGet(name));
assertEquals("jane", jane.eGet(name));
assertEquals("mary", mary.eGet(name));
assertEquals("abcdefg", johnsHome.eGet(postalCode));
assertEquals("house 1", house1.eGet(postalCode));
EcoreUtil.resolveAll(johnResource);
assertEquals(johnResource, john.eResource());
assertEquals(resource2, jane.eResource());
assertEquals(resource2, mary.eResource());
assertEquals(resource2, johnsHome.eResource());
assertEquals(resource2, house1.eResource());
assertEquals(john, jane.eContainer());
assertEquals(john, mary.eContainer());
assertEquals(john, johnsHome.eContainer());
assertEquals(john, johnsHome.eGet(owner));
assertEquals(john, house1.eContainer());
assertEquals(john, house1.eGet(landlord));
}
/*
* Bugzilla 126650
*/
@Test
public void testCrossResourceContainment_Static_ResourceSet() throws Exception
{
Library library = LibFactory.eINSTANCE.createLibrary();
library.setName("Public Library");
//
Book book = LibFactory.eINSTANCE.createBook();
book.setTitle("EMF");
library.getBooks().add(book);
//
Address libraryAddress = LibFactory.eINSTANCE.createAddress();
libraryAddress.setPostalCode("abcdefg");
library.setAddress(libraryAddress);
//
Person john = LibFactory.eINSTANCE.createPerson();
john.setName("john");
library.getWriters().add(john);
//
Cafeteria cafeteria = LibFactory.eINSTANCE.createCafeteria();
cafeteria.setName("cafe");
library.setCafeteria(cafeteria);
assertNull(library.eResource());
assertNull(book.eResource());
assertNull(libraryAddress.eResource());
assertNull(john.eResource());
assertNull(cafeteria.eResource());
assertEquals(library, book.eContainer());
assertEquals(library, libraryAddress.eContainer());
assertEquals(library, john.eContainer());
assertEquals(library, john.getLibrary());
assertEquals(library, cafeteria.eContainer());
assertEquals(library, cafeteria.getLibrary());
URI libraryURI = URI.createFileURI("library.xmi");
URI childrenURI = URI.createFileURI("children.xmi");
Resource libraryResource = new XMIResourceImpl(libraryURI);
libraryResource.getContents().add(library);
assertEquals(libraryResource, library.eResource());
assertEquals(libraryResource, book.eResource());
assertEquals(libraryResource, libraryAddress.eResource());
assertEquals(libraryResource, john.eResource());
assertEquals(libraryResource, cafeteria.eResource());
assertEquals(library, book.eContainer());
assertEquals(library, libraryAddress.eContainer());
assertEquals(library, john.eContainer());
assertEquals(library, john.getLibrary());
assertEquals(library, cafeteria.eContainer());
assertEquals(library, cafeteria.getLibrary());
Resource childrenResource = new XMIResourceImpl(childrenURI);
childrenResource.getContents().add(book);
childrenResource.getContents().add(libraryAddress);
childrenResource.getContents().add(john);
childrenResource.getContents().add(cafeteria);
assertEquals(libraryResource, library.eResource());
assertEquals(childrenResource, book.eResource());
assertEquals(childrenResource, libraryAddress.eResource());
assertEquals(childrenResource, john.eResource());
assertEquals(childrenResource, cafeteria.eResource());
assertEquals(library, book.eContainer());
assertEquals(library, libraryAddress.eContainer());
assertEquals(library, john.eContainer());
assertEquals(library, john.getLibrary());
assertEquals(library, cafeteria.eContainer());
assertEquals(library, cafeteria.getLibrary());
ByteArrayOutputStream libraryBAOS = new ByteArrayOutputStream();
libraryResource.save(libraryBAOS, null);
ByteArrayOutputStream bookBAOS = new ByteArrayOutputStream();
childrenResource.save(bookBAOS, null);
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
libraryResource = resourceSet.createResource(libraryURI);
libraryResource.load(new ByteArrayInputStream(libraryBAOS.toByteArray()), null);
childrenResource = resourceSet.createResource(childrenURI);
childrenResource.load(new ByteArrayInputStream(bookBAOS.toByteArray()), null);
library = (Library)libraryResource.getContents().get(0);
book = (Book)childrenResource.getContents().get(0);
libraryAddress = (Address)childrenResource.getContents().get(1);
john = (Person)childrenResource.getContents().get(2);
cafeteria = (Cafeteria)childrenResource.getContents().get(3);
assertEquals("Public Library", library.getName());
assertEquals("EMF", book.getTitle());
assertEquals("abcdefg", libraryAddress.getPostalCode());
assertEquals("john", john.getName());
assertEquals("cafe", cafeteria.getName());
EcoreUtil.resolveAll(libraryResource);
assertEquals(libraryResource, library.eResource());
assertEquals(childrenResource, book.eResource());
assertEquals(childrenResource, libraryAddress.eResource());
assertEquals(childrenResource, john.eResource());
assertEquals(childrenResource, cafeteria.eResource());
assertEquals(library, book.eContainer());
assertEquals(library, libraryAddress.eContainer());
assertEquals(library, john.eContainer());
assertEquals(library, john.getLibrary());
assertEquals(library, cafeteria.eContainer());
assertEquals(library, cafeteria.getLibrary());
}
/*
* Bugzilla 132904
*/
@Test
public void testCrossResourceContainment_RemoveChild() throws Exception
{
Library library = LibFactory.eINSTANCE.createLibrary();
library.setName("Public Library");
//
Book book = LibFactory.eINSTANCE.createBook();
book.setTitle("EMF");
library.getBooks().add(book);
Resource libResource = new ResourceImpl(URI.createURI("lib"));
libResource.getContents().add(library);
assertEquals(library, book.eContainer());
assertEquals(libResource, library.eResource());
assertEquals(libResource, book.eResource());
Resource bookResource = new ResourceImpl(URI.createURI("book"));
bookResource.getContents().add(book);
assertEquals(library, book.eContainer());
assertEquals(libResource, library.eResource());
assertEquals(bookResource, book.eResource());
library.getBooks().remove(book);
assertNull(book.eContainer());
assertEquals(libResource, library.eResource());
assertEquals(bookResource, book.eResource());
library.getBooks().add(book);
assertEquals(library, book.eContainer());
assertEquals(libResource, library.eResource());
assertEquals(bookResource, book.eResource());
}
/*
* Bugzilla 169308
*/
@Test
public void testPluginURINotRelative() throws Exception
{
Resource.Factory ecoreResourceFactory = new EcoreResourceFactoryImpl();
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", ecoreResourceFactory);
URI localPluginURI = URI.createFileURI(new File(TestUtil.getPluginDirectory(AllSuites.PLUGIN_ID)).getAbsolutePath() + "/");
URI pluginURI = URI.createURI("platform:/plugin/org.eclipse.emf.test.core/", false);
resourceSet.getURIConverter().getURIMap().put(pluginURI, localPluginURI);
URI changeURI = URI.createPlatformPluginURI("/org.eclipse.emf.test.core/data/Change.ecore", false);
Resource changeResource = resourceSet.getResource(changeURI, true);
EPackage changePackage = (EPackage)changeResource.getContents().get(0);
EPackage pack = EcoreFactory.eINSTANCE.createEPackage();
pack.setName("example");
pack.setNsPrefix("example");
pack.setNsURI("http://org.eclipse.emf.example");
EClass eClass = EcoreFactory.eINSTANCE.createEClass();
pack.getEClassifiers().add(eClass);
eClass.setName("Monitor");
EReference eReference = EcoreFactory.eINSTANCE.createEReference();
eClass.getEStructuralFeatures().add(eReference);
eReference.setName("change");
eReference.setEType(changePackage.getEClassifier("ChangeDescription"));
URI modelURI = URI.createPlatformResourceURI("/myProject/model/model.ecore", false);
Resource modelResource = resourceSet.createResource(modelURI);
modelResource.getContents().add(pack);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
modelResource.save(baos, null);
String contents = new String(baos.toByteArray());
assertFalse(contents, contents.contains("../plugin"));
//System.out.println(contents);
modelResource = ecoreResourceFactory.createResource(URI.createPlatformResourceURI("/myNewProject/model.ecore", false));
modelResource.load(new ByteArrayInputStream(baos.toByteArray()), null);
EPackage loadedEPackage = (EPackage)modelResource.getContents().get(0);
EClass loadedEClass = (EClass)loadedEPackage.eContents().get(0);
EReference loadedEReference = (EReference)loadedEClass.eContents().get(0);
EObject loadedEReferenceType = ((EReferenceImpl)loadedEReference).basicGetEType();
assertTrue(loadedEReferenceType.eIsProxy());
URI proxyURI = ((InternalEObject)loadedEReferenceType).eProxyURI();
assertTrue(proxyURI.toString(), proxyURI.isPlatformPlugin());
}
@Test
public void testReferenceEcoreUsingNSURI() throws Exception
{
Resource.Factory ecoreResourceFactory = new EcoreResourceFactoryImpl();
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", ecoreResourceFactory);
EPackage pack = EcoreFactory.eINSTANCE.createEPackage();
pack.setName("example");
pack.setNsPrefix("example");
pack.setNsURI("http://org.eclipse.emf.example");
EClass eClass = EcoreFactory.eINSTANCE.createEClass();
pack.getEClassifiers().add(eClass);
eClass.setName("Monitor");
EReference eReference = EcoreFactory.eINSTANCE.createEReference();
eClass.getEStructuralFeatures().add(eReference);
eReference.setName("change");
eReference.setEType(ChangePackage.Literals.CHANGE_DESCRIPTION);
URI modelURI = URI.createPlatformResourceURI("/myProject/model/model.ecore", false);
Resource modelResource = resourceSet.createResource(modelURI);
modelResource.getContents().add(pack);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
modelResource.save(baos, null);
String contents = new String(baos.toByteArray());
assertFalse(contents, contents.contains("../plugin"));
modelResource = ecoreResourceFactory.createResource(URI.createPlatformResourceURI("/myNewProject/model.ecore", false));
modelResource.load(new ByteArrayInputStream(baos.toByteArray()), null);
EPackage loadedEPackage = (EPackage)modelResource.getContents().get(0);
EClass loadedEClass = (EClass)loadedEPackage.eContents().get(0);
EReference loadedEReference = (EReference)loadedEClass.eContents().get(0);
EObject loadedEReferenceType = ((EReferenceImpl)loadedEReference).basicGetEType();
assertTrue(loadedEReferenceType.eIsProxy());
URI proxyURI = ((InternalEObject)loadedEReferenceType).eProxyURI();
assertFalse(proxyURI.toString(), proxyURI.isPlatformPlugin());
assertFalse(proxyURI.toString(), proxyURI.isRelative());
}
@Test
public void testCipher0() throws Exception
{
cipherTest(new DESCipherImpl("a very long key indeed"));
cipherTest(new AESCipherImpl("a very long passowrd indeed"));
}
protected void cipherTest(URIConverter.Cipher cipher) throws Exception
{
StringBuilder originalMessage = new StringBuilder("<>\n");
for (int i=0; i<100; i++)
{
originalMessage
.append(i)
.append(" - ")
.append("the quick brown fox jumped over the sleeping lazy dog")
.append('\n');
}
originalMessage.append("</>");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream os = cipher.encrypt(baos);
os.write(originalMessage.toString().getBytes("UTF-8"));
cipher.finish(os);
os.close();
assertEquals(originalMessage.toString(), readEncriptedBytes(cipher, baos.toByteArray()));
}
protected String readEncriptedBytes(URIConverter.Cipher cipher, byte[] bytes) throws Exception
{
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStream is = cipher.decrypt(bais);
StringBuilder message = new StringBuilder();
byte[] buffer = new byte[7];
int i = buffer.length;
while ((i = is.read(buffer)) >= 0)
{
message.append(new String(buffer, 0, i, "UTF-8"));
}
return message.toString().trim();
}
@Test
public void testCipher1() throws Exception
{
class Tester
{
boolean TRACE = false;
public byte[] test(Map<String, Object> options) throws Exception
{
URI uri = URI.createFileURI("/home/foo/f1.xmi");
byte[] bytes = testSave(uri, options);
if (TRACE) System.out.println(getContents(options, bytes));
testSaveOnlyIfChanged(options);
testLoad(uri, options, bytes);
return bytes;
}
protected String getContents(Map<String, Object> options, byte[] bytes) throws Exception
{
URIConverter.Cipher cipher = options == null ?
null : (URIConverter.Cipher)options.get(Resource.OPTION_CIPHER);
return cipher != null ?
readEncriptedBytes(cipher, bytes) : new String(bytes, "UTF-8");
}
protected EObject instantiateModel()
{
Root root = KeyFactory.eINSTANCE.createRoot();
Item item = KeyFactory.eINSTANCE.createItem();
item.setName("Name-Item1");
root.getItems().add(item);
return root;
}
public byte[] testSave(URI uri, Map<String, Object> options) throws Exception
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLResource resource = new XMIResourceImpl(uri);
resource.setEncoding("UTF-8");
resource.getContents().add(instantiateModel());
resource.save(baos, options);
byte[] bytes = baos.toByteArray();
String contents = new String(bytes, "UTF-8");
boolean notEncripted = options == null || !options.containsKey(Resource.OPTION_CIPHER);
assertEquals(contents, notEncripted, contents.contains("Root"));
assertEquals(contents, notEncripted, contents.contains("items"));
assertEquals(contents, notEncripted, contents.contains("Name-Item1"));
return bytes;
}
public void testSaveOnlyIfChanged(Map<String, Object> options) throws Exception
{
File file = File.createTempFile("TestSaveOnlyIfChanged.xml", null);
URI uri = URI.createFileURI(file.getPath());
XMLResource resource = new XMIResourceImpl(uri);
resource.setEncoding("UTF-8");
resource.getContents().add(instantiateModel());
resource.save(options);
long time = file.lastModified();
Map<Object, Object> localOptions = options == null ? new HashMap<Object, Object>() : new HashMap<Object, Object>(options);
try
{
Thread.sleep(1000);
localOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
resource.save(localOptions);
assertEquals(time, file.lastModified());
Thread.sleep(1000);
localOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_FILE_BUFFER);
resource.save(localOptions);
assertEquals(time, file.lastModified());
Thread.sleep(1000);
resource.save(options);
assertTrue(time < file.lastModified());
}
finally
{
file.delete();
}
}
public void testLoad(URI uri, Map<String, Object> options, byte[] contents) throws Exception
{
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getPackageRegistry().put(KeyPackage.eNS_URI, KeyPackage.eINSTANCE);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
Resource loadedResource = resourceSet.createResource(uri);
ByteArrayInputStream bais = new ByteArrayInputStream(contents);
loadedResource.load(bais, options);
assertEquals(1, loadedResource.getContents().size());
Root root = (Root)loadedResource.getContents().get(0);
assertEquals(1, root.getItems().size());
assertEquals("Name-Item1", root.getItems().get(0).getName());
}
}
Tester tester = new Tester();
byte[] noCypherBytes = tester.test(null);
Map<String, Object> desCyperOptions = new HashMap<String, Object>(1);
desCyperOptions.put(Resource.OPTION_CIPHER, new DESCipherImpl("a very long key indeed"));
byte[] desCypherBytes = tester.test(desCyperOptions);
Map<String, Object> aesCyperOptions = new HashMap<String, Object>(1);
aesCyperOptions.put(Resource.OPTION_CIPHER, new AESCipherImpl("a very long password indeed"));
byte[] aesCypherBytes = tester.test(aesCyperOptions);
Map<String, Object> desCyperZipOptions = new HashMap<String, Object>(1);
desCyperZipOptions.put(Resource.OPTION_CIPHER, new DESCipherImpl("a very long key indeed"));
desCyperZipOptions.put(Resource.OPTION_ZIP, Boolean.TRUE);
byte[] desCypherZipBytes = tester.test(desCyperZipOptions);
assertFalse(Arrays.equals(noCypherBytes, desCypherBytes));
assertFalse(Arrays.equals(noCypherBytes, aesCypherBytes));
assertFalse(Arrays.equals(aesCypherBytes, desCypherBytes));
assertFalse(Arrays.equals(desCypherBytes, desCypherZipBytes));
}
}