package com.googlecode.tawus.services; import java.util.List; import java.util.Map; import org.apache.tapestry5.ioc.Configuration; import org.apache.tapestry5.ioc.MappedConfiguration; import org.apache.tapestry5.ioc.ObjectLocator; 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.services.ChainBuilder; import org.apache.tapestry5.ioc.services.StrategyBuilder; import org.apache.tapestry5.ioc.util.UnknownValueException; import org.apache.tapestry5.services.ApplicationStatePersistenceStrategy; import org.apache.tapestry5.services.BeanBlockContribution; import org.apache.tapestry5.services.ComponentClassResolver; import org.apache.tapestry5.services.DataTypeAnalyzer; import org.apache.tapestry5.services.EditBlockContribution; import org.apache.tapestry5.services.LibraryMapping; import org.apache.tapestry5.services.PersistentFieldStrategy; import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2; import com.googlecode.tawus.internal.EntityApplicationStatePersistenceStrategy; import com.googlecode.tawus.internal.EntityPersistentFieldStrategy; import com.googlecode.tawus.internal.dataanalyzers.EntityAnalyzer; import com.googlecode.tawus.internal.dataanalyzers.EntityListAnalyzer; import com.googlecode.tawus.internal.dataanalyzers.TimeAnalyzer; import com.googlecode.tawus.internal.services.DefaultCriteriaSource; import com.googlecode.tawus.internal.services.EntityDAOLocatorImpl; import com.googlecode.tawus.internal.services.SimpleEntityServiceMapper; import com.googlecode.tawus.internal.services.TawusBeanBlockOverrideSourceImpl; import com.googlecode.tawus.internal.services.TawusBeanBlockSourceImpl; import com.googlecode.tawus.internal.services.TawusDefaultDataTypeAnalyzer; import com.googlecode.tawus.internal.transform.InjectDAOWorker; import com.googlecode.tawus.internal.transform.InjectEntitySelectSupportWorker; import com.googlecode.tawus.internal.transform.XHRWorker; /** * Tawus Module Configuration File */ public class TawusModule { /** * Service binder * * @param binder */ public static void bind(ServiceBinder binder) { binder.bind(TawusBeanBlockSource.class, TawusBeanBlockSourceImpl.class); binder.bind(TawusBeanBlockOverrideSource.class, TawusBeanBlockOverrideSourceImpl.class); binder.bind(EntityServiceMapper.class, SimpleEntityServiceMapper.class); binder.bind(EntityDAOLocator.class, EntityDAOLocatorImpl.class); } /* */ public DataTypeAnalyzer buildTawusDefaultDataTypeAnalyzer(@Autobuild TawusDefaultDataTypeAnalyzer service) { return service; } /** * Contribute the library which will have 'tawus' as prefix * * @param configuration */ @Contribute(ComponentClassResolver.class) public void provideComponentClassResolver(Configuration<LibraryMapping> configuration) { configuration.add(new LibraryMapping("tawus", "com.googlecode.tawus")); } /** * Contribute data type analyzers * * @param configuration * @param tawusDefaultDataTypeAnalyzer */ public static void contributeDataTypeAnalyzer(OrderedConfiguration<DataTypeAnalyzer> configuration) { configuration.add("entity", new EntityAnalyzer("entity"), "before:Default"); configuration.add("entity_list", new EntityListAnalyzer("entity_list"), "before:Default"); configuration.add("time", new TimeAnalyzer("time"), "before:Default"); } /** * Contributing our own text types. This is necessary because we want to form * fields without labels so that we can easily put them inside the tables * * @param configuration */ public static void contributeTawusBeanBlockSource(Configuration<BeanBlockContribution> configuration) { addEditBlock(configuration, "text"); addEditBlock(configuration, "number"); addEditBlock(configuration, "date"); addEditBlock(configuration, "enum"); addEditBlock(configuration, "boolean"); addEditBlock(configuration, "password"); addEditBlock(configuration, "calendar"); addEditBlock(configuration, "longtext"); addEditBlock(configuration, "entity"); addEditBlock(configuration, "entity_list"); addEditBlock(configuration, "time"); } private static void addEditBlock(Configuration<BeanBlockContribution> configuration, String dataType) { configuration.add(new EditBlockContribution(dataType, "tawus/PropertyEditBlocksWithoutLabel", dataType)); } public static void contributePersistentFieldManager(MappedConfiguration<String, PersistentFieldStrategy> configuration) { configuration.addInstance("entity", EntityPersistentFieldStrategy.class); } public static void contributeComponentClassTransformWorker(OrderedConfiguration<ComponentClassTransformWorker2> workers) { workers.addInstance("injectEntitySelectSupport", InjectEntitySelectSupportWorker.class); workers.addInstance("XHRWorker", XHRWorker.class); workers.addInstance("injectDAOWorker", InjectDAOWorker.class); } public EntityDAOSource buildEntityDAOSource(ChainBuilder chainBuilder, List<EntityDAOSource> commands) { return chainBuilder.build(EntityDAOSource.class, commands); } public void contributeEntityDAOSource(final ObjectLocator locator, final EntityServiceMapper entityServiceMapper, OrderedConfiguration<EntityDAOSource> contributions) { EntityDAOSource daoSource = new EntityDAOSource() { @SuppressWarnings("unchecked") public <E> EntityDAO<E> get(Class<E> type) { try { return locator.getService(entityServiceMapper.getServiceOverrideId(type), EntityDAO.class); } catch(UnknownValueException e) { return null; } } }; contributions.add("Default", daoSource, "after:*"); } public void contributeApplicationStatePersistenceStrategySource(MappedConfiguration<String, ApplicationStatePersistenceStrategy> configuration) { configuration.addInstance("entity", EntityApplicationStatePersistenceStrategy.class); } public EntityValidator build(ChainBuilder chainBuilder, List<EntityValidator> contribution) { return chainBuilder.build(EntityValidator.class, contribution); } public CriteriaSource buildCriteriaSource(StrategyBuilder builder, @SuppressWarnings("rawtypes") Map<Class, CriteriaSource> registrations) { registrations.put(Object.class, new DefaultCriteriaSource()); return builder.build(CriteriaSource.class, registrations); } }