Author: jkuhnert
Date: Wed May  2 18:43:05 2007
New Revision: 534680

URL: http://svn.apache.org/viewvc?view=rev&rev=534680
Log:
There. Take that TAPESTRY-1396.

Added:
    
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/form/
    
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/
    
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.html
   (with props)
    
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.java
   (contents, props changed)
      - copied, changed from r534640, 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/ShowError.java
Removed:
    
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Redirect.page
Modified:
    tapestry/tapestry4/trunk/tapestry-examples/Workbench/pom.xml
    
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Palette.html
    tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Upload.html
    
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Chart.page
    
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Dates.page
    
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/ErrorFest.page
    
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Fields.page
    
tapestry/tapestry4/trunk/tapestry-framework/src/descriptor/META-INF/tapestry.parse.xml
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/TapestryUtils.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/ContextAssetFactory.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/resolver/ComponentSpecificationResolverImpl.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentTemplateLoaderImpl.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/TemplateSourceImpl.java

Modified: tapestry/tapestry4/trunk/tapestry-examples/Workbench/pom.xml
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/pom.xml?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-examples/Workbench/pom.xml (original)
+++ tapestry/tapestry4/trunk/tapestry-examples/Workbench/pom.xml Wed May  2 
18:43:05 2007
@@ -57,6 +57,9 @@
                 <includes>
                     <include>**/*.gif</include>
                     <include>**/*.png</include>
+                    <include>**/*.jwc</include>
+                    <include>**/*.page</include>
+                    <include>**/*.html</include>
                 </includes>
             </resource>
         </resources>

Modified: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Palette.html
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Palette.html?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Palette.html 
(original)
+++ 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Palette.html 
Wed May  2 18:43:05 2007
@@ -12,7 +12,7 @@
 <input jwcid="inputEnabled"/> Enable Client Side Validation
 </form>
 
-<span jwcid="@ShowError" delegate="bean:delegate"/>
+<span jwcid="@form/ShowError" delegate="bean:delegate"/>
 
 <form jwcid="form">
 

Modified: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Upload.html
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Upload.html?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Upload.html 
(original)
+++ 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/Upload.html 
Wed May  2 18:43:05 2007
@@ -13,7 +13,7 @@
 <input jwcid="inputEnabled"/> Enable Client Side Validation
 </form>
 
-<span jwcid="@ShowError" delegate="bean:delegate"/>
+<span jwcid="@form/ShowError" delegate="bean:delegate"/>
 
 <form jwcid="@Form" success="listener:doSubmit" delegate="bean:delegate" 
clientValidationEnabled="ognl:clientValidationEnabled">
   

Modified: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Chart.page
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Chart.page?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Chart.page
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Chart.page
 Wed May  2 18:43:05 2007
@@ -26,7 +26,7 @@
   <bean name="delegate" property="delegate"
         class="org.apache.tapestry.workbench.WorkbenchValidationDelegate"/>
 
-  <component id="showError" type="ShowError">
+  <component id="showError" type="form/ShowError">
      <binding name="delegate" value="bean:delegate"/>
   </component>
 

Modified: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Dates.page
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Dates.page?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Dates.page
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Dates.page
 Wed May  2 18:43:05 2007
@@ -41,7 +41,7 @@
     <binding name="onchange" value="literal:tapestry.form.submit(this.form);"/>
   </component>
   
-  <component id="showError" type="ShowError">
+  <component id="showError" type="form/ShowError">
      <binding name="delegate" value="bean:delegate"/>
   </component>
 

Modified: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/ErrorFest.page
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/ErrorFest.page?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/ErrorFest.page
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/ErrorFest.page
 Wed May  2 18:43:05 2007
@@ -17,14 +17,14 @@
 
 <!DOCTYPE page-specification PUBLIC 
   "-//Apache Software Foundation//Tapestry Specification 3.0//EN" 
-  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd";>
+  "http://tapestry.apache.org/dtd/Tapestry_3_0.dtd";>
        
 <page-specification class="org.apache.tapestry.workbench.fields.Fields">
 
     <inject type="state" property="visit" object="session-data" />
 
        <component id="border" type="Border"/>
-       <component id="showError" type="ShowError">
+       <component id="showError" type="form/ShowError">
                <binding name="delegate" expression="beans.delegate"/>
        </component>
        <component id="form" type="Form">

Modified: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Fields.page
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Fields.page?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Fields.page
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/context/WEB-INF/Fields.page
 Wed May  2 18:43:05 2007
@@ -37,7 +37,7 @@
     <binding name="onClick" value="literal:tapestry.form.submit(this.form)"/>
   </component>
   
-  <component id="showError" type="ShowError">
+  <component id="showError" type="form/ShowError">
      <binding name="delegate" value="bean:delegate"/>
   </component>
 

Added: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.html
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.html?view=auto&rev=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.html
 (added)
+++ 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.html
 Wed May  2 18:43:05 2007
@@ -0,0 +1,8 @@
+<table class="inputerror">
+    <tr valign="top">
+        <td><img src="images/Warning.gif" alt="Warning" width="42" height="42" 
/></td>
+        <td class="message">
+            <span jwcid="@RenderBody" />
+        </td>
+    </tr>
+</table>
\ No newline at end of file

Propchange: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.html
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.java
 (from r534640, 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/ShowError.java)
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.java?view=diff&rev=534680&p1=tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/ShowError.java&r1=534640&p2=tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.java&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/ShowError.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.java
 Wed May  2 18:43:05 2007
@@ -12,11 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package org.apache.tapestry.workbench.components;
+package org.apache.tapestry.workbench.components.form;
 
-import java.util.List;
-
-import org.apache.tapestry.AbstractComponent;
+import org.apache.tapestry.BaseComponent;
 import org.apache.tapestry.IMarkupWriter;
 import org.apache.tapestry.IRender;
 import org.apache.tapestry.IRequestCycle;
@@ -24,17 +22,18 @@
 import org.apache.tapestry.annotations.Parameter;
 import org.apache.tapestry.valid.IValidationDelegate;
 
+import java.util.List;
+
 /**
  * This would normally be done entirely <em>without</em> using code. Trying to 
demonstrate that
  * you can create components without a .jwc file by matching the component 
type against a class name
  * (in the proper package, as defined in the application specification).
  * 
  * @author Howard Lewis Ship
- * @since 4.0
  */
 @ComponentClass(allowBody = false, allowInformalParameters = false)
