Package org.apache.ojb.broker.metadata

Source Code of org.apache.ojb.broker.metadata.PersistentFieldTest

package org.apache.ojb.broker.metadata;

import java.util.Collection;

import org.apache.commons.beanutils.BasicDynaClass;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.DynaClass;
import org.apache.commons.beanutils.DynaProperty;
import org.apache.commons.lang.SerializationUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.ojb.broker.metadata.fieldaccess.PersistentField;
import org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldAutoProxyImpl;
import org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectImpl;
import org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDynaBeanImpl;
import org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldIntrospectorImpl;
import org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldPrivilegedImpl;
import org.apache.ojb.broker.util.ClassHelper;
import org.apache.ojb.broker.util.configuration.impl.OjbConfiguration;
import org.apache.ojb.broker.util.configuration.impl.OjbConfigurator;
import org.apache.ojb.junit.OJBTestCase;

/* Copyright 2002-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/**
* Test to check the capability of the {@link org.apache.ojb.broker.metadata.fieldaccess.PersistentField}
* implementations.
*
* @author <a href="mailto:arminw@apache.org">Armin Waibel</a>
* @version $Id: PersistentFieldTest.java,v 1.8.2.2 2005/12/21 22:31:24 tomdz Exp $
*/
public class PersistentFieldTest extends OJBTestCase
{
    private Class oldPFClass;

    Class[] persistentFieldClasses = new Class[]{
        PersistentFieldDirectImpl.class
        , PersistentFieldIntrospectorImpl.class
        , PersistentFieldPrivilegedImpl.class
        , PersistentFieldAutoProxyImpl.class
        , PersistentFieldDynaBeanImpl.class};

    public static void main(String[] args)
    {
        String[] arr = {PersistentFieldTest.class.getName()};
        junit.textui.TestRunner.main(arr);
    }

    protected void setUp() throws Exception
    {
        super.setUp();
        oldPFClass = ((OjbConfiguration) OjbConfigurator.getInstance()
                .getConfigurationFor(null)).getPersistentFieldClass();
    }

    protected void tearDown() throws Exception
    {
        super.tearDown();
        ((OjbConfiguration) OjbConfigurator.getInstance()
                .getConfigurationFor(null)).setPersistentFieldClass(oldPFClass);
    }

