You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by Howard Lewis Ship <hl...@gmail.com> on 2006/12/12 17:24:27 UTC
Module Naming / Re: svn commit: r486027 - in /tapestry/tapestry5/tapestry-Workbench: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/tapestry/ src/main/java/org/apache/tapestry/workbench/ src/mai
A nitpick: I prefer that module names by all lower case, i.e.,
"tapestry-workbench" not "tapestry-Workbench". Something of a Maven
standard practice.
And I hope we come up with something more compelling as a demo than the
Workbench.
Finally, this needs to be moved to:
tapestry/tapestry5/tapestry-workbench/trunk
this is a very important Subversion practice.
On 12/11/06, freemant@apache.org <fr...@apache.org> wrote:
>
> Author: freemant
> Date: Mon Dec 11 21:05:43 2006
> New Revision: 486027
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=486027
> Log:
> Start porting the Workbench to T5.
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/.classpath
> tapestry/tapestry5/tapestry-Workbench/.project
> tapestry/tapestry5/tapestry-Workbench/pom.xml
> tapestry/tapestry5/tapestry-Workbench/src/
> tapestry/tapestry5/tapestry-Workbench/src/main/
> tapestry/tapestry5/tapestry-Workbench/src/main/java/
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Any.java
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Border.java
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Img.java
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/Fields.java
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/Home.java
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/services/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/services/AppModule.java
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/Border.html
>
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/Border.properties
>
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Fields.html
>
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Home.html
>
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Home_de.html
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/WEB-INF/
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/WEB-INF/web.xml
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/
>
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/exception.css
>
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/workbench.css
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-
> focus.gif (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_de.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_fr.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_it.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_de.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_fr.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_it.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_de.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_fr.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_it.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Continue.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Update.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Warning-
> small.gif (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Warning.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/minus.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/nodeimage.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/plus.gif
> (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> active-left.gif (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> active-mid.gif (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> active-right.gif (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> inactive-left.gif (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> inactive-mid.gif (with props)
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> inactive-right.gif (with props)
> tapestry/tapestry5/tapestry-Workbench/src/test/
> tapestry/tapestry5/tapestry-Workbench/src/test/conf/
> tapestry/tapestry5/tapestry-Workbench/src/test/conf/webdefault-
> nojsp.xml
> tapestry/tapestry5/tapestry-Workbench/src/test/java/
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/
>
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/
>
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/
>
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/
>
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/SeleniumClientFactory.java
>
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/TabLinksTest.java
>
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/WorkbenchLauncher.java
> tapestry/tapestry5/tapestry-Workbench/testng.xml
>
> Added: tapestry/tapestry5/tapestry-Workbench/.classpath
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/.classpath?view=auto&rev=486027
>
> ==============================================================================
> --- tapestry/tapestry5/tapestry-Workbench/.classpath (added)
> +++ tapestry/tapestry5/tapestry-Workbench/.classpath Mon Dec 11 21:05:43
> 2006
> @@ -0,0 +1,9 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<classpath>
> + <classpathentry kind="src" path="src/main/java"/>
> + <classpathentry kind="src" path="src/test/java"/>
> + <classpathentry kind="src" path="src/main/resources"/>
> + <classpathentry kind="con" path="
> org.eclipse.jdt.launching.JRE_CONTAINER"/>
> + <classpathentry kind="con" path="
> org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
> + <classpathentry kind="output" path="target/classes"/>
> +</classpath>
>
> Added: tapestry/tapestry5/tapestry-Workbench/.project
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/.project?view=auto&rev=486027
>
> ==============================================================================
> --- tapestry/tapestry5/tapestry-Workbench/.project (added)
> +++ tapestry/tapestry5/tapestry-Workbench/.project Mon Dec 11 21:05:43
> 2006
> @@ -0,0 +1,19 @@
> +<projectDescription>
> + <name>tapestry-Workbench</name>
> + <comment/>
> + <projects/>
> + <buildSpec>
> + <buildCommand>
> + <name>org.eclipse.jdt.core.javabuilder</name>
> + </buildCommand>
> + <buildCommand>
> + <name>org.maven.ide.eclipse.maven2Builder</name>
> + <arguments>
> + </arguments>
> + </buildCommand>
> + </buildSpec>
> + <natures>
> + <nature>org.eclipse.jdt.core.javanature</nature>
> + <nature>org.maven.ide.eclipse.maven2Nature</nature>
> + </natures>
> +</projectDescription>
>
> Added: tapestry/tapestry5/tapestry-Workbench/pom.xml
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/pom.xml?view=auto&rev=486027
>
> ==============================================================================
> --- tapestry/tapestry5/tapestry-Workbench/pom.xml (added)
> +++ tapestry/tapestry5/tapestry-Workbench/pom.xml Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,79 @@
> +<?xml version="1.0"?>
> +<project>
> + <parent>
> + <artifactId>tapestry-project</artifactId>
> + <groupId>org.apache.tapestry</groupId>
> + <version>5.0.0-SNAPSHOT</version>
> + <relativePath>../tapestry-project/pom.xml</relativePath>
> + </parent>
> + <modelVersion>4.0.0</modelVersion>
> + <groupId>org.apache.tapestry</groupId>
> + <artifactId>tapestry-Workbench</artifactId>
> + <packaging>war</packaging>
> + <name>Tapestry Workbench</name>
> + <version>5.0.0-SNAPSHOT</version>
> + <url>http://tapestry.apache.org/tapestry5/tapestry-core/</url>
> + <inceptionYear>2006</inceptionYear>
> + <scm>
> + <connection>
> + scm:svn:
> https://svn.apache.org/repos/asf/tapestry/tapestry5/
> + ${pom.artifactId}/trunk/
> + </connection>
> + <url>
> +
> http://svn.apache.org/viewvc/tapestry/tapestry5/${pom.artifactId}/t
> + runk/
> + </url>
> + </scm>
> + <dependencies>
> + <dependency>
> + <groupId>org.apache.tapestry</groupId>
> + <artifactId>tapestry-core</artifactId>
> + <scope>compile</scope>
> + </dependency>
> + <dependency>
> + <groupId>org.testng</groupId>
> + <artifactId>testng</artifactId>
> + <version>5.1</version>
> + <classifier>jdk15</classifier>
> + <scope>test</scope>
> + </dependency>
> + <dependency>
> + <groupId>org.openqa.selenium.server</groupId>
> + <artifactId>selenium-server</artifactId>
> + <version>0.8.1</version>
> + <scope>compile</scope>
> + </dependency>
> + <dependency>
> + <groupId>org.openqa.selenium.client-drivers
> </groupId>
> +
> <artifactId>selenium-java-client-driver</artifactId>
> + <version>0.8.1</version>
> + <scope>compile</scope>
> + </dependency>
> + </dependencies>
> + <build>
> + <plugins>
> + <plugin>
> + <groupId>org.apache.maven.plugins
> </groupId>
> +
> <artifactId>maven-surefire-plugin</artifactId>
> + <configuration>
> + <suiteXmlFiles>
> + <suiteXmlFile>testng.xml
> </suiteXmlFile>
> + </suiteXmlFiles>
> + </configuration>
> + </plugin>
> + </plugins>
> + </build>
> + <reporting>
> + <plugins>
> + <plugin>
> +
> <artifactId>maven-surefire-report-plugin</artifactId>
> + </plugin>
> + <plugin>
> +
> <artifactId>maven-javadoc-plugin</artifactId>
> + <configuration>
> + <linksource>true</linksource>
> + </configuration>
> + </plugin>
> + </plugins>
> + </reporting>
> +</project>
> \ No newline at end of file
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Any.java
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Any.java?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Any.java
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Any.java
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,51 @@
> +// Copyright 2006 The Apache Software Foundation
> +//
> +// Licensed under the Apache License, Version 2.0 (the "License");
> +// you may not use this file except in compliance with the License.
> +// You may obtain a copy of the License at
> +//
> +// http://www.apache.org/licenses/LICENSE-2.0
> +//
> +// Unless required by applicable law or agreed to in writing, software
> +// distributed under the License is distributed on an "AS IS" BASIS,
> +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> +// See the License for the specific language governing permissions and
> +// limitations under the License.
> +
> +package org.apache.tapestry.workbench.components;
> +
> +import org.apache.tapestry.MarkupWriter;
> +import org.apache.tapestry.annotations.AfterRender;
> +import org.apache.tapestry.annotations.BeginRender;
> +import org.apache.tapestry.annotations.ComponentClass;
> +import org.apache.tapestry.annotations.Mixin;
> +import org.apache.tapestry.annotations.Parameter;
> +import org.apache.tapestry.corelib.mixins.RenderInformals;
> +
> +@ComponentClass
> +public class Any
> +{
> + @Parameter
> + private String element;
> +
> + @BeginRender
> + public void begin(MarkupWriter writer)
> + {
> + //TODO if element is null...
> + writer.element(element);
> + }
> + @AfterRender
> + public void end(MarkupWriter writer)
> + {
> + writer.end();
> + }
> +
> + @SuppressWarnings("unused")
> + @Mixin
> + private RenderInformals renderInformals;
> +
> + public boolean beforeRenderBody()
> + {
> + return false;
> + }
> +}
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Border.java
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Border.java?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Border.java
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Border.java
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,112 @@
> +package org.apache.tapestry.workbench.components;
> +
> +import java.util.Arrays;
> +import java.util.List;
> +
> +import org.apache.tapestry.Asset;
> +import org.apache.tapestry.ComponentResources;
> +import org.apache.tapestry.annotations.BeginRender;
> +import org.apache.tapestry.annotations.Component;
> +import org.apache.tapestry.annotations.ComponentClass;
> +import org.apache.tapestry.annotations.Inject;
> +import org.apache.tapestry.annotations.OnEvent;
> +
> +@ComponentClass
> +public class Border
> +{
> + private String pageName;
> +
> + @Inject
> + private ComponentResources resources;
> +
> + @Inject("context:images/tab-inactive-left.gif")
> + private Asset inactiveLeft;
> +
> + @Inject("context:images/tab-inactive-mid.gif")
> + private Asset inactiveMid;
> +
> + @Inject("context:images/tab-inactive-right.gif")
> + private Asset inactiveRight;
> +
> + @Inject("context:images/tab-active-left.gif")
> + private Asset activeLeft;
> +
> + @Inject("context:images/tab-active-mid.gif")
> + private Asset activeMid;
> +
> + @Inject("context:images/tab-active-right.gif")
> + private Asset activeRight;
> +
> + @Inject("context:css/workbench.css")
> + private Asset stylesheet;
> +
> + @SuppressWarnings("unused")
> + @Component(parameters =
> + { "element=literal:td", "background=midTabAsset" })
> + private Any tabCell;
> +
> + private String renderingPageFullName;
> +
> + /**
> + * Returns the logical names of the pages accessible via the
> navigation bar,
> + * in appopriate order.
> + */
> + public List getPageTabNames()
> + {
> + return Arrays.asList("Home", "localization/Localization",
> "Fields",
> + "Dates", "Chart", "Palette", "Upload",
> "Redirect",
> + "ExceptionTab", "Table", "TreeHome");
> + }
> +
> + @BeginRender
> + public void beginRender()
> + {
> + renderingPageFullName = resources.getPage
> ().getClass().getName();
> + }
> +
> + private boolean isCurrentPageActive()
> + {
> + return renderingPageFullName.endsWith(pageName);
> + }
> + @OnEvent(component = "link")
> + public String onClickPage(String pageName)
> + {
> + return pageName;
> + }
> +
> + public String getPageName()
> + {
> + return pageName;
> + }
> +
> + public void setPageName(String pageName)
> + {
> + this.pageName = pageName;
> + }
> +
> + public String getPageTitle()
> + {
> + return resources.getMessages().get(pageName);
> + }
> +
> + public Asset getLeftTabAsset()
> + {
> + return isCurrentPageActive() ? activeLeft : inactiveLeft;
> + }
> +
> + public Asset getMidTabAsset()
> + {
> + return isCurrentPageActive() ? activeMid: inactiveMid;
> + }
> +
> + public Asset getRightTabAsset()
> + {
> + return isCurrentPageActive() ? activeRight :
> inactiveRight;
> + }
> +
> + public Asset getStylesheet()
> + {
> + return stylesheet;
> + }
> +
> +}
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Img.java
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Img.java?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Img.java
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/components/Img.java
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,68 @@
> +// Copyright 2006 The Apache Software Foundation
> +//
> +// Licensed under the Apache License, Version 2.0 (the "License");
> +// you may not use this file except in compliance with the License.
> +// You may obtain a copy of the License at
> +//
> +// http://www.apache.org/licenses/LICENSE-2.0
> +//
> +// Unless required by applicable law or agreed to in writing, software
> +// distributed under the License is distributed on an "AS IS" BASIS,
> +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> +// See the License for the specific language governing permissions and
> +// limitations under the License.
> +
> +package org.apache.tapestry.workbench.components;
> +
> +import org.apache.tapestry.Asset;
> +import org.apache.tapestry.ComponentResources;
> +import org.apache.tapestry.MarkupWriter;
> +import org.apache.tapestry.annotations.AfterRender;
> +import org.apache.tapestry.annotations.BeforeRenderBody;
> +import org.apache.tapestry.annotations.BeginRender;
> +import org.apache.tapestry.annotations.ComponentClass;
> +import org.apache.tapestry.annotations.Environmental;
> +import org.apache.tapestry.annotations.Inject;
> +import org.apache.tapestry.annotations.Mixin;
> +import org.apache.tapestry.annotations.Parameter;
> +import org.apache.tapestry.corelib.mixins.RenderInformals;
> +import org.apache.tapestry.services.PageRenderSupport;
> +
> +@ComponentClass
> +public class Img
> +{
> + @Environmental
> + private PageRenderSupport _support;
> +
> + @Inject
> + private ComponentResources _resources;
> +
> + @Parameter(required = true)
> + private Asset _src;
> +
> + @BeginRender
> + void begin(MarkupWriter writer)
> + {
> + String clientId =
> _support.allocateClientId(_resources.getId());
> +
> + writer.element("img", "src", _src, "id", clientId);
> +
> + _resources.renderInformalParameters(writer);
> + }
> +
> + @SuppressWarnings("unused")
> + @Mixin
> + private RenderInformals _renderInformals;
> +
> + @BeforeRenderBody
> + boolean beforeRenderBody()
> + {
> + return false;
> + }
> +
> + @AfterRender
> + void after(MarkupWriter writer)
> + {
> + writer.end();
> + }
> +}
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/Fields.java
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/Fields.java?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/Fields.java
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/Fields.java
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,8 @@
> +package org.apache.tapestry.workbench.pages;
> +
> +import org.apache.tapestry.annotations.ComponentClass;
> +
> +@ComponentClass
> +public class Fields
> +{
> +}
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/Home.java
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/Home.java?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/Home.java
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/pages/Home.java
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,8 @@
> +package org.apache.tapestry.workbench.pages;
> +
> +import org.apache.tapestry.annotations.ComponentClass;
> +
> +@ComponentClass
> +public class Home
> +{
> +}
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/services/AppModule.java
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/services/AppModule.java?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/services/AppModule.java
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/java/org/apache/tapestry/workbench/services/AppModule.java
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,15 @@
> +package org.apache.tapestry.workbench.services;
> +
> +import org.apache.tapestry.ioc.MappedConfiguration;
> +import org.apache.tapestry.ioc.annotations.Contribute;
> +
> +public class AppModule
> +{
> + @Contribute("tapestry.ioc.ApplicationDefaults")
> + public static void contributeApplicationDefaults(
> + MappedConfiguration<String, String> configuration)
> + {
> + configuration.add("tapestry.supported-locales",
> "en,de,fr,it");
> + }
> +
> +}
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/Border.html
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/Border.html?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/Border.html
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/Border.html
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,23 @@
> +<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
> +<head>
> +<t:comp type="Any" element="literal:link" rel="literal:stylesheet"
> + href="stylesheet" />
> +</head>
> +<table class="tabs" cellspacing="0" border="0">
> + <tr>
> + <t:comp type="Loop" source="pageTabNames"
> value="pageName">
> + <td><t:comp type="Img" src="leftTabAsset"
> width="2" height="20"
> + alt="''" /></td>
> + <t:comp id="tabCell" align="literal:center">
> + <t:comp id="link" type="ActionLink"
> context="pageName"
> +
> class="literal:nav">${pageTitle}</t:comp>
> + </t:comp>
> + <td><t:comp type="Img" src="rightTabAsset"
> width="13" height="20"
> + alt="''" /></td>
> + </t:comp>
> + </tr>
> +</table>
> +
> +<t:body />
> +
> +</html>
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/Border.properties
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/Border.properties?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/Border.properties
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/components/Border.properties
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,28 @@
> +# Copyright 2004, 2005 The Apache Software Foundation
> +#
> +# Licensed under the Apache License, Version 2.0 (the "License");
> +# you may not use this file except in compliance with the License.
> +# You may obtain a copy of the License at
> +#
> +# http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> +# See the License for the specific language governing permissions and
> +# limitations under the License.
> +
> +Home=Home
> +localization/Localization=L10N
> +Fields=Fields
> +Palette=Palette
> +Upload=Upload
> +Chart=Chart
> +Redirect=Redirect
> +ExceptionTab=Exception
> +Dates=Dates
> +Table=Table
> +TreeHome=Tree
> +
> +window.title=Tapestry Component Workbench
> +prompt.display-request-debug=Display Request Debug Information
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Fields.html
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Fields.html?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Fields.html
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Fields.html
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,10 @@
> +<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
> +<head>
> +<title>simple document</title>
> +</head>
> +<body>
> +<t:comp type="Border">
> + <p>Fields page</p>
> +</t:comp>
> +</body>
> +</html>
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Home.html
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Home.html?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Home.html
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Home.html
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,10 @@
> +<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
> +<head>
> +<title>simple document</title>
> +</head>
> +<body>
> +<t:comp type="Border">
> + <p>a simple paragraph in English</p>
> +</t:comp>
> +</body>
> +</html>
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Home_de.html
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Home_de.html?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Home_de.html
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/resources/org/apache/tapestry/workbench/pages/Home_de.html
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,8 @@
> +<html>
> +<head>
> +<title>simple document</title>
> +</head>
> +<body>
> +<p>a simple paragraph in German</p>
> +</body>
> +</html>
> \ No newline at end of file
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/WEB-INF/web.xml
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/WEB-INF/web.xml?view=auto&rev=486027
>
> ==============================================================================
> --- tapestry/tapestry5/tapestry-Workbench/src/main/webapp/WEB-INF/web.xml
> (added)
> +++ tapestry/tapestry5/tapestry-Workbench/src/main/webapp/WEB-INF/web.xml
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,34 @@
> +<?xml version="1.0"?>
> +<!--
> + Copyright 2004-2006 The Apache Software Foundation
> +
> + Licensed under the Apache License, Version 2.0 (the "License");
> + you may not use this file except in compliance with the License.
> + You may obtain a copy of the License at
> +
> + http://www.apache.org/licenses/LICENSE-2.0
> +
> + Unless required by applicable law or agreed to in writing, software
> + distributed under the License is distributed on an "AS IS" BASIS,
> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + See the License for the specific language governing permissions and
> + limitations under the License.
> +-->
> +
> +<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application
> 2.3//EN"
> + "http://java.sun.com/dtd/web-app_2_3.dtd">
> +<web-app>
> + <display-name>Tapestry Workbench Example</display-name>
> + <context-param>
> + <param-name>tapestry.app-package</param-name>
> + <param-value>org.apache.tapestry.workbench</param-value>
> + </context-param>
> + <filter>
> + <filter-name>app</filter-name>
> + <filter-class>org.apache.tapestry.TapestryFilter</filter-class>
> + </filter>
> + <filter-mapping>
> + <filter-name>app</filter-name>
> + <url-pattern>/*</url-pattern>
> + </filter-mapping>
> +</web-app>
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/exception.css
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/exception.css?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/exception.css
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/exception.css Mon
> Dec 11 21:05:43 2006
> @@ -0,0 +1,44 @@
> +.exceptionDialog {
> + overflow: auto;
> + display: block;
> + margin-left: 5%;
> + margin-right: 5%;
> + height: 500px;
> + background-color: white;
> + border-left: 2px solid #E07000;
> + border-right: 2px solid #E07000;
> + border-bottom: 2px solid #E07000;
> + -moz-border-radius-bottomright: 10px;
> + -moz-border-radius-bottomleft: 10px;
> +}
> +
> +.exceptionCloseLink {
> + display: block;
> + margin-left: 5%;
> + margin-right: 5%;
> + background-color: ThreeDFace;
> + padding-top: 3px;
> + padding-left: 5px;
> + padding-bottom: 3px;
> + font-weight: bold;
> + color: #000000;
> + cursor: pointer;
> + cursor: hand;
> + border-left: 2px solid #E07000;
> + border-right: 2px solid #E07000;
> + border-top: 2px solid #E07000;
> + -moz-border-radius-topright: 10px;
> + -moz-border-radius-topleft: 10px;
> +}
> +
> +.alertDialog {
> + width: 50%;
> + border: 2px solid #ff660a;
> + padding: 1em;
> + padding-bottom: 1.7em;
> + background: #ffffff;
> +}
> +
> +.alertDialog .dojoButton {
> + float: right;
> +}
> \ No newline at end of file
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/workbench.css
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/workbench.css?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/workbench.css
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/css/workbench.css Mon
> Dec 11 21:05:43 2006
> @@ -0,0 +1,199 @@
> +@import url("exception.css");
> +
> +SPAN.label-error {
> + color: Red;
> +}
> +
> +label.error {
> + color: red;
> + font-style: oblique;
> +}
> +
> +.field-error {
> + color: White;
> + background-color: Red;
> +}
> +
> +TABLE.inputerror TD.message {
> + font-weight: bold;
> + font-size: smaller;
> +}
> +
> +TABLE.content {
> + background-color: #ffffcc;
> + border-color: Black;
> + border-style: solid;
> + border-width: thin;
> + border-top-width: 0px;
> + border-bottom-width: 2px;
> + border-right-width: 2px;
> + border-left-width: 0px;
> + font-size: smaller;
> + clear: all;
> + width: 700px;
> +}
> +
> +TABLE.tabs TD {
> + padding: 0px;
> +}
> +
> +BODY {
> + background-color: #808080;
> + margin: 2px;
> +}
> +
> +body,td,th {
> + font-family: Lucida Grande, Tahoma, Verdana, Arial, sans-serif;
> + font-size: 9pt;
> +}
> +
> +TABLE.requestDebug {
> + width: 700;
> + border-color: Black;
> + border-style: solid;
> + border-width: thin;
> + border-top-width: 0px;
> + border-bottom-width: 2px;
> + border-right-width: 2px;
> + border-left-width: 0px;
> + background-color: #839cd1;
> + padding: 0;
> +}
> +
> +TABLE.requestDebug TR.control {
> + font-weight: bold;
> + font-size: 9pt;
> + color: White;
> + background-color: #330066;
> +}
> +
> +TABLE.requestDebug FORM {
> + margin: 0;
> +}
> +
> +DIV.described-object-title {
> + font-size: large;
> + font-weight: bold;
> + color: white;
> + background-color: black;
> +}
> +
> +TABLE.described-object {
> + border: 1px solid black;
> + width: 100%;
> +}
> +
> +TABLE.described-object TR.section TH {
> + color: white;
> + background-color: black;
> + text-align: center;
> +}
> +
> +TABLE.described-object TR.odd {
> + background-color: silver;
> +}
> +
> +TABLE.described-object TR.even {
> + background-color: #839cd1;
> +}
> +
> +TABLE.described-object TH {
> + text-align: right;
> + width: 1px;
> + //
> + Will
> + stretch
> + to
> + fit.
> +}
> +
> +TABLE.form TR {
> + vertical-align: top;
> +}
> +
> +TABLE.form TH {
> + font-weight: bold;
> + text-align: right;
> +}
> +
> +TABLE.form TR.column-header TH {
> + font-weight: bold;
> + text-align: center;
> +}
> +
> +TABLE.palette TH {
> + font-size: 9pt;
> + font-weight: bold;
> + color: white;
> + background-color: #330066;
> + text-align: center;
> +}
> +
> +TABLE.palette SELECT {
> + font-weight: bold;
> + background-color: #839cd1;
> + width: 200px;
> +}
> +
> +TABLE.palette TD.controls {
> + text-align: center;
> + vertical-align: middle;
> + width: 60px;
> +}
> +
> +TABLE.form {
> + font-size: 9pt;
> +}
> +
> +A.nav {
> + font-family: Trebuchet MS, sans-serif;
> + text-decoration: none;
> + font-size: 12px;
> + font-weight: bold;
> + color: black;
> +}
> +
> +A.nav:hover {
> + text-decoration: underline;
> +}
> +
> +PRE {
> + font-size: 12pt;
> +}
> +
> +UL {
> + margin-top: 0px;
> + margin-bottom: 0px;
> + margin-left: 20px;
> +}
> +
> +IMG {
> + border: none;
> +}
> +
> +.fieldMissing {
> + background: #bedef4;
> +}
> +
> +.fieldInvalid {
> + background: #ffaf7e;
> + font-weight: bold;
> +}
> +
> +.missingList, .invalidList {
> + padding: 0.6em;
> + padding-top: 0.2em;
> +}
> +
> +.missingList {
> + border-top: 4px solid #bedef4;
> +}
> +
> +.invalidList {
> + border-top: 4px solid #ffaf7e;
> +}
> +
> +.missingList li, .invalidList li {
> + list-style:none;
> + font-style:italic;
> +}
> \ No newline at end of file
>
> Added: tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-
> focus.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-
> focus.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_de.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_de.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_de.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_fr.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_fr.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_fr.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_it.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_it.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back-focus_it.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_de.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_de.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_de.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_fr.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_fr.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_fr.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_it.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_it.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Back_it.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_de.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_de.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_de.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_fr.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_fr.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_fr.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_it.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_it.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Change_it.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Continue.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Continue.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Continue.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Update.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Update.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Update.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Warning-
> small.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Warning-small.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Warning-
> small.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Warning.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Warning.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/Warning.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/minus.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/minus.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/minus.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/nodeimage.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/nodeimage.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/nodeimage.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/plus.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/plus.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/plus.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added: tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> active-left.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-active-left.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> active-left.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added: tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> active-mid.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-active-mid.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> active-mid.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added: tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> active-right.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-active-right.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> active-right.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added: tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> inactive-left.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-inactive-left.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> inactive-left.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added: tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> inactive-mid.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-inactive-mid.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> inactive-mid.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added: tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> inactive-right.gif
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-inactive-right.gif?view=auto&rev=486027
>
> ==============================================================================
> Binary file - no diff available.
>
> Propchange:
> tapestry/tapestry5/tapestry-Workbench/src/main/webapp/images/tab-
> inactive-right.gif
>
> ------------------------------------------------------------------------------
> svn:mime-type = application/octet-stream
>
> Added: tapestry/tapestry5/tapestry-Workbench/src/test/conf/webdefault-
> nojsp.xml
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/test/conf/webdefault-nojsp.xml?view=auto&rev=486027
>
> ==============================================================================
> --- tapestry/tapestry5/tapestry-Workbench/src/test/conf/webdefault-
> nojsp.xml (added)
> +++ tapestry/tapestry5/tapestry-Workbench/src/test/conf/webdefault-
> nojsp.xml Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,177 @@
> +<?xml version="1.0" encoding="ISO-8859-1"?>
> +<!--
> + Copyright 2006 The Apache Software Foundation
> +
> + Licensed under the Apache License, Version 2.0 (the "License");
> + you may not use this file except in compliance with the License.
> + You may obtain a copy of the License at
> +
> + http://www.apache.org/licenses/LICENSE-2.0
> +
> + Unless required by applicable law or agreed to in writing, software
> + distributed under the License is distributed on an "AS IS" BASIS,
> + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + See the License for the specific language governing permissions and
> + limitations under the License.
> +-->
> +
> +<web-app
> + xmlns="http://java.sun.com/xml/ns/j2ee"
> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
> http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
> + version="2.4">
> +
> + <description>
> + Default web.xml file.
> + This file is applied to a Web application before it's own
> WEB_INF/web.xml file
> + </description>
> +
> +
> +
> + <!--
> ==================================================================== -->
> + <!-- Context params to control Session
> Cookies -->
> + <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> - -->
> + <!-- UNCOMMENT TO ACTIVATE
> + <context-param>
> + <param-name>org.mortbay.jetty.servlet.SessionDomain</param-name>
> + <param-value>127.0.0.1</param-value>
> + </context-param>
> +
> + <context-param>
> + <param-name>org.mortbay.jetty.servlet.SessionPath</param-name>
> + <param-value>/</param-value>
> + </context-param>
> +
> + <context-param>
> + <param-name>org.mortbay.jetty.servlet.MaxAge</param-name>
> + <param-value>-1</param-value>
> + </context-param>
> + -->
> +
> +
> +
> + <!--
> ==================================================================== -->
> + <!-- The default
> servlet. -->
> + <!-- This servlet, normally mapped to /, provides the handling for
> static -->
> + <!-- content, OPTIONS and TRACE methods for the
> context. -->
> + <!-- The following initParameters are
> supported: -->
>
> + <!-- -->
> + <!-- acceptRanges If true, range requests and responses
> are -->
> + <!-- supported
> -->
>
> + <!-- -->
> + <!-- dirAllowed If true, directory listings are returned if
> no -->
> + <!-- welcome file is found. Else 403
> Forbidden. -->
>
> + <!-- -->
> + <!-- putAllowed If true, the PUT method is
> allowed -->
>
> + <!-- -->
> + <!-- delAllowed If true, the DELETE method is
> allowed -->
>
> + <!-- -->
> + <!-- redirectWelcome If true, redirect welcome file
> requests -->
> + <!-- else use request dispatcher
> forwards -->
>
> + <!-- -->
> + <!-- minGzipLength If set to a positive integer, then static
> content -->
> + <!-- larger than this will be served as gzip
> content -->
> + <!-- encoded if a matching resource is found
> ending -->
> + <!-- with
> ".gz" -->
>
> + <!-- -->
> + <!-- resoureBase Can be set to replace the context resource
> base -->
>
> + <!-- -->
> + <!--
> relativeResourceBase -->
> + <!-- Set with a pathname relative to the base of
> the -->
> + <!-- servlet context root. Useful for only
> serving -->
> + <!-- static content from only specific
> subdirectories. -->
>
> + <!-- -->
> + <!-- The MOVE method is allowed if PUT and DELETE are
> allowed -->
> + <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> - -->
> + <servlet>
> + <servlet-name>default</servlet-name>
> + <servlet-class>org.mortbay.jetty.servlet.Default</servlet-class>
> + <init-param>
> + <param-name>acceptRanges</param-name>
> + <param-value>true</param-value>
> + </init-param>
> + <init-param>
> + <param-name>dirAllowed</param-name>
> + <param-value>true</param-value>
> + </init-param>
> + <init-param>
> + <param-name>putAllowed</param-name>
> + <param-value>false</param-value>
> + </init-param>
> + <init-param>
> + <param-name>delAllowed</param-name>
> + <param-value>false</param-value>
> + </init-param>
> + <init-param>
> + <param-name>redirectWelcome</param-name>
> + <param-value>false</param-value>
> + </init-param>
> + <init-param>
> + <param-name>minGzipLength</param-name>
> + <param-value>8192</param-value>
> + </init-param>
> + <load-on-startup>0</load-on-startup>
> + </servlet>
> +
> +
> + <servlet-mapping> <servlet-name>default</servlet-name>
> <url-pattern>/</url-pattern> </servlet-mapping>
> +
> + <!--
> ==================================================================== -->
> + <session-config>
> + <session-timeout>30</session-timeout>
> + </session-config>
> +
> +
> + <!--
> ==================================================================== -->
> + <welcome-file-list>
> + <welcome-file>index.html</welcome-file>
> + <welcome-file>index.htm</welcome-file>
> + </welcome-file-list>
> +
> + <!--
> ==================================================================== -->
> + <locale-encoding-mapping-list>
>
> + <locale-encoding-mapping><locale>ar</locale><encoding>ISO-8859-6</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>be</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>bg</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>ca</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>cs</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>da</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>de</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>el</locale><encoding>ISO-8859-7</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>en</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>es</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>et</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>fi</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>fr</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>hr</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>hu</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>is</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>it</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>iw</locale><encoding>ISO-8859-8</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>ja</locale><encoding>Shift_JIS</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>ko</locale><encoding>EUC-KR</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>lt</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>lv</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>mk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>nl</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>no</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>pl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>pt</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>ro</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>ru</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>sh</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>sk</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>sl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>sq</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>sr</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>sv</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>tr</locale><encoding>ISO-8859-9</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>uk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>zh</locale><encoding>GB2312</encoding></locale-encoding-mapping>
>
> + <locale-encoding-mapping><locale>zh_TW</locale><encoding>Big5</encoding></locale-encoding-mapping>
> + </locale-encoding-mapping-list>
> +
> +
> +
> +</web-app>
> +
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/SeleniumClientFactory.java
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/SeleniumClientFactory.java?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/SeleniumClientFactory.java
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/SeleniumClientFactory.java
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,17 @@
> +package org.apache.tapestry.workbench.test;
> +
> +import org.openqa.selenium.server.SeleniumServer;
> +
> +import com.thoughtworks.selenium.DefaultSelenium;
> +import com.thoughtworks.selenium.Selenium;
> +
> +public class SeleniumClientFactory
> +{
> + public static Selenium makeClient()
> + {
> + Selenium seleniumClient = new DefaultSelenium("localhost",
> + SeleniumServer.DEFAULT_PORT, "*firefox",
> WorkbenchLauncher.BASE_URL);
> + seleniumClient.start();
> + return seleniumClient;
> + }
> +}
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/TabLinksTest.java
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/TabLinksTest.java?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/TabLinksTest.java
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/TabLinksTest.java
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,78 @@
> +package org.apache.tapestry.workbench.test;
> +
> +import org.testng.annotations.AfterTest;
> +import org.testng.annotations.BeforeTest;
> +import org.testng.annotations.Test;
> +
> +import com.thoughtworks.selenium.Selenium;
> +
> +import static org.testng.Assert.assertEquals;
> +import static org.testng.Assert.assertTrue;
> +
> +@Test(timeOut = 50000)
> +public class TabLinksTest
> +{
> + private static final String PAGE_LOAD_TIMEOUT = "600000";
> +
> + private Selenium seleniumClient;
> +
> + @BeforeTest
> + public void setUp()
> + {
> + seleniumClient = SeleniumClientFactory.makeClient();
> + openHome();
> + }
> +
> + @AfterTest
> + public void tearDown()
> + {
> + seleniumClient.close();
> + }
> +
> + public void testTabLinks()
> + {
> + assertLinkExists("Home");
> + assertLinkExists("L10N");
> + assertLinkExists("Fields");
> + }
> +
> + public void testHighlightCurrentPageLink()
> + {
> + clickAndWait("link=Fields");
> + assertTabLinkActive(0, false);
> + assertTabLinkActive(1, false);
> + assertTabLinkActive(2, true);
> + assertTabLinkActive(3, false);
> + }
> +
> + private void assertTabLinkActive(int tabIndex, boolean isActive)
> + {
> + String expectedImgURLFragment = String.format("-%s-",
> + isActive ? "active" : "inactive");
> + int tdTagIndexForLink = 3 * tabIndex + 1;
> + String imageForFieldsPage = seleniumClient.getText(
> String.format(
> + "//td[%d]/@background",
> zeroToOneBase(tdTagIndexForLink)));
> + assertTrue(imageForFieldsPage.indexOf(expectedImgURLFragment)
> != -1);
> + }
> +
> + private int zeroToOneBase(int index)
> + {
> + return index + 1;
> + }
> +
> + private void openHome()
> + {
> + seleniumClient.open(WorkbenchLauncher.BASE_URL +
> "/Home.html");
> + }
> +
> + private void assertLinkExists(String text)
> + {
> + assertEquals(seleniumClient.getText("link=" + text),
> text);
> + }
> +
> + private void clickAndWait(String link)
> + {
> + seleniumClient.click(link);
> + seleniumClient.waitForPageToLoad(PAGE_LOAD_TIMEOUT);
> + }
> +}
>
> Added:
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/WorkbenchLauncher.java
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/WorkbenchLauncher.java?view=auto&rev=486027
>
> ==============================================================================
> ---
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/WorkbenchLauncher.java
> (added)
> +++
> tapestry/tapestry5/tapestry-Workbench/src/test/java/org/apache/tapestry/workbench/test/WorkbenchLauncher.java
> Mon Dec 11 21:05:43 2006
> @@ -0,0 +1,58 @@
> +package org.apache.tapestry.workbench.test;
> +
> +import java.io.IOException;
> +
> +import org.mortbay.jetty.Server;
> +import org.mortbay.jetty.servlet.WebApplicationContext;
> +import org.mortbay.util.InetAddrPort;
> +import org.openqa.selenium.server.SeleniumServer;
> +import org.testng.annotations.AfterSuite;
> +import org.testng.annotations.BeforeSuite;
> +
> +public class WorkbenchLauncher
> +{
> + private static final int JETTY_PORT = 9999;
> +
> + private static final String CONTEXT = "/myapp";
> +
> + public static final String BASE_URL = String.format(
> + "http://localhost:%s%s", JETTY_PORT, CONTEXT);
> +
> + private Server jetty;
> +
> + private SeleniumServer seleniumServer;
> +
> + @BeforeSuite
> + public void start() throws Exception
> + {
> + startJetty();
> + startSeleniumServer();
> + }
> +
> + private void startJetty() throws IOException, Exception
> + {
> + jetty = new Server();
> + jetty.addListener(new InetAddrPort(JETTY_PORT));
> + WebApplicationContext context = jetty.addWebApplication
> (CONTEXT,
> + "src/main/webapp");
> + context.setDefaultsDescriptor("src/test/conf/webdefault-
> nojsp.xml");
> + jetty.start();
> + }
> +
> + private void startSeleniumServer() throws Exception
> + {
> + seleniumServer = new SeleniumServer();
> + seleniumServer.start();
> + }
> +
> + @AfterSuite
> + public void stop() throws InterruptedException
> + {
> + seleniumServer.stop();
> + jetty.stop();
> + }
> + public static void main(String[] args) throws Exception
> + {
> + new WorkbenchLauncher().start();
> + }
> +}
>
> Added: tapestry/tapestry5/tapestry-Workbench/testng.xml
> URL:
> http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-Workbench/testng.xml?view=auto&rev=486027
>
> ==============================================================================
> --- tapestry/tapestry5/tapestry-Workbench/testng.xml (added)
> +++ tapestry/tapestry5/tapestry-Workbench/testng.xml Mon Dec 11 21:05:43
> 2006
> @@ -0,0 +1,9 @@
> +<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
> +<suite name="Workbench">
> + <test verbose="2" name="org.apache.tapestry.workbench.test"
> annotations="1.5">
> + <classes>
> + <class name="org.apache.tapestry.workbench.test.WorkbenchLauncher
> " />
> + <class name="org.apache.tapestry.workbench.test.TabLinksTest" />
> + </classes>
> + </test>
> +</suite>
>
>
>
--
Howard M. Lewis Ship
TWD Consulting, Inc.
Independent J2EE / Open-Source Java Consultant
Creator and PMC Chair, Apache Tapestry
Creator, Apache HiveMind
Professional Tapestry training, mentoring, support
and project work. http://howardlewisship.com