-public abstract class ShowError extends AbstractComponent
-{
+public abstract class ShowError extends BaseComponent {
+
     @Parameter(required = true)
     public abstract IValidationDelegate getDelegate();
 
@@ -48,27 +47,18 @@
 
         if (!delegate.getHasErrors())
             return;
+        
+        super.renderComponent(writer, cycle);
+    }
 
-        writer.begin("table");
-        writer.attribute("class", "inputerror");
-
-        writer.begin("tr");
-        writer.attribute("valign", "top");
-
-        writer.begin("td");
-        writer.beginEmpty("img");
-        writer.attribute("src", "images/Warning.gif");
-        writer.attribute("width", 42);
-        writer.attribute("height", 41);
-        writer.end();
-
-        writer.begin("td");
-        writer.attribute("class", "message");
+    @Override
+    @SuppressWarnings("unchecked")
+    public void renderBody(IMarkupWriter writer, IRequestCycle cycle)
+    {
+        IValidationDelegate delegate = getDelegate();
 
         List<IRender> errorRenders = delegate.getErrorRenderers();
 
         errorRenders.get(0).render(writer, cycle);
-
-        writer.end("table");
     }
 }

Propchange: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
tapestry/tapestry4/trunk/tapestry-examples/Workbench/src/java/org/apache/tapestry/workbench/components/form/ShowError.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/descriptor/META-INF/tapestry.parse.xml
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/descriptor/META-INF/tapestry.parse.xml?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/descriptor/META-INF/tapestry.parse.xml
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/descriptor/META-INF/tapestry.parse.xml
 Wed May  2 18:43:05 2007
@@ -85,6 +85,8 @@
         <set-service property="componentSpecificationResolver" 
service-id="tapestry.page.ComponentSpecificationResolver"/>
         <set-object property="componentPropertySource"  
value="infrastructure:componentPropertySource"/>
         <set-object property="localizer" 
value="infrastructure:resourceLocalizer"/>
+        <set-service property="contextAssetFactory" 
service-id="tapestry.asset.ContextAssetFactory" />
+        <set-service property="classpathAssetFactory" 
service-id="tapestry.asset.ClasspathAssetFactory" />
         <event-listener service-id="tapestry.ResetEventHub"/>
         <event-listener service-id="tapestry.describe.ReportStatusHub"/>
       </construct>

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/TapestryUtils.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/TapestryUtils.java?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/TapestryUtils.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/TapestryUtils.java
 Wed May  2 18:43:05 2007
@@ -14,14 +14,14 @@
 
 package org.apache.tapestry;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.hivemind.HiveMind;
 import org.apache.hivemind.Location;
 import org.apache.hivemind.util.Defense;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Constants and static methods.
  * 
@@ -226,8 +226,7 @@
 
         if (start == 0 && length == buffer.length)
         {
-            return new String[]
-            { input };
+            return new String[] { input };
         }
 
         // The final token.

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/ContextAssetFactory.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/ContextAssetFactory.java?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/ContextAssetFactory.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/asset/ContextAssetFactory.java
 Wed May  2 18:43:05 2007