    private void runFieldTestsFor(Class targetClass, boolean supportJavaBeanNames) throws Exception
    {
        ((OjbConfiguration) OjbConfigurator.getInstance().getConfigurationFor(null)).setPersistentFieldClass(targetClass);

        PersistentField pfNM_Name = newInstance(targetClass, NestedMain.class, NESTED_MAIN_NAME);
        PersistentField pfNDD_RD = newInstance(targetClass, NestedMain.class, NESTED_DETAIL_DETAIL_REAL_DETAIL);
        PersistentField pfNDD_RDD = newInstance(targetClass, NestedMain.class, NESTED_DETAIL_DETAIL_REAL_DESCRIPTION);
        PersistentField pfND_MJB = null;
        PersistentField pfNE_Name = null;
        if (supportJavaBeanNames)
        {
            pfND_MJB = newInstance(targetClass, NestedMain.class, NESTED_DETAIL_MORE_JAVA_BEAN);
            pfNE_Name = newInstance(targetClass, NestedMain.class, NESTED_ENTRY_NAME);
        }

        // test getter
        NestedMain nm = createNestedObject();
        Object result = pfNM_Name.get(nm);
        assertEquals(NESTED_MAIN_NAME_VALUE, result);
        result = pfNDD_RD.get(nm);
        assertEquals(NESTED_DETAIL_DETAIL_REAL_DETAIL_VALUE, result);
        result = pfNDD_RDD.get(nm);
        assertEquals(NESTED_DETAIL_DETAIL_REAL_DESCRIPTION_VALUE, result);

        if (supportJavaBeanNames)
        {
            result = pfND_MJB.get(nm);
            assertEquals(NESTED_DETAIL_MORE_JAVA_BEAN_VALUE, result);
            result = pfNE_Name.get(nm);
            assertEquals(NESTED_ENTRY_NAME_VALUE, result);
        }

        NestedMain newNM = new NestedMain();
        // test setter
        pfNM_Name.set(newNM, NESTED_MAIN_NAME_VALUE);
        pfNDD_RD.set(newNM, NESTED_DETAIL_DETAIL_REAL_DETAIL_VALUE);
        result = pfNDD_RDD.get(newNM);
        assertEquals(NESTED_DETAIL_DETAIL_REAL_DESCRIPTION_VALUE, result);

        result = pfNM_Name.get(newNM);
        assertEquals(NESTED_MAIN_NAME_VALUE, result);
        result = pfNDD_RD.get(newNM);
        assertEquals(NESTED_DETAIL_DETAIL_REAL_DETAIL_VALUE, result);

        if (supportJavaBeanNames)
        {
            pfND_MJB.set(newNM, NESTED_DETAIL_MORE_JAVA_BEAN_VALUE);
            pfNE_Name.set(newNM, NESTED_ENTRY_NAME_VALUE);
            result = pfND_MJB.get(newNM);
            assertEquals(NESTED_DETAIL_MORE_JAVA_BEAN_VALUE, result);
            result = pfNE_Name.get(newNM);
            assertEquals(NESTED_ENTRY_NAME_VALUE, result);
        }

        // serialize fields and test again
        pfNM_Name = (PersistentField) SerializationUtils.deserialize(SerializationUtils.serialize(pfNM_Name));
        pfNDD_RD = (PersistentField) SerializationUtils.deserialize(SerializationUtils.serialize(pfNDD_RD));
        pfNDD_RDD = (PersistentField) SerializationUtils.deserialize(SerializationUtils.serialize(pfNDD_RDD));
        if (supportJavaBeanNames)
        {
            pfND_MJB = (PersistentField) SerializationUtils.deserialize(SerializationUtils.serialize(pfND_MJB));
            pfNE_Name = (PersistentField) SerializationUtils.deserialize(SerializationUtils.serialize(pfNE_Name));
        }

        // test getter
        nm = createNestedObject();
        result = pfNM_Name.get(nm);
        assertEquals(NESTED_MAIN_NAME_VALUE, result);
        result = pfNDD_RD.get(nm);
        assertEquals(NESTED_DETAIL_DETAIL_REAL_DETAIL_VALUE, result);
        result = pfNDD_RDD.get(nm);
        assertEquals(NESTED_DETAIL_DETAIL_REAL_DESCRIPTION_VALUE, result);

        if (supportJavaBeanNames)
        {
            result = pfND_MJB.get(nm);
            assertEquals(NESTED_DETAIL_MORE_JAVA_BEAN_VALUE, result);
            result = pfNE_Name.get(nm);
            assertEquals(NESTED_ENTRY_NAME_VALUE, result);
        }

        newNM = new NestedMain();
        // test setter
        pfNM_Name.set(newNM, NESTED_MAIN_NAME_VALUE);
        pfNDD_RD.set(newNM, NESTED_DETAIL_DETAIL_REAL_DETAIL_VALUE);
        result = pfNDD_RDD.get(newNM);
        assertEquals(NESTED_DETAIL_DETAIL_REAL_DESCRIPTION_VALUE, result);

        result = pfNM_Name.get(newNM);
        assertEquals(NESTED_MAIN_NAME_VALUE, result);
        result = pfNDD_RD.get(newNM);
        assertEquals(NESTED_DETAIL_DETAIL_REAL_DETAIL_VALUE, result);

        if (supportJavaBeanNames)
        {
            pfND_MJB.set(newNM, NESTED_DETAIL_MORE_JAVA_BEAN_VALUE);
            pfNE_Name.set(newNM, NESTED_ENTRY_NAME_VALUE);
            result = pfND_MJB.get(newNM);
            assertEquals(NESTED_DETAIL_MORE_JAVA_BEAN_VALUE, result);
            result = pfNE_Name.get(newNM);
            assertEquals(NESTED_ENTRY_NAME_VALUE, result);
        }
    }

    private void checkBoundaryConditions(Class targetClass) throws Exception
    {
        checkBoundaryConditions(targetClass, true);
    }

    private void checkBoundaryConditions(Class targetClass, boolean withNested) throws Exception
    {
        PersistentField pf = newInstance(targetClass, NestedMain.class, NESTED_MAIN_NAME);
        pf.get(null);
        pf.set(null, null);
        pf = newInstance(targetClass, NestedMain.class, NESTED_MAIN_NAME);
        pf.get(null);
        pf.set(null, "kkddk");
        if(withNested)
        {
            PersistentField pf_2 = newInstance(targetClass, NestedMain.class, NESTED_DETAIL_DETAIL_REAL_DETAIL);
            pf_2.get(null);
            pf_2.set(null, null);
            pf_2 = newInstance(targetClass, NestedMain.class, NESTED_DETAIL_DETAIL_REAL_DETAIL);
            pf_2.get(null);
            pf_2.set(null, "gkfgfg");
        }
    }

