blob: 5df1eb047bb0d7ba47226fca02a0ce48b6b437e0 [file] [log] [blame]
/*
* Copyright (c) 2009-2013, 2016, 2018, 2020 Eike Stepper (Loehne, 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
*/
package org.eclipse.emf.cdo.tests;
import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.Supplier;
import org.eclipse.emf.cdo.tests.model1.VAT;
import org.eclipse.emf.cdo.tests.model2.Unsettable1;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
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.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;
import java.util.Date;
/**
* @author Eike Stepper
*/
public class UnsetTest extends AbstractCDOTest
{
/**
* needed for commitAndLoadTx()
*/
private CDOSession commitAndLoadSession;
/**
* needed for commitAndLoadTx()
*/
private CDOTransaction commitAndLoadTransaction;
/**
* Ensures that properly typed (i.e. usable) default values can be read from dynamic packages.
* <p>
* Works only in standalone mode.
*/
public static void main(String[] args)
{
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", new EcoreResourceFactoryImpl());
URI uri = URI.createFileURI("../org.eclipse.emf.cdo.tests.model2/model/model2.ecore");
Resource resource = resourceSet.getResource(uri, true);
EPackage model2 = (EPackage)resource.getContents().get(0);
EClass unsettable2 = (EClass)model2.getEClassifier("Unsettable2WithDefault");
EAttribute unsettableInt = (EAttribute)unsettable2.getEStructuralFeature("unsettableInt");
// Check static default value
Integer defaultValue = (Integer)unsettableInt.getDefaultValue();
assertEquals(5, (int)defaultValue);
// Check dynamic default value
EObject object = EcoreUtil.create(unsettable2);
Integer value = (Integer)object.eGet(unsettableInt);
assertEquals((int)defaultValue, (int)value);
}
public void testReadDefaultValue() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/test1"));
Supplier supplier = getModel1Factory().createSupplier();
supplier.setName("Stepper");
resource.getContents().add(supplier);
transaction.commit();
session.close();
session = openSession();
CDOView view = session.openView();
resource = view.getResource(getResourcePath("/test1"));
supplier = (Supplier)resource.getContents().get(0);
assertEquals(true, supplier.isPreferred());
}
public void testWriteDefaultValue() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/test1"));
Supplier supplier = getModel1Factory().createSupplier();
supplier.setName("Stepper");
supplier.setPreferred(true);
resource.getContents().add(supplier);
transaction.commit();
session.close();
session = openSession();
CDOView view = session.openView();
resource = view.getResource(getResourcePath("/test1"));
supplier = (Supplier)resource.getContents().get(0);
assertEquals(true, supplier.isPreferred());
}
public void testWriteNonDefaultValue() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/test1"));
Supplier supplier = getModel1Factory().createSupplier();
supplier.setName("Stepper");
supplier.setPreferred(false);
resource.getContents().add(supplier);
transaction.commit();
session.close();
session = openSession();
CDOView view = session.openView();
resource = view.getResource(getResourcePath("/test1"));
supplier = (Supplier)resource.getContents().get(0);
assertEquals(false, supplier.isPreferred());
}
public void testUnsetNonDefaultValue() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
// unsettable.setUnsettableBoolean(true);
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testIsSetBoolean() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableBoolean(true);
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(true, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testIsSetByte() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableByte(Byte.MAX_VALUE);
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(true, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testIsSetChar() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableChar('a');
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(true, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testIsSetDate() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableDate(new Date());
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(true, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testIsSetDouble() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableDouble(42.34d);
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(true, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testIsSetFloat() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableFloat(42.34f);
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(true, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testIsSetLong() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableLong(42L);
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(true, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testIsSetShort() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableShort(Short.MAX_VALUE);
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(true, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testIsSetString() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableString("42");
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(true, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testIsSetVAT() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableVAT(VAT.VAT15);
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(true, result.isSetUnsettableVAT());
}
public void testIsSetMultipleTimes() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableInt(42);
Unsettable1 result = commitAndLoadTx(unsettable);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(true, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
result.setUnsettableByte(Byte.MAX_VALUE);
result = commitAndLoadTx(result);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(true, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(true, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
result.unsetUnsettableByte();
result.unsetUnsettableInt();
result.setUnsettableString("blah");
result = commitAndLoadTx(result);
assertEquals(false, result.isSetUnsettableBoolean());
assertEquals(false, result.isSetUnsettableByte());
assertEquals(false, result.isSetUnsettableChar());
assertEquals(false, result.isSetUnsettableDate());
assertEquals(false, result.isSetUnsettableDouble());
assertEquals(false, result.isSetUnsettableFloat());
assertEquals(false, result.isSetUnsettableInt());
assertEquals(false, result.isSetUnsettableLong());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(false, result.isSetUnsettableShort());
assertEquals(true, result.isSetUnsettableString());
assertEquals(false, result.isSetUnsettableVAT());
}
public void testUnsettableBaseTypeVsObjectType() throws Exception
{
EPackage pkg = createUniquePackage();
EClass cls = EMFUtil.createEClass(pkg, "unsettableClass", false, false);
EAttribute baseElement = EMFUtil.createEAttribute(cls, "baseElement", EcorePackage.eINSTANCE.getEInt());
baseElement.setUnsettable(true);
baseElement.setDefaultValue(23);
EAttribute objectElement = EMFUtil.createEAttribute(cls, "objectElement", EcorePackage.eINSTANCE.getEIntegerObject());
objectElement.setUnsettable(true);
objectElement.setDefaultValue(42);
if (!isConfig(LEGACY))
{
CDOUtil.prepareDynamicEPackage(pkg);
}
{
EObject test1 = EcoreUtil.create(cls);
test1.eSet(baseElement, 1);
test1.eSet(objectElement, 2);
EObject test2 = EcoreUtil.create(cls);
test2.eSet(baseElement, 23);
test2.eSet(objectElement, 42);
EObject test3 = EcoreUtil.create(cls);
test3.eSet(baseElement, null);
test3.eSet(objectElement, null);
EObject test4 = EcoreUtil.create(cls);
test4.eUnset(baseElement);
test4.eUnset(objectElement);
assertEquals(true, test1.eIsSet(baseElement));
assertEquals(true, test1.eIsSet(objectElement));
assertEquals(1, test1.eGet(baseElement));
assertEquals(2, test1.eGet(objectElement));
assertEquals(true, test2.eIsSet(baseElement));
assertEquals(true, test2.eIsSet(objectElement));
assertEquals(23, test2.eGet(baseElement));
assertEquals(42, test2.eGet(objectElement));
// for basetypes, setting value null seems to be equivalent
// to unset.
assertEquals(false, test3.eIsSet(baseElement));
assertEquals(true, test3.eIsSet(objectElement));
assertEquals(23, test3.eGet(baseElement));
assertNull(test3.eGet(objectElement));
assertEquals(false, test4.eIsSet(baseElement));
assertEquals(false, test4.eIsSet(objectElement));
assertEquals(23, test4.eGet(baseElement));
assertEquals(42, test4.eGet(objectElement));
CDOSession session = openSession();
session.getPackageRegistry().putEPackage(pkg);
CDOTransaction transaction = session.openTransaction();
CDOResource res = transaction.createResource(getResourcePath("/test1"));
res.getContents().add(test1);
res.getContents().add(test2);
res.getContents().add(test3);
res.getContents().add(test4);
transaction.commit();
transaction.close();
session.close();
}
clearCache(getRepository().getRevisionManager());
{
CDOSession session = openSession();
session.getPackageRegistry().putEPackage(pkg);
CDOView view = session.openTransaction();
CDOResource res = view.getResource(getResourcePath("/test1"));
assertEquals(4, res.getContents().size());
EObject test1 = res.getContents().get(0);
EObject test2 = res.getContents().get(1);
EObject test3 = res.getContents().get(2);
EObject test4 = res.getContents().get(3);
assertEquals(true, test1.eIsSet(baseElement));
assertEquals(true, test1.eIsSet(objectElement));
assertEquals(1, test1.eGet(baseElement));
assertEquals(2, test1.eGet(objectElement));
assertEquals(true, test2.eIsSet(baseElement));
assertEquals(true, test2.eIsSet(objectElement));
assertEquals(23, test2.eGet(baseElement));
assertEquals(42, test2.eGet(objectElement));
assertEquals(false, test3.eIsSet(baseElement));
assertEquals(true, test3.eIsSet(objectElement));
assertEquals(23, test3.eGet(baseElement));
assertNull(test3.eGet(objectElement));
assertEquals(false, test4.eIsSet(baseElement));
assertEquals(false, test4.eIsSet(objectElement));
assertEquals(23, test4.eGet(baseElement));
assertEquals(42, test4.eGet(objectElement));
view.close();
session.close();
}
}
public void testUnsettableObject() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/test1"));
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
resource.getContents().add(unsettable);
assertEquals(false, unsettable.isSetUnsettableElement());
transaction.commit();
assertEquals(false, unsettable.isSetUnsettableElement());
unsettable.setUnsettableElement(null);
assertEquals(true, unsettable.isSetUnsettableElement());
transaction.commit();
assertEquals(true, unsettable.isSetUnsettableElement());
unsettable.unsetUnsettableElement();
assertEquals(false, unsettable.isSetUnsettableElement());
transaction.commit();
assertEquals(false, unsettable.isSetUnsettableElement());
Company company = getModel1Factory().createCompany();
unsettable.eResource().getContents().add(company);
unsettable.setUnsettableElement(company);
assertEquals(true, unsettable.isSetUnsettableElement());
transaction.commit();
assertEquals(true, unsettable.isSetUnsettableElement());
}
public void testIsSetElement() throws Exception
{
Unsettable1 unsettable = getModel2Factory().createUnsettable1();
unsettable.setUnsettableElement(null);
Unsettable1 result = commitAndLoad(unsettable);
assertEquals(true, result.isSetUnsettableElement());
}
@Override
protected void doTearDown() throws Exception
{
commitAndLoadSession = null;
commitAndLoadTransaction = null;
super.doTearDown();
}
private <T extends EObject> T commitAndLoad(T object) throws Exception
{
msg("Committing...");
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/test1"));
resource.getContents().add(object);
transaction.commit();
session.close();
clearCache(getRepository().getRevisionManager());
msg("Loading...");
session = openSession();
CDOView view = session.openView();
resource = view.getResource(getResourcePath("/test1"));
@SuppressWarnings("unchecked")
T result = (T)resource.getContents().get(0);
return result;
}
private <T extends EObject> T commitAndLoadTx(T object) throws Exception
{
if (commitAndLoadSession == null)
{
commitAndLoadSession = openSession();
commitAndLoadTransaction = commitAndLoadSession.openTransaction();
CDOResource resource = commitAndLoadTransaction.createResource(getResourcePath("/test1"));
resource.getContents().add(object);
}
commitAndLoadTransaction.commit();
commitAndLoadTransaction.close();
commitAndLoadSession.close();
clearCache(getRepository().getRevisionManager());
commitAndLoadSession = openSession();
commitAndLoadTransaction = commitAndLoadSession.openTransaction();
CDOResource resource = commitAndLoadTransaction.getResource(getResourcePath("/test1"));
@SuppressWarnings("unchecked")
T result = (T)resource.getContents().get(0);
return result;
}
}