@@ -56,7 +56,6 @@
     Resource findAsset(IComponentSpecification spec, Resource baseResource, 
String path, Locale locale)
     {
         Resource assetResource = 
baseResource.getRelativeResource("/").getRelativeResource(path);
-        
         Resource localized = _localizer.findLocalization(assetResource, 
locale);
 
         if (localized == null && spec != null && 
spec.getLocation().getResource() != null) {

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/resolver/ComponentSpecificationResolverImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/resolver/ComponentSpecificationResolverImpl.java?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/resolver/ComponentSpecificationResolverImpl.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/resolver/ComponentSpecificationResolverImpl.java
 Wed May  2 18:43:05 2007
@@ -253,8 +253,7 @@
 
         if (componentResource.getResourceURL() == null) {
             
-            Resource classResource = new ClasspathResource(_classResolver, 
componentClass.getName().replace('.', '/'));
-            componentResource = classResource.getRelativeResource(type + 
".jwc");
+            componentResource = new ClasspathResource(_classResolver, 
componentClass.getName().replace('.', '/'));
         }
 
         Location location = new LocationImpl(componentResource);

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentTemplateLoaderImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentTemplateLoaderImpl.java?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentTemplateLoaderImpl.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentTemplateLoaderImpl.java
 Wed May  2 18:43:05 2007
@@ -55,8 +55,8 @@
     {
         ComponentTemplate template = _templateSource.getTemplate(requestCycle, 
loadComponent);
 
-        ComponentTemplateLoaderLogic logic = new 
ComponentTemplateLoaderLogic(_log, _pageLoader,
-                _bindingSource);
+        ComponentTemplateLoaderLogic logic =
+                new ComponentTemplateLoaderLogic(_log, _pageLoader, 
_bindingSource);
 
         logic.loadTemplate(requestCycle, loadComponent, template);
     }

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/TemplateSourceImpl.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/TemplateSourceImpl.java?view=diff&rev=534680&r1=534679&r2=534680
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/TemplateSourceImpl.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/TemplateSourceImpl.java
 Wed May  2 18:43:05 2007
@@ -14,43 +14,33 @@
 
 package org.apache.tapestry.services.impl;
 
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
-
+import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap;
 import org.apache.commons.logging.Log;
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.hivemind.Resource;
-import org.apache.tapestry.IAsset;
-import org.apache.tapestry.IComponent;
-import org.apache.tapestry.IPage;
-import org.apache.tapestry.IRequestCycle;
-import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.*;
+import org.apache.tapestry.asset.AssetFactory;
 import org.apache.tapestry.engine.ITemplateSourceDelegate;
 import org.apache.tapestry.event.ReportStatusEvent;
 import org.apache.tapestry.event.ReportStatusListener;
 import org.apache.tapestry.event.ResetEventListener;
 import org.apache.tapestry.l10n.ResourceLocalizer;
-import org.apache.tapestry.parse.ComponentTemplate;
-import org.apache.tapestry.parse.ITemplateParser;
-import org.apache.tapestry.parse.ITemplateParserDelegate;
-import org.apache.tapestry.parse.TemplateParseException;
-import org.apache.tapestry.parse.TemplateToken;
-import org.apache.tapestry.parse.TextToken;
-import org.apache.tapestry.parse.TokenType;
+import org.apache.tapestry.parse.*;
 import org.apache.tapestry.resolver.ComponentSpecificationResolver;
 import org.apache.tapestry.services.ComponentPropertySource;
 import org.apache.tapestry.services.TemplateSource;
 import org.apache.tapestry.spec.IComponentSpecification;
 import org.apache.tapestry.util.MultiKey;
 
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+
 /**
  * Implementation of [EMAIL PROTECTED] 
org.apache.tapestry.services.TemplateSource}. Templates, once parsed,
  * stay in memory until explicitly cleared.
@@ -66,6 +56,8 @@
 
     public static final String TEMPLATE_ENCODING_PROPERTY_NAME = 
"org.apache.tapestry.template-encoding";
 
+    private static final String WEB_INF = "/WEB-INF/";
+
     private static final int BUFFER_SIZE = 2000;
 
     private String _serviceId;
@@ -76,12 +68,12 @@
     // specification resource path and locale (local may be null), value
     // is the ComponentTemplate.
 
-    private Map _cache = Collections.synchronizedMap(new HashMap());
+    private Map _cache = new ConcurrentHashMap();
 
     // Previously read templates; key is the Resource, value
     // is the ComponentTemplate.
 
-    private Map _templates = Collections.synchronizedMap(new HashMap());
+    private Map _templates = new ConcurrentHashMap();
 
     private ITemplateParser _parser;
 
@@ -105,6 +97,12 @@
 
     private ResourceLocalizer _localizer;
 
+    /** @since 4.1.2 */
+    private AssetFactory _classpathAssetFactory;
+
+    /** @since 4.1.2 */
+    private AssetFactory _contextAssetFactory;
+
     /**
      * Clears the template cache. This is used during debugging.
      */
@@ -179,8 +177,7 @@
 
         Locale locale = component.getPage().getLocale();
 
-        Object key = new MultiKey(new Object[]
-        { resource, locale }, false);
+        Object key = new MultiKey(new Object[] { resource, locale }, false);
 
         ComponentTemplate result = searchCache(key);
         if (result != null)
@@ -258,9 +255,57 @@
                     templateExtension,
                     locale);
 
+        if (result == null) {
+            
+            templateAsset = findSpeclessTemplate(cycle, resource, component, 
locale, templateExtension);
+            
+            if (templateAsset != null)
+                return readTemplateFromAsset(cycle, component, templateAsset);
+        }
+
         return result;
     }
 
