Well I want to make a single page application, so componentns (the
body part of a page)
will be injected as reference by hivemind into different jars.

Playng a bit with Tapestry src I've found a better way to do this, but
I need some more testing (assets, listeners, etc).

I'm investigating on this kind of solution becase this will optimize
dojo loading with incremental load.

What do you thik about this ?

kiuma

Here it is the code
--------------------------------------------------------------------------
package org.jfly.sample.pages;


import org.jfly.sample.components.widgets.DynaRenderer;
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.hivemind.HiveMind;
import org.apache.hivemind.Location;
import org.apache.tapestry.AbstractPage;
import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IComponent;
import org.apache.tapestry.IMarkupWriter;
import org.apache.tapestry.INamespace;
import org.apache.tapestry.IPage;
import org.apache.tapestry.IRender;
import org.apache.tapestry.IRequestCycle;
import org.apache.tapestry.TapestryConstants;
import org.apache.tapestry.annotations.InjectObject;
import org.apache.tapestry.engine.IPageLoader;
import org.apache.tapestry.html.BasePage;
import org.apache.tapestry.pageload.ComponentClassProvider;
import org.apache.tapestry.pageload.ComponentClassProviderContext;
import org.apache.tapestry.pageload.PageLoader;
import org.apache.tapestry.resolver.ComponentSpecificationResolver;
import org.apache.tapestry.services.ComponentConstructor;
import org.apache.tapestry.services.ComponentConstructorFactory;
import org.apache.tapestry.services.ResponseBuilder;
import org.apache.tapestry.spec.ContainedComponent;
import org.apache.tapestry.spec.IComponentSpecification;
import org.apache.tapestry.spec.IContainedComponent;
import org.apache.tapestry.web.WebRequest;
import org.apache.hivemind.Messages;
import org.apache.tapestry.annotations.InjectObject;
import java.util.Date ;

/**
* Start page of application pageInjection.
*/
abstract public class Home    extends BasePage {
   private IRender renderer;

   public IRender getRenderer() {
       return renderer;
   }
   public Date getCurrentTime() {
       return new Date();
   }

   @InjectObject("service:tapestry.page.ComponentClassProvider")
   public abstract ComponentClassProvider getComponentClassProvider();

   @InjectObject("service:tapestry.page.ComponentSpecificationResolver")
   public abstract ComponentSpecificationResolver getComponentResolver();

   @InjectObject("service:tapestry.enhance.ComponentConstructorFactory")
   public abstract ComponentConstructorFactory
getComponentConstructorFactory();

    @InjectObject("service:tapestry.page.PageLoader")
   public abstract IPageLoader getPageLoader();

   public IRender getDynaComp() {
       IRequestCycle cycle = getEngine().getInfrastructure().getRequestCycle();
       ComponentSpecificationResolver componentResolver =
getComponentResolver();
       IPageLoader pageLoader = getPageLoader();
       String componentType = DynaRenderer.class.getName();
       Location location = getLocation();
       componentResolver.resolve(cycle, getNamespace(),
componentType, location);

       INamespace componentNamespace = componentResolver.getNamespace();
       IComponentSpecification spec = componentResolver.getSpecification();

       IContainedComponent contained = new ContainedComponent();
       contained.setLocation(location);
       contained.setType(componentType);
       IComponent result = instantiateComponent(this, this, "message",
               spec, componentResolver.getType(), componentNamespace,
               contained);


       //IRender result =
getPageLoader().createImplicitComponent(cycle, this, "message",
DynaRenderer.class.getName(), getLocation());
       return result;
   }

   private IComponent instantiateComponent(IPage page, IComponent container,
           String id, IComponentSpecification spec, String type,
           INamespace namespace, IContainedComponent containedComponent)
   {
       ComponentClassProviderContext context = new
ComponentClassProviderContext(
               type, spec, namespace);
       String className =
getComponentClassProvider().provideComponentClassName(context);

       if (HiveMind.isBlank(className))
           className = BaseComponent.class.getName();
       else
       {

           Class componentClass =
getEngine().getInfrastructure().getClassResolver().findClass(className);

           if (!IComponent.class.isAssignableFrom(componentClass))
               throw new ApplicationRuntimeException(componentClass +
" is not a component class", container, spec
                       .getLocation(), null);

           if (IPage.class.isAssignableFrom(componentClass))
               throw new ApplicationRuntimeException("Not assignable
" + id, container, spec.getLocation(),
                       null);
       }

       ComponentConstructor cc =
getComponentConstructorFactory().getComponentConstructor(spec,
className);

       IComponent result = (IComponent) cc.newInstance();

       result.setNamespace(namespace);
       result.setPage(page);
       result.setContainer(container);
       result.setId(id);
       result.setContainedComponent(containedComponent);
       result.setLocation(containedComponent.getLocation());


       return result;
   }



}



On 5/31/07, Jesse Kuhnert <[EMAIL PROTECTED]> wrote:
Hmm I'm not sure.   It doesn't look right but it's possible.  Wouldn't
@Block be the easiest way to do it?  Or different instances of IRender ?

On 5/31/07, Andrea Chiumenti <[EMAIL PROTECTED]> wrote:
>
> Is it right to do this ?
> public IRender getDynaComp() {
>         IRequestCycle cycle =
> getEngine().getInfrastructure().getRequestCycle();
>         IWorkerRender result;
>         if ((cycle.getParameter("body") != null) &&
> (!(cycle.getParameter("body").equals(""))) ) {
>             result = from a service via IOC <----
>             result.setRenderWorker(getRenderWorker());
>         } else {
>             result = new DynaRenderer(); //Default
>             result.setRenderWorker(getRenderWorker());
>         }
>         return result;
>     }
>
> of course components must not be abstract.
>
>
> On 5/31/07, Andrea Chiumenti <[EMAIL PROTECTED]> wrote:
> > Hello I'd like to konw if in Tap 4.1.2 there is a way do dynamically
> > render components inside a page.
> >
> > If yes, how ?
> >
> > regards,
> > kiuma
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>


--
Jesse Kuhnert
Tapestry/Dojo team member/developer

Open source based consulting work centered around
dojo/tapestry/tacos/hivemind. http://blog.opencomponentry.com


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to