This is an automated email from the ASF dual-hosted git repository.

thiagohp pushed a commit to branch javax
in repository https://gitbox.apache.org/repos/asf/tapestry-5.git


The following commit(s) were added to refs/heads/javax by this push:
     new 19bbf35c3 TAP5-2773: NPE when production mode on and template overrides
19bbf35c3 is described below

commit 19bbf35c3fac3358ba1703227fa6023766904eec
Author: Thiago H. de Paula Figueiredo <[email protected]>
AuthorDate: Sat Apr 6 15:23:53 2024 -0300

    TAP5-2773: NPE when production mode on and template overrides
---
 .../internal/parser/ComponentTemplate.java         |  9 ++++++++
 .../internal/parser/ComponentTemplateImpl.java     |  7 ++++++
 .../services/ComponentDependencyRegistryImpl.java  | 11 ++++++++-
 .../services/ComponentTemplateSourceImpl.java      |  8 ++++++-
 .../ComponentDependencyRegistryImplTest.java       | 27 +++++++++++++++++++---
 .../integration/app1/base/BaseLayoutPage.tml       |  2 ++
 .../app1/components/SubclassWithImport.tml         |  9 ++++++++
 .../app1/components/SuperclassWithImport.tml       | 11 +++++++++
 8 files changed, 79 insertions(+), 5 deletions(-)

diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/parser/ComponentTemplate.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/parser/ComponentTemplate.java
index 02c58181d..9e3bf18ed 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/parser/ComponentTemplate.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/parser/ComponentTemplate.java
@@ -14,6 +14,7 @@ package org.apache.tapestry5.internal.parser;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.tapestry5.commons.Location;
 import org.apache.tapestry5.commons.Resource;
@@ -55,6 +56,14 @@ public interface ComponentTemplate
      * @since 5.1.0.1
      */
     List<TemplateToken> getExtensionPointTokens(String extensionPointId);
