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 }