001 package org.trails.component;
002
003 import org.apache.tapestry.BaseComponent;
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.trails.builder.BuilderDirector;
009 import org.trails.descriptor.EmbeddedDescriptor;
010 import org.trails.descriptor.IPropertyDescriptor;
011
012 /**
013 * This component displays an @Embedded object
014 */
015 @ComponentClass
016 public abstract class EmbeddedEditor extends BaseComponent
017 {
018
019 @InjectObject("service:trails.core.BuilderDirector")
020 public abstract BuilderDirector getBuilderDirector();
021
022 @Parameter(required = true)
023 public abstract IPropertyDescriptor getDescriptor();
024
025 @Parameter(required = true)
026 public abstract Object getModel();
027
028 public abstract void setModel(Object model);
029
030 public EmbeddedDescriptor getEmbeddedDescriptor()
031 {
032 return (EmbeddedDescriptor) getDescriptor();
033 }
034
035 @Override
036 protected void prepareForRender(IRequestCycle cycle)
037 {
038 /**
039 * fix for TRAILS-53
040 * In a proper implementation this code should be in a pageBeginRender(PageEvent event) method, but we need this
041 * code here because pageBeginRender isn't fired when the component is inside a Block in another page.
042 *
043 */
044 if (!cycle.isRewinding() && getModel() == null)
045 {
046 setModel(getBuilderDirector().createNewInstance(getEmbeddedDescriptor().getPropertyType()));
047 }
048 super.prepareForRender(cycle);
049 }
050 }