Thank you Steve. That is exactly what I were looking for.
D.
2006/12/2, Steve Shucker <[EMAIL PROTECTED]>:
>
> I've got this working for pages and components, but it's probably a
bit
> different than what you want. I have a template table in my database
> and I'm looking up content by a numeric PK rather than a name
because I
> have a requirement to let users version some templates. I'm also
> leaving out my db access because it's somewhat domain-specific. This
> assumes that all pages/components are specless and lets you specify a
> backing class to associate with each template. You should be able
hack
> the page/jwc lookups using this as a model, though.
>
> Credit goes to the tapestry wiki for how to write a delegate and
> DynamicBlock for the trick with URL handlers to turn a string into a
> hivemind resource.
>
> -Steve
>
> @Entity
> @Table(name = "tapestry_components")
> @SequenceGenerator(name = "SEQ", sequenceName =
"tapestry_components_SEQ")
> public class TapestryComponent {
> private Integer id;
> private String name;
> private String template;
> private Date creationDate = new Date();
> private String backingClass;
>
> @Column(name="backingClass")
> public String getBackingClass() {
> return backingClass;
> }
>
> public void setBackingClass(String backingClass) {
> this.backingClass = backingClass;
> }
>
> public TapestryComponent() {}
>
> public TapestryComponent(String name) {
> setName(name);
> }
>
> @Id
> @Column(name = "id")
> @GeneratedValue(strategy = GenerationType.SEQUENCE, generator =
"SEQ")
> public Integer getId() {
> return id;
> }
>
> @Column(name = "name")
> public String getName() {
> return name;
> }
>
> public void setId(Integer id) {
> this.id = id;
> }
>
> public void setName(String name) {
> this.name = name;
> }
>
> @Lob
> @Column(name="template")
> public String getTemplate() {
> return template;
> }
>
> public void setTemplate(String template) {
> this.template = template;
> }
>
> @Column(name="creation_date")
> public Date getCreationDate() {
> return creationDate;
> }
>
> public void setCreationDate(Date creationDate) {
> this.creationDate = creationDate;
> }
> }
>
> public class DatabasePageResolver implements
> ISpecificationResolverDelegate {
>
> public DatabasePageResolver() {}
>
> public IComponentSpecification
> findComponentSpecification(IRequestCycle cycle,
> INamespace namespace, String name) {
> return findSpecification(cycle, namespace, name, false);
> }
>
> public IComponentSpecification findPageSpecification(IRequestCycle
> cycle, INamespace namespace, String name) {
> return findSpecification(cycle, namespace, name, true);
> }
>
> private IComponentSpecification findSpecification(IRequestCycle
> cycle, INamespace namespace, String name, boolean isPage) {
> try {
> Integer.valueOf(name);
> } catch (NumberFormatException e) {
> return null; // not a valid format
> }
> DatabasePageResource resource = new DatabasePageResource(name,
> cycle.getEngine().getLocale());
> if (!resource.exists()) {
> return null;
> }
> Resource specResource = resource.getRelativeResource(name +
> (isPage ? ".page" : ".jwc"));
> IComponentSpecification specification = new
> ComponentSpecification();
> specification.setPageSpecification(isPage);
> specification.setSpecificationLocation(specResource);
> specification.setLocation(new LocationImpl(resource));
> if (resource.getBackingClass() != null) {
>
specification.setComponentClassName(resource.getBackingClass
> ());
> }
> return specification;
> }
>
> }
>
> public class DatabasePageResource implements Resource {
>
> private Locale locale;
> private String componentName;
> private TapestryComponent component;
>
> public DatabasePageResource(String componentName, Locale locale) {
> this.componentName = componentName;
> this.locale = locale;
> load();
> }
>
> public String getBackingClass() {
> return component.getBackingClass();
> }
>
> private void load() {
> try {
> Integer componentId = Integer.valueOf(componentName);
> component = // code omitted - use your own
infrastructure to
> read TapestryComponent object from the database here
> } catch (NumberFormatException e) {
> throw new IllegalArgumentException(componentName + " is
> non-numeric and therefore not a valid component ID");
> }
> }
> public Locale getLocale() {
> return locale;
> }
>
> public Resource getLocalization(Locale arg0) {
> return this;
> }
>
> public String getName() {
> return componentName;
> }
>
> public String getPath() {
> return componentName;
> }
>
> public Resource getRelativeResource(String resourceName) {
> return new DatabasePageResource(componentName, locale);
> }
>
> public boolean exists() {
> return component != null;
> }
>
> public URL getResourceURL() {
> try {
> return new URL(null, "database:///" + componentName, new
> DatabaseURLStreamHandler(component.getTemplate()));
> } catch (MalformedURLException e) {
> // no-op - fall through to next page locator
> return null;
> }
> }
>
> public String toString() {
> return "DatabasePageResource (ID=" + getName() + ")";
> }
>
> static class DatabaseURLConnection extends URLConnection {
> private String template;
>
> public DatabaseURLConnection(URL url, String template) {
> super(url);
> this.template = template;
> }
>
> public boolean exists() {
> return template != null;
> }
>
> public void connect() {}
>
> public boolean getAllowuserInteraction() {
> return false;
> }
>
> public Object getContent() {
> return template;
> }
>
> public InputStream getInputStream() {
> if (template == null) {
> return null;
> }
> return new ByteArrayInputStream(template.getBytes());
> }
>
> public String getString() {
> return template;
> }
> }
>
> static class DatabaseURLStreamHandler extends URLStreamHandler {
> private String template;
>
> DatabaseURLStreamHandler(String template) {
> this.template = template;
> }
>
> public URLConnection openConnection(URL url) {
> return new DatabaseURLConnection(url, template);
> }
> }
> }
>
> hivemodule entry:
> <implementation
service-id="tapestry.page.SpecificationResolverDelegate" >
> <create-instance
> class="com.vms.infrastructure.tapestry.DatabasePageResolver" />
> </implementation>
>
> Tapestry User List wrote:
> > IComponentSpecification spec = new ComponentSpecification();
> > spec.setComponentClassName(CommonPage.class.getName());
> >
> > Resource componentResource = ??? how to instanciate a resource and
> > fill it
> > with a String retrieved from a database ???
> >
> > spec.setSpecificationLocation(componentResource);
> >
> > AssetSpecification template = new AssetSpecification();
> > ??? how to fill the asset with a String retrieved from a database
???
> >
> > template.setLocation(new
> > DescribedLocation(spec.getSpecificationLocation(),
> > ""));
> > spec.addAsset("$template", template);
> >
> > Any idea ?
> >
> > D.
> >
> >
> > 2006/12/1, Tapestry User List <[EMAIL PROTECTED]>:
> >>
> >> Hi,
> >>
> >> I would like retrieve a tapestry specification definition
(.page) and
> >> the
> >> template (.html) from a database.
> >>
> >> For doing that, I create a class that implements
> >> ISpecificationResolverDelegate .
> >>
> >> The method findPageSpecification must return a
> >> IComponentSpecification. So
> >> I instanciate a ComponentSpecification object.
> >>
> >> The problem is: how can I fill my componentSpecification object
with
> the
> >> .page content (xml) and .html content retrieved from a database ?
> >>
> >> Thank you very much,
> >>
> >> D.
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>