remove static cache of parsers
git-svn-id: https://svn.apache.org/repos/asf/xmlbeans/trunk@1903076 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/xmlbeans/impl/config/BindingConfigImpl.java b/src/main/java/org/apache/xmlbeans/impl/config/BindingConfigImpl.java
index 48499c0..5cbf88f 100755
--- a/src/main/java/org/apache/xmlbeans/impl/config/BindingConfigImpl.java
+++ b/src/main/java/org/apache/xmlbeans/impl/config/BindingConfigImpl.java
@@ -23,7 +23,6 @@
import javax.xml.namespace.QName;
import java.io.File;
import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
/**
* An implementation of BindingConfig
@@ -47,42 +46,18 @@
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 ConcurrentHashMap<JavaFilesClasspath, Parser> _parserMap = new ConcurrentHashMap<>();
-
- private static Parser parserInstance(File[] javaFiles, File[] classpath) {
- return _parserMap.computeIfAbsent(new JavaFilesClasspath(javaFiles, classpath), jfc ->
- new Parser(jfc.javaFiles, jfc.classpath));
- }
+ private final File[] _javaFiles;
+ private final File[] _classpath;
+ private Parser _parser;
public static BindingConfig forConfigDocuments(Config[] configs, File[] javaFiles, File[] classpath) {
return new BindingConfigImpl(configs, javaFiles, classpath);
}
private BindingConfigImpl(Config[] configs, File[] javaFiles, File[] classpath) {
+ _javaFiles = (javaFiles != null) ? javaFiles.clone() : new File[0];
+ _classpath = (classpath != null) ? classpath.clone() : new File[0];
+
for (Config config : configs) {
Nsconfig[] nsa = config.getNamespaceArray();
for (Nsconfig nsconfig : nsa) {
@@ -120,12 +95,12 @@
Extensionconfig[] ext = config.getExtensionArray();
for (Extensionconfig extensionconfig : ext) {
- recordExtensionSetting(javaFiles, classpath, extensionconfig);
+ recordExtensionSetting(extensionconfig);
}
Usertypeconfig[] utypes = config.getUsertypeArray();
for (Usertypeconfig utype : utypes) {
- recordUserTypeSetting(javaFiles, classpath, utype);
+ recordUserTypeSetting(utype);
}
}
@@ -210,7 +185,7 @@
list.forEach(o -> result.put(o, value));
}
- private void recordExtensionSetting(File[] javaFiles, File[] classpath, Extensionconfig ext) {
+ private void recordExtensionSetting(Extensionconfig ext) {
NameSet xbeanSet = null;
Object key = ext.getFor();
@@ -233,7 +208,7 @@
Extensionconfig.Interface[] intfXO = ext.getInterfaceArray();
Extensionconfig.PrePostSet ppXO = ext.getPrePostSet();
- Parser loader = parserInstance(javaFiles, classpath);
+ Parser loader = parserInstance();
if (intfXO.length > 0 || ppXO != null) {
for (Extensionconfig.Interface anInterface : intfXO) {
@@ -244,12 +219,18 @@
}
}
- private void recordUserTypeSetting(File[] javaFiles, File[] classpath, Usertypeconfig usertypeconfig) {
- Parser loader = parserInstance(javaFiles, classpath);
+ private void recordUserTypeSetting(Usertypeconfig usertypeconfig) {
+ Parser loader = parserInstance();
UserTypeImpl userType = UserTypeImpl.newInstance(loader, usertypeconfig);
_userTypes.put(userType.getName(), userType);
}
+ private Parser parserInstance() {
+ if (_parser == null) {
+ _parser = new Parser(_javaFiles, _classpath);
+ }
+ return _parser;
+ }
private String lookup(Map<Object, String> map, Map<Object, String> mapByUriPrefix, String uri) {
if (uri == null) {