This is an automated email from the ASF dual-hosted git repository. thiagohp pushed a commit to branch TAP5-2779 in repository https://gitbox.apache.org/repos/asf/tapestry-5.git
commit 9d0c033ba57be4ff571688a4e6c7bd7c601ab578 Author: Thiago H. de Paula Figueiredo <[email protected]> AuthorDate: Tue Jul 9 23:04:46 2024 -0300 TAP5-2742: handling non-existing references to mixins and components plus on-demand processing of dependencies --- .../services/ComponentDependencyRegistryImpl.java | 55 +++++++++++++++++++--- 1 file changed, 48 insertions(+), 7 deletions(-) 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 908b20a2a..fcaec091b 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 @@ -46,7 +46,9 @@ import org.apache.tapestry5.annotations.Mixins; import org.apache.tapestry5.commons.Resource; import org.apache.tapestry5.commons.internal.util.TapestryException; import org.apache.tapestry5.commons.services.InvalidationEventHub; +import org.apache.tapestry5.commons.util.UnknownValueException; import org.apache.tapestry5.internal.TapestryInternalUtils; +import org.apache.tapestry5.internal.ThrowawayClassLoader; import org.apache.tapestry5.internal.parser.ComponentTemplate; import org.apache.tapestry5.internal.parser.StartComponentToken; import org.apache.tapestry5.internal.parser.TemplateToken; @@ -300,15 +302,34 @@ public class ComponentDependencyRegistryImpl implements ComponentDependencyRegis String logicalName = componentToken.getComponentType(); if (logicalName != null) { - dependency = resolver.resolveComponentTypeToClassName(logicalName); - add(className, dependency, DependencyType.USAGE); - processClassName.accept(dependency); + try + { + dependency = resolver.resolveComponentTypeToClassName(logicalName); + add(className, dependency, DependencyType.USAGE); + processClassName.accept(dependency); + } + catch (UnknownValueException e) + { + // Logical name doesn't match an existing component. Ignore + } } for (String mixin : TapestryInternalUtils.splitAtCommas(componentToken.getMixins())) { - dependency = resolver.resolveMixinTypeToClassName(mixin); - add(className, dependency, DependencyType.USAGE); - processClassName.accept(dependency); + try + { + if (mixin.contains("::")) + { + mixin = mixin.substring(0, mixin.indexOf("::")); + } + dependency = resolver.resolveMixinTypeToClassName(mixin); + add(className, dependency, DependencyType.USAGE); + processClassName.accept(dependency); + } + catch (UnknownValueException e) + { + // Mixin name doesn't match an existing mixin. Ignore + } + } } } @@ -540,15 +561,21 @@ public class ComponentDependencyRegistryImpl implements ComponentDependencyRegis @Override public Set<String> getDependents(String className) { + + ensureClassIsAlreadyProcessed(className); + final Set<Dependency> dependents = map.get(className); return dependents != null ? dependents.stream().map(d -> d.className).collect(Collectors.toSet()) : Collections.emptySet(); } - + @Override public Set<String> getDependencies(String className, DependencyType type) { + + ensureClassIsAlreadyProcessed(className); + Set<String> dependencies = Collections.emptySet(); if (alreadyProcessed.contains(className)) { @@ -793,6 +820,20 @@ public class ComponentDependencyRegistryImpl implements ComponentDependencyRegis } } + private void ensureClassIsAlreadyProcessed(String className) { + if (!contains(className)) + { + ThrowawayClassLoader classLoader = new ThrowawayClassLoader(getClass().getClassLoader()); + try + { + register(classLoader.loadClass(className)); + } catch (ClassNotFoundException e) + { + throw new RuntimeException(e); + } + } + } + /** * Only really implemented method is {@link ComponentModel#getBaseResource()} */
