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    }