+    
+    /**
+     * Returns the extension point ids, including both 
&lt;t:extension-point&gt;
+     * and &lt;t:replace&gt;.
+     * @return set of extension point ids.
+     * @since 5.8.5
+     */
+    Set<String> getExtensionPointIds();
 
     /**
      * Returns the resource that was parsed to form the template.
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/parser/ComponentTemplateImpl.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/parser/ComponentTemplateImpl.java
index e1616546f..42d8c18de 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/parser/ComponentTemplateImpl.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/parser/ComponentTemplateImpl.java
@@ -19,8 +19,10 @@ import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 
 import static org.apache.tapestry5.commons.util.CollectionFactory.newList;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class ComponentTemplateImpl implements ComponentTemplate
 {
@@ -93,6 +95,11 @@ public class ComponentTemplateImpl implements 
ComponentTemplate
     {
         return InternalUtils.get(overrides, extensionPointId);
     }
+    
+    public Set<String> getExtensionPointIds()
+    {
+        return overrides != null ? overrides.keySet() : Collections.emptySet();
+    }
 
     public boolean isExtension()
     {
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImpl.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImpl.java
index 594cb72ef..090d71268 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImpl.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImpl.java
@@ -26,6 +26,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -270,7 +271,15 @@ public class ComponentDependencyRegistryImpl implements 
ComponentDependencyRegis
         if (templateResource != null)
         {
             final ComponentTemplate template = 
templateParser.parseTemplate(templateResource);
-            for (TemplateToken token:  template.getTokens())
+            final List<TemplateToken> tokens = new LinkedList<>();
+
+            tokens.addAll(template.getTokens());
+            for (String id : template.getExtensionPointIds())
+            {
+                tokens.addAll(template.getExtensionPointTokens(id));
+            }
+            
+            for (TemplateToken token : tokens)
             {
                 if (token instanceof StartComponentToken) 
                 {
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java
index b1ca0d9a2..95aeb8221 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentTemplateSourceImpl.java
@@ -12,7 +12,6 @@
 
 package org.apache.tapestry5.internal.services;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -116,6 +115,13 @@ public final class ComponentTemplateSourceImpl extends 
InvalidationEventHubImpl
         {
             return false;
         }
+
+        @Override
+        public Set<String> getExtensionPointIds() 
+        {
+            return Collections.emptySet();
+        }
+        
     };
 
     public ComponentTemplateSourceImpl(@Inject
diff --git 
a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImplTest.java
 
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImplTest.java
index 579ac5010..8b89e7216 100644
--- 
a/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImplTest.java
+++ 
b/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentDependencyRegistryImplTest.java
@@ -50,6 +50,7 @@ import org.apache.tapestry5.corelib.components.If;
 import org.apache.tapestry5.corelib.components.Label;
 import org.apache.tapestry5.corelib.components.Loop;
 import org.apache.tapestry5.corelib.components.Output;
+import org.apache.tapestry5.corelib.components.OutputRaw;
 import org.apache.tapestry5.corelib.components.PageLink;
 import org.apache.tapestry5.corelib.components.PropertyDisplay;
 import org.apache.tapestry5.corelib.components.PropertyEditor;
@@ -61,9 +62,13 @@ import org.apache.tapestry5.corelib.components.Zone;
 import org.apache.tapestry5.corelib.mixins.FormGroup;
 import org.apache.tapestry5.corelib.mixins.RenderDisabled;
 import org.apache.tapestry5.corelib.pages.PropertyEditBlocks;
+import org.apache.tapestry5.integration.app1.base.BaseLayoutPage;
+import org.apache.tapestry5.integration.app1.base.EmptyExtendTemplate;
 import org.apache.tapestry5.integration.app1.components.Border;
 import org.apache.tapestry5.integration.app1.components.ErrorComponent;
 import org.apache.tapestry5.integration.app1.components.OuterAny;
+import org.apache.tapestry5.integration.app1.components.SubclassWithImport;
+import org.apache.tapestry5.integration.app1.components.SuperclassWithImport;
 import 
org.apache.tapestry5.integration.app1.components.TextOnlyOnDisabledTextField;
 import org.apache.tapestry5.integration.app1.mixins.AltTitleDefault;
 import org.apache.tapestry5.integration.app1.mixins.EchoValue;
@@ -75,6 +80,7 @@ import 
org.apache.tapestry5.integration.app1.pages.BlockHolder;
 import 
org.apache.tapestry5.integration.app1.pages.EmbeddedComponentTypeConflict;
 import org.apache.tapestry5.integration.app1.pages.InstanceMixinDependencies;
 import org.apache.tapestry5.integration.app1.pages.MixinParameterDefault;
+import org.apache.tapestry5.integration.app1.pages.TemplateOverrideDemo;
 import 
org.apache.tapestry5.internal.services.ComponentDependencyRegistry.DependencyType;
 import org.apache.tapestry5.internal.services.templates.DefaultTemplateLocator;
 import org.apache.tapestry5.ioc.internal.QuietOperationTracker;
@@ -145,6 +151,8 @@ public class ComponentDependencyRegistryImplTest
         expectResolveComponent(RenderObject.class);
         expectResolveComponent(Form.class);
         expectResolveComponent(Glyphicon.class);
+        expectResolveComponent(SubclassWithImport.class);
+        expectResolveComponent(OutputRaw.class);
         
         
EasyMock.expect(resolver.resolveMixinTypeToClassName("textonlyondisabled"))
             .andReturn(TextOnlyOnDisabled.class.getName()).anyTimes();
@@ -228,7 +236,11 @@ public class ComponentDependencyRegistryImplTest
     
     private Set<String> getDependencies(String className)
     {
-        return componentDependencyRegistry.getDependencies(className, 
DependencyType.USAGE);
+        Set<String> dependencies = new HashSet<>();
+        
dependencies.addAll(componentDependencyRegistry.getDependencies(className, 
DependencyType.USAGE));
+        
dependencies.addAll(componentDependencyRegistry.getDependencies(className, 
DependencyType.SUPERCLASS));
+        
dependencies.addAll(componentDependencyRegistry.getDependencies(className, 
DependencyType.INJECT_PAGE));
+        return Collections.unmodifiableSet(dependencies);
     }
     
     @Test
@@ -340,7 +352,7 @@ public class ComponentDependencyRegistryImplTest
     }
     
     // Tested code isn't being used at the moment
-    @Test(enabled = false)
+    @Test
     public void register()
     {
         
@@ -395,7 +407,16 @@ public class ComponentDependencyRegistryImplTest
         componentDependencyRegistry.register(InstanceMixinDependencies.class);
         assertDependencies(InstanceMixinDependencies.class, 
                 EchoValue.class, EchoValue2.class, TextField.class);
-        
+
+        // Templates with <t:extension-point>
+        componentDependencyRegistry.register(BaseLayoutPage.class);
+        assertDependencies(BaseLayoutPage.class,
+                Delegate.class, SubclassWithImport.class, Border.class);
+        
+        // Templates with <t:replace>
+        componentDependencyRegistry.register(SubclassWithImport.class);
+        assertDependencies(SubclassWithImport.class,
+                OutputRaw.class, SuperclassWithImport.class);
 
     }
     
diff --git 
a/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/base/BaseLayoutPage.tml
 
b/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/base/BaseLayoutPage.tml
index 3b214d05e..94ba75fc3 100644
--- 
a/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/base/BaseLayoutPage.tml
+++ 
b/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/base/BaseLayoutPage.tml
@@ -4,6 +4,8 @@
         <h1 id="title">
             <span t:id="titleDelegate"/>
         </h1>
+        <!-- Just for testing ComponentDependencyRegistry.register() -->
+        <t:subclassWithImport/>
     </t:extension-point>
 
     <t:extension-point id="content">
diff --git 
a/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/components/SubclassWithImport.tml
 
b/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/components/SubclassWithImport.tml
new file mode 100644
index 000000000..bc9d802cf
--- /dev/null
+++ 
b/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/components/SubclassWithImport.tml
@@ -0,0 +1,9 @@
+<!DOCTYPE html> 
+
+<t:extend xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"; 
xmlns:p="tapestry:parameter">
+       <t:replace id="details">
+               Subclass with imports
+        <!-- Just for testing ComponentDependencyRegistry.register() -->
+        <t:outputRaw value="literal:"/>
+       </t:replace>
+</t:extend>
\ No newline at end of file
diff --git 
a/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/components/SuperclassWithImport.tml
 
b/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/components/SuperclassWithImport.tml
new file mode 100644
index 000000000..beba19ca2
--- /dev/null
+++ 
b/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/components/SuperclassWithImport.tml
@@ -0,0 +1,11 @@
+<!DOCTYPE html> 
+
+<t:container xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"; 
xmlns:p="tapestry:parameter">
+
+       <p>Something before extension point</p>
+
+       <t:extension-point id="details">Superclass with 
import!</t:extension-point>
+
+       <p>Something after extension point.</p>
+
+</t:container>
\ No newline at end of file

Reply via email to