Skip to main content
summaryrefslogblamecommitdiffstats
blob: f627508875e4a0f0b8a2146776a068b199ca3ef8 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
   
                                                                       









                                                                        
                                                


                                                 
                                            

                                                      
                                        






                                        
                                          


                                                           
                                            

                                                               

                      




                                              
     
                                 



                                          
                                 


                                                  
     
                                                                                                


                                   
                                        



                                                                                                                     






                                                                                              







                                                                    


































































                                                                    
                                             









                                                         






















































                                                                    




                                                        





































































































































































































                                                                                                            

                                                                             

                                      



                                          







































                                                                 

                                                    















                                                             

                                                    

































                                                   









                                                                        

                                                     







                                                

























                                                                               
 
/**
 * Copyright (c) 2004 - 2010 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
 */
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.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("/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("/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("/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("/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("/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("/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 = EMFUtil.createEPackage("unsettablePackage", "unset",
        "http://cdo.eclipse.org/unsettablePackage.ecore");
    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);

      assertTrue(test1.eIsSet(baseElement));
      assertTrue(test1.eIsSet(objectElement));
      assertEquals(1, test1.eGet(baseElement));
      assertEquals(2, test1.eGet(objectElement));

      assertTrue(test2.eIsSet(baseElement));
      assertTrue(test2.eIsSet(objectElement));
      assertEquals(23, test2.eGet(baseElement));
      assertEquals(42, test2.eGet(objectElement));

      // for basetypes, setting value null seems to be equivalent
      // to unset.
      assertFalse(test3.eIsSet(baseElement));
      assertTrue(test3.eIsSet(objectElement));
      assertEquals(23, test3.eGet(baseElement));
      assertNull(test3.eGet(objectElement));

      assertFalse(test4.eIsSet(baseElement));
      assertFalse(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("/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("/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);

      assertTrue(test1.eIsSet(baseElement));
      assertTrue(test1.eIsSet(objectElement));
      assertEquals(1, test1.eGet(baseElement));
      assertEquals(2, test1.eGet(objectElement));

      assertTrue(test2.eIsSet(baseElement));
      assertTrue(test2.eIsSet(objectElement));
      assertEquals(23, test2.eGet(baseElement));
      assertEquals(42, test2.eGet(objectElement));

      assertFalse(test3.eIsSet(baseElement));
      assertTrue(test3.eIsSet(objectElement));
      assertEquals(23, test3.eGet(baseElement));
      assertNull(test3.eGet(objectElement));

      assertFalse(test4.eIsSet(baseElement));
      assertFalse(test4.eIsSet(objectElement));
      assertEquals(23, test4.eGet(baseElement));
      assertEquals(42, test4.eGet(objectElement));

      view.close();
      session.close();
    }
  }

  private <T extends EObject> T commitAndLoad(T object) throws Exception
  {
    CDOSession session = openSession();
    CDOTransaction transaction = session.openTransaction();
    CDOResource resource = transaction.createResource("/test1");

    resource.getContents().add(object);
    transaction.commit();
    session.close();

    clearCache(getRepository().getRevisionManager());

    session = openSession();
    CDOView view = session.openView();
    resource = view.getResource("/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("/test1");
      resource.getContents().add(object);
    }

    commitAndLoadTransaction.commit();
    commitAndLoadTransaction.close();
    commitAndLoadSession.close();

    clearCache(getRepository().getRevisionManager());

    commitAndLoadSession = openSession();
    commitAndLoadTransaction = commitAndLoadSession.openTransaction();
    CDOResource resource = commitAndLoadTransaction.getResource("/test1");

    @SuppressWarnings("unchecked")
    T result = (T)resource.getContents().get(0);
    return result;
  }
}

Back to the top