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

rec pushed a commit to branch 
refactoring/430-Resolving-type-system-imports-through-SPIs-slows-things-down-too-much
in repository https://gitbox.apache.org/repos/asf/uima-uimaj.git


The following commit(s) were added to 
refs/heads/refactoring/430-Resolving-type-system-imports-through-SPIs-slows-things-down-too-much
 by this push:
     new bbf537fdb Issue #430: Resolving type system imports through SPIs slows 
things down too much
bbf537fdb is described below

commit bbf537fdb8da15c2877d03fa1bac66b3923c606f
Author: Richard Eckart de Castilho <[email protected]>
AuthorDate: Wed Dec 18 08:56:02 2024 +0100

    Issue #430: Resolving type system imports through SPIs slows things down 
too much
    
    - Make transitive import resoving optional
    - Added more debug logging
---
 .../org/apache/uima/tools/bnd/UimaBndPlugin.java   | 86 ++++++++++++++++------
 1 file changed, 62 insertions(+), 24 deletions(-)

diff --git 
a/uima-bnd-plugin/src/main/java/org/apache/uima/tools/bnd/UimaBndPlugin.java 
b/uima-bnd-plugin/src/main/java/org/apache/uima/tools/bnd/UimaBndPlugin.java
index 91c6daa1b..4c8adbc31 100644
--- a/uima-bnd-plugin/src/main/java/org/apache/uima/tools/bnd/UimaBndPlugin.java
+++ b/uima-bnd-plugin/src/main/java/org/apache/uima/tools/bnd/UimaBndPlugin.java
@@ -24,6 +24,7 @@ import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.apache.uima.UIMAFramework;
@@ -44,12 +45,14 @@ import aQute.bnd.header.Attrs;
 import aQute.bnd.osgi.Analyzer;
 import aQute.bnd.osgi.Resource;
 import aQute.bnd.service.AnalyzerPlugin;
+import aQute.bnd.service.Plugin;
+import aQute.lib.converter.Converter;
+import aQute.service.reporter.Reporter;
 
-@BndPlugin(name = "UIMA")
+@BndPlugin(name = "UIMA", parameters = UimaBndPlugin.Configuration.class)
 public class UimaBndPlugin
-    implements AnalyzerPlugin
+    implements AnalyzerPlugin, Plugin
 {
-
     private static final Logger LOG = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
     private static final Pattern XML_FILE = Pattern.compile(".*\\.xml");
@@ -58,6 +61,21 @@ public class UimaBndPlugin
 
     private final static XMLParser PARSER = UIMAFramework.getXMLParser();
 
+    private Reporter reporter;
+    private UimaBndPlugin.Configuration configuration;
+
+    @Override
+    public void setProperties(Map<String, String> aMap) throws Exception
+    {
+        configuration = Converter.cnv(UimaBndPlugin.Configuration.class, aMap);
+    }
+
+    @Override
+    public void setReporter(Reporter aReporter)
+    {
+        reporter = aReporter;
+    }
+
     @Override
     public boolean analyzeJar(Analyzer analyzer) throws Exception
     {
@@ -69,10 +87,10 @@ public class UimaBndPlugin
             for (var entry : resources.entrySet()) {
                 var path = entry.getKey();
                 var resource = entry.getValue();
-    
+
                 try {
                     if (XML_FILE.matcher(path).matches()) {
-                        importsProcessed += analyzeXmlFile(analyzer, path, 
resource);
+                        importsProcessed += analyzeXmlFile(analyzer, path, 
resource, 0);
                     }
                 }
                 catch (Exception e) {
@@ -80,26 +98,26 @@ public class UimaBndPlugin
                 }
             }
         }
-        
+
         LOG.info("UIMA bnd plugin processed {} imports", importsProcessed);
 
         return false;
     }
 
