You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2022/07/27 18:30:19 UTC

svn commit: r1903064 - /xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/config/BindingConfigImpl.java

Author: fanningpj
Date: Wed Jul 27 18:30:19 2022
New Revision: 1903064

URL: http://svn.apache.org/viewvc?rev=1903064&view=rev
Log:
[XMLBEANS-619] performance change in BindingConfigImpl. Thanks to Peter Keller. This closes #7

Modified:
    xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/config/BindingConfigImpl.java

Modified: xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/config/BindingConfigImpl.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/config/BindingConfigImpl.java?rev=1903064&r1=1903063&r2=1903064&view=diff
==============================================================================
--- xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/config/BindingConfigImpl.java (original)
+++ xmlbeans/trunk/src/main/java/org/apache/xmlbeans/impl/config/BindingConfigImpl.java Wed Jul 27 18:30:19 2022
@@ -46,6 +46,42 @@ public class BindingConfigImpl extends B
     private final List<PrePostExtensionImpl> _prePostExtensions = new ArrayList<>();
     private final Map<QName, UserTypeImpl> _userTypes = new LinkedHashMap<>();
 
+    private static class JavaFilesClasspath {
+
+        private final File[] javaFiles, classpath;
+
+        JavaFilesClasspath(File[] javaFiles, File[] classpath) {
+            this.javaFiles = javaFiles != null ? Arrays.copyOf(javaFiles, javaFiles.length) : new File[0];
+            this.classpath = classpath != null ? Arrays.copyOf(classpath, classpath.length) : new File[0];
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if ( other == null || ! this.getClass().isInstance(other) )
+                return false;
+            JavaFilesClasspath otherJfc = (JavaFilesClasspath) other;
+            return Arrays.equals(this.javaFiles, otherJfc.javaFiles) && Arrays.equals(this.classpath, otherJfc.classpath);
+        }
+
+        @Override
+        public int hashCode() {
+            return Arrays.hashCode(this.javaFiles) ^ Arrays.hashCode(this.classpath);
+        }
+
+    }
+
+    private static final Map<JavaFilesClasspath, Parser> _parserMap = new HashMap<>();
+
+    private static Parser parserInstance(File[] javaFiles, File[] classpath) {
+        JavaFilesClasspath jfc = new JavaFilesClasspath(javaFiles, classpath);
+        Parser parser = _parserMap.get(jfc);
+        if ( parser == null ) {
+            parser = new Parser(javaFiles, classpath);
+            _parserMap.put(jfc, parser);
+        }
+        return parser;
+    }
+
     public static BindingConfig forConfigDocuments(Config[] configs, File[] javaFiles, File[] classpath) {
         return new BindingConfigImpl(configs, javaFiles, classpath);
     }
@@ -130,7 +166,7 @@ public class BindingConfigImpl extends B
                     InterfaceExtensionImpl.MethodSignatureImpl ms2 = (InterfaceExtensionImpl.MethodSignatureImpl) methodSignatures.get(ms);
                     if (!ms.getReturnType().equals(ms2.getReturnType())) {
                         BindingConfigImpl.error("Colliding methods '" + ms.getSignature() + "' in interfaces " +
-                                                ms.getInterfaceName() + " and " + ms2.getInterfaceName() + ".", null);
+                                ms.getInterfaceName() + " and " + ms2.getInterfaceName() + ".", null);
                     }
 
                     return;
@@ -148,7 +184,7 @@ public class BindingConfigImpl extends B
                 PrePostExtensionImpl b = _prePostExtensions.get(j);
                 if (a.hasNameSetIntersection(b)) {
                     BindingConfigImpl.error("The applicable domain for handler '" + a.getHandlerNameForJavaSource() +
-                                            "' intersects with the one for '" + b.getHandlerNameForJavaSource() + "'.", null);
+                            "' intersects with the one for '" + b.getHandlerNameForJavaSource() + "'.", null);
                 }
             }
         }
@@ -201,7 +237,7 @@ public class BindingConfigImpl extends B
         Extensionconfig.Interface[] intfXO = ext.getInterfaceArray();
         Extensionconfig.PrePostSet ppXO = ext.getPrePostSet();
 
-        Parser loader = new Parser(javaFiles, classpath);
+        Parser loader = parserInstance(javaFiles, classpath);
 
         if (intfXO.length > 0 || ppXO != null) {
             for (Extensionconfig.Interface anInterface : intfXO) {
@@ -213,7 +249,7 @@ public class BindingConfigImpl extends B
     }
 
     private void recordUserTypeSetting(File[] javaFiles, File[] classpath, Usertypeconfig usertypeconfig) {
-        Parser loader = new Parser(javaFiles, classpath);
+        Parser loader = parserInstance(javaFiles, classpath);
         UserTypeImpl userType = UserTypeImpl.newInstance(loader, usertypeconfig);
         _userTypes.put(userType.getName(), userType);
     }
@@ -321,8 +357,8 @@ public class BindingConfigImpl extends B
 
     public InterfaceExtension[] getInterfaceExtensions(String fullJavaName) {
         return _interfaceExtensions.stream().
-            filter(i -> i.contains(fullJavaName)).
-            toArray(InterfaceExtension[]::new);
+                filter(i -> i.contains(fullJavaName)).
+                toArray(InterfaceExtension[]::new);
     }
 
     public PrePostExtension[] getPrePostExtensions() {
@@ -331,7 +367,7 @@ public class BindingConfigImpl extends B
 
     public PrePostExtension getPrePostExtension(String fullJavaName) {
         return _prePostExtensions.stream().
-            filter(p -> p.contains(fullJavaName)).
-            findFirst().orElse(null);
+                filter(p -> p.contains(fullJavaName)).
+                findFirst().orElse(null);
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org