Package org.apache.ojb.broker

Source Code of org.apache.ojb.broker.BidirectionalAssociationTest

package org.apache.ojb.broker;

import java.util.Iterator;
import java.util.Collection;

import org.apache.ojb.broker.query.Criteria;
import org.apache.ojb.broker.query.Query;
import org.apache.ojb.broker.query.QueryFactory;
import org.apache.ojb.broker.metadata.ClassDescriptor;
import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor;
import org.apache.ojb.junit.PBTestCase;

/**
* tests a bidirectional association A<-->B
* @see org.apache.ojb.odmg.BidirectionalAssociationTest for equivalent test in ODMG
*/
public class BidirectionalAssociationTest extends PBTestCase
{
    public static void main(String[] args)
    {
        String[] arr = {BidirectionalAssociationTest.class.getName()};
        junit.textui.TestRunner.main(arr);
    }

    public BidirectionalAssociationTest(String name)
    {
        super(name);
    }

    public void setUp() throws Exception
    {
        super.setUp();
    }

    public void tearDown() throws Exception
    {
        super.tearDown();
    }

    public void testAutoRefreshTrue()
    {
        String pkSuffix = "_" + System.currentTimeMillis();
        ObjectReferenceDescriptor ord_A = null;
        ObjectReferenceDescriptor ord_B = null;
        ClassDescriptor cld_A = broker.getClassDescriptor(BidirectionalAssociationObjectA.class);
        ord_A = cld_A.getObjectReferenceDescriptorByName("relatedB");
        ClassDescriptor cld_B = broker.getClassDescriptor(BidirectionalAssociationObjectB.class);
        ord_B = cld_B.getObjectReferenceDescriptorByName("relatedA");
        boolean oldA = ord_A.isRefresh();
        boolean oldB = ord_B.isRefresh();
        try
        {
            ord_A.setRefresh(true);
            ord_B.setRefresh(true);
            createWithUpdate(pkSuffix);
            Criteria crit = new Criteria();
            crit.addLike("pk", "%" + pkSuffix);
            Query query = QueryFactory.newQuery(BidirectionalAssociationObjectB.class, crit);
            Collection result = broker.getCollectionByQuery(query);
            assertEquals(1, result.size());
        }
        finally
        {
            if(ord_A != null) ord_A.setRefresh(oldA);
            if(ord_B != null) ord_B.setRefresh(oldB);
        }
    }

    public void testCreateDelete()
    {
        String pkSuffix = "_" + System.currentTimeMillis();
        createWithUpdate(pkSuffix);
        deleteAllA();
        deleteAllB();
    }

    private void createWithUpdate(String pkSuffix)
    {
        broker.beginTransaction();
        BidirectionalAssociationObjectA a = new BidirectionalAssociationObjectA();
        a.setPk("A" + pkSuffix);
        BidirectionalAssociationObjectB b = new BidirectionalAssociationObjectB();
        b.setPk("B" + pkSuffix);
        broker.store(a);
        broker.store(b);
        /**
         * now set relations
         */
        b.setRelatedA(a);
        a.setRelatedB(b);
        /**
         * and update
         */
        broker.store(a);
        broker.store(b);
        broker.commitTransaction();
    }

    public void testGetA() throws Exception
    {
        String pkSuffix = "_" + System.currentTimeMillis();
        createWithUpdate(pkSuffix);

        Criteria crit = new Criteria();
        Query q;
        Iterator iter;
        q = QueryFactory.newQuery(BidirectionalAssociationObjectA.class, crit);
        iter = broker.getIteratorByQuery(q);
        BidirectionalAssociationObjectA temp = null;
        while (iter.hasNext())
        {
            temp = (BidirectionalAssociationObjectA) iter.next();
            if (temp.getRelatedB() == null)
            {
                fail("relatedB not found");
            }
        }

        deleteAllA();
        deleteAllB();
    }

    public void testGetB() throws Exception
    {
        String pkSuffix = "_" + System.currentTimeMillis();
        createWithUpdate(pkSuffix);

        Criteria crit = new Criteria();
        Query q;
        Iterator iter;
        q = QueryFactory.newQuery(BidirectionalAssociationObjectB.class, crit);
        iter = broker.getIteratorByQuery(q);
        BidirectionalAssociationObjectB temp = null;
        while (iter.hasNext())
        {
            temp = (BidirectionalAssociationObjectB) iter.next();
            if (temp.getRelatedA() == null)
            {
                fail("relatedA not found");
            }
        }

        deleteAllA();
        deleteAllB();
    }

    public void testDeleteA()
    {
        String pkSuffix = "_" + System.currentTimeMillis();
        createWithUpdate(pkSuffix);
        deleteAllA();
        deleteAllB();
    }

    public void testDeleteB()
    {
        String pkSuffix = "_" + System.currentTimeMillis();
        createWithUpdate(pkSuffix);
        deleteAllB();
        deleteAllA();
    }

    private void deleteAllA()
    {
        Criteria crit = new Criteria();
        Query q;
        Iterator iter;
        q = QueryFactory.newQuery(BidirectionalAssociationObjectA.class, crit);
        iter = broker.getIteratorByQuery(q);
        BidirectionalAssociationObjectA temp = null;
        broker.beginTransaction();
        while (iter.hasNext())
        {
            temp = (BidirectionalAssociationObjectA) iter.next();
            BidirectionalAssociationObjectB b = temp.getRelatedB();
            if (b != null)
            {
                b.setRelatedA(null);
                broker.store(b);
            }
            broker.delete(temp);
        }
        broker.commitTransaction();
    }

    private void deleteAllB()
    {
        Criteria crit = new Criteria();
        Query q;
        Iterator iter;
        q = QueryFactory.newQuery(BidirectionalAssociationObjectB.class, crit);
        iter = broker.getIteratorByQuery(q);
        BidirectionalAssociationObjectB temp = null;
        broker.beginTransaction();
        while (iter.hasNext())
        {
            temp = (BidirectionalAssociationObjectB) iter.next();
            BidirectionalAssociationObjectA a = temp.getRelatedA();
            if (a != null)
            {
                a.setRelatedB(null);
                broker.store(a);
            }
            broker.delete(temp);
        }
        broker.commitTransaction();
    }
}
TOP

Related Classes of org.apache.ojb.broker.BidirectionalAssociationTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.