Re: dynamic component injection

2007-06-21 Thread Martino Piccinato

tnx a lot Alejandro!

this is exactly what I was looking for, block/renderblock components
combined with EventListener  can be really powerful stuff but I didn't
realize it until I read your example.

It's also very interesting the way you use that Editors page as a block
component repository and the ComponentAddress beans.


Re: dynamic component injection

2007-06-20 Thread Martino Piccinato

did you find any cleaner way to do this?

I think this problem is not just related to one page applications but
apply also to any page/component that depending un user actions must show
different enough content (unless one wants to go with EventListener and a
long  ugly list of IF components...)


Re: dynamic component injection

2007-06-20 Thread Alejandro Scandroli

Hi Guys,

I don't know if this is what are you looking for but here is how we
handle our dynamic components at Trails.

First we have a page which contains what we call editors (our
dynamic components):
http://svn.codehaus.org/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/page/Editors.html
http://svn.codehaus.org/trails/trunk/trails/modules/trails-core/src/main/resources/org/trails/page/Editors.page
They are all wrapped by @Blocks.

Then we have a map where the key is an ongl expression we use to
evaluate if that is right component for render a property, and  the
value is a ComponentAddress. The map definition is in our sping
configuration file.
Here is an example of one entry:
entry
key
valuestring and !large and !identifier/value
/key
bean class=org.apache.tapestry.util.ComponentAddress
constructor-arg index=0
valuetrails:Editors/value !-- it refers to Editors 
page --
/constructor-arg
constructor-arg index=1
valuestringEditor/value
/constructor-arg
/bean
/entry

So stringEditor is the name of the block we are going to look for in
our Editors page.

Then wherever we need to render one of those blocks we do:

span jwcid=$content$
   span jwcid=[EMAIL PROTECTED] block=ognl:block/
/span

and

public Block getBlock()
{
ComponentAddress componentAddress = get the ComponentAddress from the 
map.
componentAddress.findComponent(getPage().getRequestCycle()); //activate it.
// set all the properties you need to set

return (Block) componentAddress;
}

That's all!
This is safe to use inside a For or Table or wherever you need to use it.

Of course an ognl expressions map is not a good fit for everyone, so
you can use whatever service you need to implement your logic as long
as it returns a ComponentAddress from the Editors page.

I hope this helps you.
Saluti.
Alejandro.


On 6/20/07, Martino Piccinato [EMAIL PROTECTED] wrote:

did you find any cleaner way to do this?

I think this problem is not just related to one page applications but
apply also to any page/component that depending un user actions must show
different enough content (unless one wants to go with EventListener and a
long  ugly list of IF components...)



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



Re: dynamic component injection

2007-05-31 Thread Andrea Chiumenti

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]



Re: dynamic component injection

2007-05-31 Thread Jesse Kuhnert

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


Re: dynamic component injection

2007-05-31 Thread Andrea Chiumenti

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 Homeextends 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 =