blob: c692b9fcbaac930197ba5ddcd6aa7dc05d062793 [file] [log] [blame]
/*
* Copyright (c) 2015 Obeo 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:
* Esteban Dugueperoux - initial API and implementation
*/
package org.eclipse.emf.cdo.tests.bugzilla;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.model6.ContainmentObject;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* Bug 468268 about NPE on RevisionWithoutID.hashCode() call with TRANSIENT CDOObject.
*
* @author Esteban Dugueperoux
*/
public class Bugzilla_468268_Test extends AbstractCDOTest
{
public void testHashCodeCallOnAllFields() throws Exception
{
Resource.Factory.Registry registry = Resource.Factory.Registry.INSTANCE;
registry.getExtensionToFactoryMap().put("model6", new XMIResourceFactoryImpl());
ResourceSet resourceSet = new ResourceSetImpl();
URI localResourceURI = URI.createFileURI(createTempFile("main", ".model6").getCanonicalPath());
Resource localResource = resourceSet.createResource(localResourceURI);
ContainmentObject mainContainmentObject = getModel6Factory().createContainmentObject();
testHashCodeOnAllFieds(mainContainmentObject);
localResource.getContents().add(mainContainmentObject);
testHashCodeOnAllFieds(mainContainmentObject);
localResource.save(Collections.emptyMap());
testHashCodeOnAllFieds(mainContainmentObject);
}
private void testHashCodeOnAllFieds(EObject eObject) throws Exception
{
Set<Field> fields = getFields(eObject);
for (Field field : fields)
{
Object value = getValue(field, eObject);
if (value != null)
{
value.hashCode();
}
}
}
private Object getValue(Field field, EObject eObject) throws Exception
{
Object value;
final boolean oldAccessible = field.isAccessible();
try
{
field.setAccessible(true);
value = field.get(eObject);
}
finally
{
field.setAccessible(oldAccessible);
}
return value;
}
private Set<Field> getFields(EObject eObject)
{
Set<Field> allFields = new HashSet<Field>();
Field[] fields = eObject.getClass().getDeclaredFields();
allFields.addAll(Arrays.asList(fields));
Class<?> currentClass = eObject.getClass().getSuperclass();
while (currentClass != Object.class)
{
fields = currentClass.getDeclaredFields();
allFields.addAll(Arrays.asList(fields));
currentClass = currentClass.getSuperclass();
}
return allFields;
}
}