    public void testDirectAccess() throws Exception
    {
        runFieldTestsFor(PersistentFieldDirectImpl.class, false);
        checkBoundaryConditions(PersistentFieldDirectImpl.class);
    }

    public void testPrivileged() throws Exception
    {
        runFieldTestsFor(PersistentFieldPrivilegedImpl.class, false);
        checkBoundaryConditions(PersistentFieldPrivilegedImpl.class);
    }

    public void testIntrospector() throws Exception
    {
        runFieldTestsFor(PersistentFieldIntrospectorImpl.class, true);
        checkBoundaryConditions(PersistentFieldIntrospectorImpl.class);
    }

    public void testAutoProxy() throws Exception
    {
        runFieldTestsFor(PersistentFieldAutoProxyImpl.class, true);
        checkBoundaryConditions(PersistentFieldAutoProxyImpl.class);
    }

    public void testDynaBean() throws Exception
    {
        checkBoundaryConditions(PersistentFieldDynaBeanImpl.class, false);

        DynaClass dynaClass = createDynaClass();
        DynaBean bean = dynaClass.newInstance();
        bean.set("name", "testDynaBean");

        PersistentField pf = new PersistentFieldDynaBeanImpl(String.class, "name");
        String result = (String) pf.get(bean);
        assertNotNull(result);
        assertEquals("testDynaBean", result);

        pf.set(bean, "XXXX");
        result = (String) pf.get(bean);
        assertNotNull(result);
        assertEquals("XXXX", result);
    }

    public void testAutoProxyWithDyna() throws Exception
    {
        DynaClass dynaClass = createDynaClass();
        DynaBean bean = dynaClass.newInstance();
        bean.set("name", "testDynaBean");

        PersistentField pf = new PersistentFieldAutoProxyImpl(String.class, "name");
        String result = (String) pf.get(bean);
        assertNotNull(result);
        assertEquals("testDynaBean", result);

        pf.set(bean, "XXXX");
        result = (String) pf.get(bean);
        assertNotNull(result);
        assertEquals("XXXX", result);
    }



    //************************************************************************
    // helper methods
    //************************************************************************
    private NestedMain createNestedObject()
    {
        NestedEntry ne = new NestedEntry(NESTED_ENTRY_NAME_VALUE);
        NestedDetailDetail ndd = new NestedDetailDetail(NESTED_DETAIL_DETAIL_REAL_DETAIL_VALUE, null);
        NestedDetail nd = new NestedDetail(ndd);
        nd.setMoreJavaBeans(NESTED_DETAIL_MORE_JAVA_BEAN_VALUE);
        NestedMain main = new NestedMain(NESTED_MAIN_NAME_VALUE, nd);
        main.setNestedEntry(ne);
        main.setJavaBeansField(NESTED_MAIN_JAVA_BEAN_VALUE);

        return main;
    }

    private PersistentField newInstance(Class pfClass, Class testClass, String fieldName) throws Exception
    {
        Class[] types = new Class[]{Class.class, String.class};
        Object[] args = new Object[]{testClass, fieldName};
        return (PersistentField) ClassHelper.newInstance(pfClass, types, args);
    }

    protected DynaClass createDynaClass()
    {
        DynaClass dynaClass = new BasicDynaClass
                ("TestDynaClass", null,
                        new DynaProperty[]{
                            new DynaProperty("name", String.class),
                        });
        return (dynaClass);
    }


    //************************************************************************
    // inner classes - used test classes
    //************************************************************************

    static String NESTED_MAIN_NAME = "name";
    static String NESTED_MAIN_NAME_VALUE = "name_value";

    static String NESTED_MAIN_JAVA_BEAN = "javaBeansField";
    static String NESTED_MAIN_JAVA_BEAN_VALUE = "javaBeansField_value";

    static String NESTED_MAIN_NESTED_ENTRY = "nestedEntry::name";
    static String NESTED_MAIN_NESTED_ENTRY_VALUE = "nestedEntry_value";

    static String NESTED_DETAIL_MORE_JAVA_BEAN = "nestedDetail::moreJavaBeans";
    static String NESTED_DETAIL_MORE_JAVA_BEAN_VALUE = "moreJavaBeans_value";

    static String NESTED_DETAIL_DETAIL_REAL_DETAIL = "nestedDetail::nestedDetailDetail::realDetailName";
    static String NESTED_DETAIL_DETAIL_REAL_DETAIL_VALUE = "realDetailName_value";

