package org.tynamo.hibernate.services;
import java.util.Iterator;
import org.apache.tapestry5.hibernate.HibernateConfigurer;
import org.apache.tapestry5.hibernate.HibernateSessionSource;
import org.apache.tapestry5.hibernate.HibernateTransactionAdvisor;
import org.apache.tapestry5.ioc.Configuration;
import org.apache.tapestry5.ioc.MappedConfiguration;
import org.apache.tapestry5.ioc.MethodAdviceReceiver;
import org.apache.tapestry5.ioc.OrderedConfiguration;
import org.apache.tapestry5.ioc.ServiceBinder;
import org.apache.tapestry5.ioc.annotations.Autobuild;
import org.apache.tapestry5.ioc.annotations.Contribute;
import org.apache.tapestry5.ioc.annotations.InjectService;
import org.apache.tapestry5.ioc.annotations.Match;
import org.apache.tapestry5.ioc.services.FactoryDefaults;
import org.apache.tapestry5.ioc.services.SymbolProvider;
import org.apache.tapestry5.services.BeanBlockContribution;
import org.apache.tapestry5.services.BeanBlockSource;
import org.apache.tapestry5.services.ClasspathAssetAliasManager;
import org.apache.tapestry5.services.ComponentClassResolver;
import org.apache.tapestry5.services.LibraryMapping;
import org.apache.tapestry5.services.messages.ComponentMessagesSource;
import org.hibernate.mapping.PersistentClass;
import org.tynamo.common.ModuleProperties;
import org.tynamo.descriptor.decorators.DescriptorDecorator;
import org.tynamo.descriptor.factories.DescriptorFactory;
import org.tynamo.hibernate.TynamoHibernateSymbols;
import org.tynamo.hibernate.TynamoInterceptor;
import org.tynamo.hibernate.TynamoInterceptorConfigurer;
import org.tynamo.hibernate.decorators.HibernateDescriptorDecorator;
import org.tynamo.services.DescriptorService;
import org.tynamo.services.TynamoCoreModule;
public class TynamoHibernateModule
{
private static final String version = ModuleProperties.getVersion(TynamoCoreModule.class);
public static void bind(ServiceBinder binder)
{
// Make bind() calls on the binder object to define most IoC services.
// Use service builder methods (example below) when the implementation
// is provided inline, or requires more initialization than simply
// invoking the constructor.
binder.bind(HibernatePersistenceService.class, HibernatePersistenceServiceImpl.class);
binder.bind(TynamoInterceptor.class);
binder.bind(HibernateConfigurer.class, TynamoInterceptorConfigurer.class).withId("TynamoInterceptorConfigurer");
}
/**
* Add our components and pages to the "tynamo" library.
*/
@Contribute(ComponentClassResolver.class)
public static void componentClassResolver(Configuration<LibraryMapping> configuration)
{
configuration.add(new LibraryMapping("tynamo", "org.tynamo.hibernate"));
}
@Contribute(ClasspathAssetAliasManager.class)
public static void classpathAssetAliasManager(MappedConfiguration<String, String> configuration)
{
configuration.add("tynamo-hibernate-" + version, "org/tynamo/hibernate");
}
@Contribute(ComponentMessagesSource.class)
public static void componentMessagesSource(OrderedConfiguration<String> configuration)
{
configuration.add("Tynamo", "ValidationMessages");
}
@Match("HibernatePersistenceService")
public static void adviseTransactions(HibernateTransactionAdvisor advisor, MethodAdviceReceiver receiver)
{
advisor.addTransactionCommitAdvice(receiver);
}
/**
* Contributions to the DefaultDataTypeAnalyzer.
* <p/>
* DataTypeAnalyzer is a chain of command that can make match properties to data types based on property type or
* annotations on the property. In general, DefaultDataTypeAnalyzer is used, as that only needs to consider property
* type. DefaultDataTypeAnalyzer matches property types to data types, based on a search up the inheritance path.
*/
public static void contributeDefaultDataTypeAnalyzer(MappedConfiguration<Class, String> configuration)
{
}
/**
* Contribution to the BeanBlockSource service to tell the BeanEditForm component about the editors. When the
* BeanEditForm sees a property of type BigDecimal, it will map that to datatype "currency" and from there to the
* currency block of the AppPropertyEditBlocks page of the application.
*/
@Contribute(BeanBlockSource.class)
public static void beanBlockSource(Configuration<BeanBlockContribution> configuration)
{
}
@Contribute(DescriptorFactory.class)
public static void descriptorFactory(OrderedConfiguration<DescriptorDecorator> configuration,
@Autobuild HibernateDescriptorDecorator hibernateDescriptorDecorator)
{
configuration.add("HibernateDescriptorDecorator", hibernateDescriptorDecorator, "after:TynamoDecorator");
}
@Contribute(DescriptorService.class)
public static void descriptorService(Configuration<Class> configuration,
HibernateSessionSource hibernateSessionSource)
{
org.hibernate.cfg.Configuration config = hibernateSessionSource.getConfiguration();
Iterator<PersistentClass> mappings = config.getClassMappings();
while (mappings.hasNext())
{
final PersistentClass persistentClass = mappings.next();
final Class entityClass = persistentClass.getMappedClass();
if (entityClass != null)
{
configuration.add(entityClass);
}
}
}
@Contribute(SymbolProvider.class)
@FactoryDefaults
public static void setupFactoryDefaultsSymbols(MappedConfiguration<String, String> configuration)
{
configuration.add(TynamoHibernateSymbols.LARGE_COLUMN_LENGTH, "100");
configuration.add(TynamoHibernateSymbols.IGNORE_NON_HIBERNATE_TYPES, "false");
}
/**
* Adds the following configurers:
* <dl>
* <dt>TynamoInterceptorConfigurer
* <dd>add the TynamoInterceptor to the hibernate configuration
*/
@Contribute(HibernateSessionSource.class)
public static void hibernateSessionSource(OrderedConfiguration<HibernateConfigurer> config,
@InjectService("TynamoInterceptorConfigurer")
HibernateConfigurer interceptorConfigurer)
{
config.add("TynamoInterceptorConfigurer", interceptorConfigurer);
}
/*
public static void contributeTynamoEntityPackageManager(Configuration<String> configuration, HibernateEntityPackageManager packageManager)
{
for (String packageName : packageManager.getPackageNames())
{
configuration.add(packageName);
}
}
*/
/*
public static void contributeFieldValidatorSource(MappedConfiguration<String, Validator> configuration) {
configuration.add("int", new ValidateInt());
}
*/
}