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
<t:extension-point>
+ * and <t:replace>.
+ * @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