    static String NESTED_DETAIL_DETAIL_REAL_DESCRIPTION = "nestedDetail::nestedDetailDetail::realDetailDescription";
    static String NESTED_DETAIL_DETAIL_REAL_DESCRIPTION_VALUE = null;

    static String NESTED_ENTRY_NAME = "nestedEntry::name";
    static String NESTED_ENTRY_NAME_VALUE = "nestedEntryName_value";


    public static class NestedMain
    {
        private Long objId;
        private String name;
        private NestedDetail nestedDetail;
        // getter/setter don't have to match field name
        private String javaBeansFieldXXX;
        // getter/setter don't have to match field name
        private NestedEntry nestedEntryXXX;

        public NestedMain()
        {
        }

        public NestedMain(String name, NestedDetail detail)
        {
            this.name = name;
            this.nestedDetail = detail;
        }

        public NestedEntry getNestedEntry()
        {
            return nestedEntryXXX;
        }

        public void setNestedEntry(NestedEntry nestedEntry)
        {
            this.nestedEntryXXX = nestedEntry;
        }

        public String getJavaBeansField()
        {
            return javaBeansFieldXXX;
        }

        public void setJavaBeansField(String javaBeansField)
        {
            this.javaBeansFieldXXX = javaBeansField;
        }

        public Long getObjId()
        {
            return objId;
        }

        public void setObjId(Long objId)
        {
            this.objId = objId;
        }

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            this.name = name;
        }

        public NestedDetail getNestedDetail()
        {
            return nestedDetail;
        }

        public void setNestedDetail(NestedDetail nestedDetail)
        {
            this.nestedDetail = nestedDetail;
        }

        public String toString()
        {
            ToStringBuilder buf = new ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE);
            buf.append("objId", objId).
                    append("name", name).
                    append("detail", nestedDetail);
            return buf.toString();
        }
    }

    public static class NestedDetail
    {
        private NestedDetailDetail nestedDetailDetail;
        private Collection nestedEntryCollection;
        // getter/setter don't have to match field name
        private String moreJavaBeansXXX;

        public NestedDetail()
        {
        }

        public String getMoreJavaBeans()
        {
            return moreJavaBeansXXX;
        }

        public void setMoreJavaBeans(String moreJavaBeans)
        {
            this.moreJavaBeansXXX = moreJavaBeans;
        }

        public Collection getNestedEntryCollection()
        {
            return nestedEntryCollection;
        }

        public void setNestedEntryCollection(Collection nestedEntryCollection)
        {
            this.nestedEntryCollection = nestedEntryCollection;
        }

        public NestedDetail(NestedDetailDetail detail)
        {
            this.nestedDetailDetail = detail;
        }

        public NestedDetailDetail getNestedDetailDetail()
        {
            return nestedDetailDetail;
        }

        public void setNestedDetailDetail(NestedDetailDetail nestedDetailDetail)
        {
            this.nestedDetailDetail = nestedDetailDetail;
        }

        public String toString()
        {
            ToStringBuilder buf = new ToStringBuilder(this, ToStringStyle.SIMPLE_STYLE);
            buf.append("detail", nestedDetailDetail);
            return buf.toString();
        }
    }

    public static class NestedDetailDetail
    {
        private String realDetailName;
        private String realDetailDescription;

        public NestedDetailDetail()
        {
        }

        public NestedDetailDetail(String realDetailName, String realDetailDescription)
        {
            this.realDetailName = realDetailName;
            this.realDetailDescription = realDetailDescription;
        }

        public String getRealDetailName()
        {
            return realDetailName;
        }

        public void setRealDetailName(String realDetailName)
        {
            this.realDetailName = realDetailName;
        }

        public String getRealDetailDescription()
        {
            return realDetailDescription;
        }

        public void setRealDetailDescription(String realDetailDescription)
        {
            this.realDetailDescription = realDetailDescription;
        }

        public String toString()
        {
            ToStringBuilder buf = new ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE);
            buf.append("realDetailName", realDetailName).
                    append("realDetailDescription", realDetailDescription);
            return buf.toString();
        }
    }

    public static class NestedEntry
    {
        private Integer id;
        private Long fkId;
        private String name;

        public NestedEntry()
        {
        }

        public NestedEntry(String name)
        {
            this.name = name;
        }

        public Integer getId()
        {
            return id;
        }

        public void setId(Integer id)
        {
            this.id = id;
        }

        public Long getFkId()
        {
            return fkId;
        }

        public void setFkId(Long fkId)
        {
            this.fkId = fkId;
        }

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            this.name = name;
        }
    }
}
TOP

Related Classes of org.apache.ojb.broker.metadata.PersistentFieldTest

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.