-    private int analyzeXmlFile(Analyzer analyzer, String path, Resource 
resource) throws Exception
+    private int analyzeXmlFile(Analyzer analyzer, String path, Resource 
resource, int level) throws Exception
     {
         var desc = readUimaDescriptor(resource);
         if (desc == null) {
             return 0;
         }
 
-        LOG.debug("Found {}: {}", desc.getClass().getSimpleName(), path);
+        LOG.debug("{}Found {}: {}", repeat("  ", level), 
desc.getClass().getSimpleName(), path);
         var imports = getImportsFromDescriptor(desc);
 
         var importsProcessed = 0;
         for (var imp : imports) {
             if (imp.getName() != null) {
-                handleImportByName(analyzer, path, imp);
+                handleImportByName(analyzer, path, imp, level);
                 importsProcessed++;
                 continue;
             }
@@ -108,22 +126,21 @@ public class UimaBndPlugin
                 handleImportByLocation(imp);
                 continue;
             }
-            
+
             LOG.warn(
                     "Found UIMA import without name and location - ignoring, 
please fix your type system description");
         }
-        
+
         return importsProcessed;
     }
 
     private void handleImportByLocation(Import imp)
     {
-        LOG.warn(
-                "Ignoring UIMA import by location (please only use 
import-by-name): {}",
+        LOG.warn("Ignoring UIMA import by location (please only use 
import-by-name): {}",
                 imp.getLocation());
     }
 
-    private void handleImportByName(Analyzer analyzer, String path, Import 
imp) throws Exception
+    private void handleImportByName(Analyzer analyzer, String path, Import 
imp, int level) throws Exception
     {
         var tsdPackage = imp.getName();
         int lastSeparatorPosition = tsdPackage.lastIndexOf('.');
@@ -132,27 +149,30 @@ public class UimaBndPlugin
             tsdPackage = tsdPackage.substring(0, lastSeparatorPosition);
         }
 
-        LOG.debug("Found UIMA import by name: {}", tsdPackage);
-
         var pack = analyzer.getPackageRef(tsdPackage);
         if (!QN.matcher(pack.getFQN()).matches()) {
-            analyzer.warning("Import does not seem to refer to a package (%s): 
%s",
-                    path, pack);
+            analyzer.warning("Import does not seem to refer to a package (%s): 
%s", path, pack);
         }
 
-        if (!analyzer.getReferred().containsKey(pack)) {
+        var alreadyKnownImport = analyzer.getReferred().containsKey(pack);
+        if (!alreadyKnownImport) {
             var attrs = new Attrs();
             analyzer.getReferred().put(pack, attrs);
         }
+
+        LOG.debug("{}Found UIMA import by name: {} {}", repeat("  ", level), 
tsdPackage, alreadyKnownImport ? "" : "(new)");
         
-        var importedResourcePath = imp.getName().replace('.', '/')+".xml";
+        var importedResourcePath = imp.getName().replace('.', '/') + ".xml";
         var importedResource = analyzer.findResource(importedResourcePath);
         if (importedResource == null) {
-          analyzer.warning("Imported resource not found on classpath: {}", 
importedResourcePath);
-          return;
+            analyzer.warning("Imported resource not found on classpath: {}", 
importedResourcePath);
+            return;
+        }
+
+        if (configuration.transitive(false)) {
+            LOG.debug("");
+            analyzeXmlFile(analyzer, importedResourcePath, importedResource, 
level + 1);
         }
-        
-        analyzeXmlFile(analyzer, importedResourcePath, importedResource);
     }
 
     private List<Import> getImportsFromDescriptor(XMLizable desc)
@@ -203,4 +223,22 @@ public class UimaBndPlugin
 
         return Arrays.asList(aList);
     }
+    
+    private static String repeat(String aString, int aCount) {
+      if (aCount == 0) {
+        return "";
+      }
+      
+      var buf = new StringBuilder();
+      for (var i = 0; i < aCount; i++) {
+        buf.append(aString);
+      }
+
+      return buf.toString();
+    }
+
+    public static interface Configuration
+    {
+        boolean transitive(boolean aDefault);
+    }
 }
\ No newline at end of file

Reply via email to