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;
}
}
}