package org.tynamo.hibernate;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.apache.tapestry5.func.F;
import org.apache.tapestry5.func.Predicate;
import org.apache.tapestry5.hibernate.modules.HibernateCoreModule;
import org.apache.tapestry5.hibernate.modules.HibernateModule;
import org.apache.tapestry5.ioc.Registry;
import org.apache.tapestry5.ioc.RegistryBuilder;
import org.apache.tapestry5.modules.TapestryModule;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
import org.tynamo.descriptor.CollectionDescriptor;
import org.tynamo.descriptor.EmbeddedDescriptor;
import org.tynamo.descriptor.IdentifierDescriptor;
import org.tynamo.descriptor.TynamoClassDescriptor;
import org.tynamo.descriptor.TynamoClassDescriptorImpl;
import org.tynamo.descriptor.TynamoPropertyDescriptor;
import org.tynamo.descriptor.TynamoPropertyDescriptorImpl;
import org.tynamo.descriptor.decorators.DescriptorDecorator;
import org.tynamo.hibernate.decorators.HibernateDescriptorDecorator;
import org.tynamo.model.test.entities.Bar;
import org.tynamo.model.test.entities.Baz;
import org.tynamo.model.test.entities.Descendant;
import org.tynamo.model.test.entities.Embeddee;
import org.tynamo.model.test.entities.Embeddor;
import org.tynamo.model.test.entities.Foo;
import org.tynamo.model.test.entities.IBar;
import org.tynamo.services.TynamoCoreModule;
public class HibernateDescriptorDecoratorTest
{
DescriptorDecorator hibernateDescriptorDecorator;
TynamoClassDescriptor classDescriptor;
private static Registry registry;
@BeforeSuite
public final void setup_registry()
{
RegistryBuilder builder = new RegistryBuilder();
builder.add(TapestryModule.class);
builder.add(HibernateCoreModule.class);
builder.add(HibernateModule.class);
builder.add(TynamoCoreModule.class);
builder.add(TestModule.class);
registry = builder.build();
registry.performRegistryStartup();
}
@AfterSuite
public final void shutdown_registry()
{
registry.shutdown();
registry = null;
}
@AfterMethod
public final void cleanupThread()
{
registry.cleanupThread();
}
@BeforeMethod
public void setUp()
{
hibernateDescriptorDecorator = registry.getService(HibernateDescriptorDecorator.class);
TynamoClassDescriptor fooDescriptor = new TynamoClassDescriptorImpl(Foo.class);
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "bazzes", Set.class));
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "bings", Set.class));
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "id", Integer.class));
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "name", String.class));
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "hidden", String.class));
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "date", Date.class));
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "readOnly", String.class));
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "multiWordProperty", String.class));
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "primitive", boolean.class));
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "bar", IBar.class));
fooDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "fromFormula", String.class));
classDescriptor = hibernateDescriptorDecorator.decorate(fooDescriptor);
}
@Test
public void testNameDescriptor() throws Exception
{
TynamoPropertyDescriptor nameDescriptor = classDescriptor.getPropertyDescriptor("name");
Assert.assertEquals(nameDescriptor.getName(), "name", "is name");
}
@Test
public void testIdDescriptor() throws Exception
{
IdentifierDescriptor idDescriptor = (IdentifierDescriptor) classDescriptor.getIdentifierDescriptor();
Assert.assertTrue(idDescriptor.isIdentifier(), "is id");
Assert.assertFalse(idDescriptor.isGenerated(), "not generated");
}
@Test
public void testFormulaDescriptor() throws Exception
{
TynamoPropertyDescriptor formulaDescriptor = classDescriptor.getPropertyDescriptor("fromFormula");
Assert.assertTrue(formulaDescriptor.isReadOnly());
}
@Test
public void testCollectionDescriptor() throws Exception
{
CollectionDescriptor bazzesDescriptor = (CollectionDescriptor) classDescriptor.getPropertyDescriptor("bazzes");
Assert.assertTrue(bazzesDescriptor.isCollection(), "bazzes is a collection");
Assert.assertEquals(bazzesDescriptor.getElementType(), Baz.class, "right element type");
Assert.assertTrue(bazzesDescriptor.isChildRelationship(), "bazzes are children");
Assert.assertTrue(bazzesDescriptor.isOneToMany());
Assert.assertEquals(bazzesDescriptor.getInverseProperty(), "foo", "bazzes are mapped by 'foo' property in Baz");
// @note: HibernateDescriptorDecorator doesn't set hasCyclicRelationships anymore but it might do it again if we
// switch from Descriptors to Extensions
// Assert.assertTrue(classDescriptor.getHasCyclicRelationships(), "Foo has a cyclic relationship");
}
@Test
public void testGetClassDescriptors() throws Exception
{
Assert.assertFalse(classDescriptor.isChild(), "not a child");
List<TynamoPropertyDescriptor> propertyDescriptors = classDescriptor.getPropertyDescriptors();
Assert.assertEquals(propertyDescriptors.size(), 11, "got 11");
class NameFilter implements Predicate<TynamoPropertyDescriptor>
{
private String nameToFilter;
NameFilter(String nameToFilter)
{
this.nameToFilter = nameToFilter;
}
@Override
public boolean accept(TynamoPropertyDescriptor tynamoPropertyDescriptor)
{
return nameToFilter.equals(tynamoPropertyDescriptor.getName());
}
}
TynamoPropertyDescriptor barDescriptor = F.flow(propertyDescriptors).filter(new NameFilter("bar")).toList().get(0);
Assert.assertEquals(barDescriptor.getName(), "bar", "name");
Assert.assertTrue(!barDescriptor.isIdentifier(), "is not an id");
TynamoPropertyDescriptor hiddenDescriptor = F.flow(propertyDescriptors).filter(new NameFilter("hidden")).toList().get(0);
Assert.assertNotNull(hiddenDescriptor, "didn't blow up");
TynamoPropertyDescriptor primitiveDescriptor = F.flow(propertyDescriptors).filter(new NameFilter("primitive")).toList().get(0);
Assert.assertTrue(primitiveDescriptor.isBoolean(), "is boolean");
}
@Test
public void testIsObjectReference() throws Exception
{
TynamoPropertyDescriptor propertyDescriptor = classDescriptor.getPropertyDescriptor("bar");
Assert.assertTrue(propertyDescriptor.isObjectReference());
Assert.assertEquals(propertyDescriptor.getPropertyType(), Bar.class, "got right class");
TynamoPropertyDescriptor primitiveDescriptor = classDescriptor.getPropertyDescriptor("primitive");
Assert.assertFalse(primitiveDescriptor.isObjectReference());
}
@Test
public void testLengthLarge() throws Exception
{
TynamoPropertyDescriptor multiWordDescriptor = classDescriptor.getPropertyDescriptor("multiWordProperty");
Assert.assertTrue(multiWordDescriptor.isLarge());
Assert.assertEquals(multiWordDescriptor.getLength(), 101, "right length");
TynamoPropertyDescriptor nameDescriptor = classDescriptor.getPropertyDescriptor("name");
Assert.assertFalse(nameDescriptor.isLarge(), "not large");
}
@Test
public void testInheritance() throws Exception
{
TynamoClassDescriptor descendantDescriptor = new TynamoClassDescriptorImpl(Descendant.class);
descendantDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "bazzes", Set.class));
descendantDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "extra", String.class));
descendantDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "id", Integer.class));
descendantDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Foo.class, "name", String.class));
TynamoClassDescriptor decorated = hibernateDescriptorDecorator.decorate(descendantDescriptor);
Assert.assertEquals(4, decorated.getPropertyDescriptors().size());
}
@Test
public void testEmbedded() throws Exception
{
TynamoClassDescriptor embeddorDescriptor = new TynamoClassDescriptorImpl(Embeddor.class);
embeddorDescriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Embeddor.class, "embeddee", Embeddee.class));
TynamoClassDescriptor decorated = hibernateDescriptorDecorator.decorate(embeddorDescriptor);
TynamoPropertyDescriptor propertyDescriptor = decorated.getPropertyDescriptors().get(0);
Assert.assertTrue(propertyDescriptor.isEmbedded());
EmbeddedDescriptor embeddedDescriptor = (EmbeddedDescriptor) propertyDescriptor;
Assert.assertEquals("embeddee", embeddedDescriptor.getName());
Assert.assertEquals(Embeddor.class, embeddedDescriptor.getBeanType(), "right bean type");
Assert.assertEquals(3, embeddedDescriptor.getEmbeddedClassDescriptor().getPropertyDescriptors().size(), "3 prop descriptors");
}
@Test
public void testTransient() throws Exception
{
TynamoClassDescriptor descriptor = new TynamoClassDescriptorImpl(Bar.class);
descriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Bar.class, "name", String.class));
descriptor.getPropertyDescriptors().add(new TynamoPropertyDescriptorImpl(Bar.class, "transientProperty", String.class));
TynamoClassDescriptor decorated = hibernateDescriptorDecorator.decorate(descriptor);
Assert.assertFalse(decorated.getPropertyDescriptor("transientProperty").isSearchable());
Assert.assertTrue(decorated.getPropertyDescriptor("name").isSearchable());
}
}