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()}
      */

Reply via email to