001    package org.trails.component.search;
002    
003    import org.apache.hivemind.util.PropertyUtils;
004    import org.apache.tapestry.IRequestCycle;
005    import org.apache.tapestry.annotations.ComponentClass;
006    import org.apache.tapestry.annotations.InjectObject;
007    import org.apache.tapestry.annotations.Parameter;
008    import org.apache.tapestry.components.Block;
009    import org.apache.tapestry.event.PageBeginRenderListener;
010    import org.apache.tapestry.event.PageEvent;
011    import org.hibernate.criterion.DetachedCriteria;
012    import org.trails.builder.BuilderDirector;
013    import org.trails.component.ClassDescriptorComponent;
014    import org.trails.descriptor.IPropertyDescriptor;
015    import org.trails.finder.BlockFinder;
016    import org.trails.page.HibernateListPage;
017    import org.trails.page.PageResolver;
018    import org.trails.page.PageType;
019    
020    /**
021     * This component extends Form and renders a form to search for a domain object
022     */
023    @ComponentClass
024    public abstract class SearchForm extends ClassDescriptorComponent implements PageBeginRenderListener
025    {
026            private static final String MODEL_PARAMETER = "model";
027    
028            @InjectObject("service:trails.core.PageResolver")
029            public abstract PageResolver getPageResolver();
030    
031            @InjectObject("spring:searchBlockFinder")
032            public abstract BlockFinder getBlockFinder();
033    
034            @InjectObject("service:trails.core.BuilderDirector")
035            public abstract BuilderDirector getBuilderDirector();
036    
037            @Parameter(name = MODEL_PARAMETER, required = false)
038            public abstract Object getModelParameter();
039            public abstract void setModelParameter(Object model);
040    
041            public abstract Object getModelLocalProperty();
042            public abstract void setModelLocalProperty(Object model);
043    
044            public abstract IPropertyDescriptor getPropertyDescriptor();
045            public abstract void setPropertyDescriptor(IPropertyDescriptor PropertyDescriptor);
046    
047            public abstract DetachedCriteria getCriteria();
048            public abstract void setCriteria(DetachedCriteria Criteria);
049    
050            public Object getModel()
051            {
052                    return isParameterBound(MODEL_PARAMETER) ? getModelParameter() : getModelLocalProperty();
053            }
054    
055            public void setModel(Object model)
056            {
057                    if (isParameterBound(MODEL_PARAMETER))
058                    {
059                            setModelParameter(model);
060                    } else
061                    {
062                            setModelLocalProperty(model);
063                    }
064            }
065    
066            public void search(IRequestCycle cycle)
067            {
068                    HibernateListPage listPage = (HibernateListPage) getPageResolver().resolvePage(cycle,
069                            getClassDescriptor().getType(),
070                            PageType.LIST);
071                    listPage.setClassDescriptor(getClassDescriptor());
072                    listPage.setCriteria(getCriteria());
073                    cycle.activate(listPage);
074            }
075    
076            public Block getBlock()
077            {
078                    Block searchBlock = getBlockFinder().findBlock(getPage().getRequestCycle(), getPropertyDescriptor());
079                    PropertyUtils.write(searchBlock.getPage(), MODEL_PARAMETER, getModel());
080                    PropertyUtils.write(searchBlock.getPage(), "criteria", getCriteria());
081                    return searchBlock;
082            }
083    
084            public void pageBeginRender(PageEvent event)
085            {
086                    if (getModel() == null)
087                    {
088                            setModel(getBuilderDirector().createNewInstance(getClassDescriptor().getType()));
089                    }
090    
091                    setCriteria(DetachedCriteria.forClass(getClassDescriptor().getType()));
092            }
093    
094    }