+    private IAsset findSpeclessTemplate(IRequestCycle cycle, Resource base,
+                                                   IComponent component, 
Locale locale, String templateExtension)
+    {
+        String componentPackages = 
component.getNamespace().getPropertyValue("org.apache.tapestry.component-class-packages");
+        if (componentPackages == null)
+            return null;
+
+        String name = base.getName();
+        String className = 
component.getSpecification().getComponentClassName();
+
+        String[] packages = TapestryUtils.split(componentPackages);
+        for (int i=0; i < packages.length; i++)
+        {
+            int index = className.lastIndexOf(packages[i]);
+            if (index < 0)
+                continue;
+
+            String templateName = name + "." + templateExtension;
+
+            if 
(_classpathAssetFactory.assetExists(component.getSpecification(), base, 
templateName, locale))
+                return _classpathAssetFactory.createAsset(base, 
component.getSpecification(), templateName, locale, component.getLocation());
+
+            // else try various forms of context searches
+
+            templateName = className.substring((index + packages[i].length()) 
+ 1, className.length()).replaceAll("\\.", "/");
+            templateName =  templateName + "." + templateExtension;
+            Resource context = 
component.getNamespace().getSpecificationLocation();
+            
+            if (_contextAssetFactory.assetExists(component.getSpecification(), 
context, templateName, locale)) {
+
+                return _classpathAssetFactory.createAsset(context, 
component.getSpecification(), templateName, locale, component.getLocation());
+            } else if 
(_contextAssetFactory.assetExists(component.getSpecification(), context, 
WEB_INF + templateName, locale)) {
+
+                return _classpathAssetFactory.createAsset(context, 
component.getSpecification(), WEB_INF + templateName, locale, 
component.getLocation());
+            }
+        }
+        
+        return null;
+    }
+
     private ComponentTemplate findPageTemplateInApplicationRoot(IRequestCycle 
cycle, IPage page,
             String templateExtension, Locale locale)
     {
@@ -330,10 +375,7 @@
                     + " in locale " + locale.getDisplayName());
 
         Resource baseTemplateLocation = 
resource.getRelativeResource(templateBaseName);
-
-        Resource localizedTemplateLocation = _localizer.findLocalization(
-                baseTemplateLocation,
-                locale);
+        Resource localizedTemplateLocation = 
_localizer.findLocalization(baseTemplateLocation, locale);
 
         if (localizedTemplateLocation == null)
             return null;
@@ -385,7 +427,7 @@
     }
 
     /**
-     * This method is currently synchronized, because [EMAIL PROTECTED] 
TemplateParser}is not threadsafe.
+     * This method is currently synchronized, because [EMAIL PROTECTED] 
org.apache.tapestry.parse.TemplateParser} is not threadsafe.
      * Another good candidate for a pooling mechanism, especially because 
parsing a template may
      * take a while.
      */
@@ -509,7 +551,7 @@
     /**
      * Checks for the [EMAIL PROTECTED] 
Tapestry#TEMPLATE_EXTENSION_PROPERTY}in the component's specification,
      * then in the component's namespace's specification. Returns
-     * [EMAIL PROTECTED] Tapestry#DEFAULT_TEMPLATE_EXTENSION}if not otherwise 
overriden.
+     * [EMAIL PROTECTED] Tapestry#TEMPLATE_EXTENSION_PROPERTY} if not 
otherwise overriden.
      */
 
     private String getTemplateExtension(IComponent component)
@@ -577,5 +619,17 @@
     public void setLocalizer(ResourceLocalizer localizer)
     {
         _localizer = localizer;
+    }
+
+    /** @since 4.1.2 */
+    public void setClasspathAssetFactory(AssetFactory classpathAssetFactory)
+    {
+        _classpathAssetFactory = classpathAssetFactory;
+    }
+
+    /** @since 4.1.2 */
+    public void setContextAssetFactory(AssetFactory contextAssetFactory)
+    {
+        _contextAssetFactory = contextAssetFactory;
     }
 }


Reply via email to