diff --git a/java_indexer/lib/java-symbol-solver-core.jar b/java_indexer/lib/java-symbol-solver-core.jar index 18562c83..3818af1e 100644 Binary files a/java_indexer/lib/java-symbol-solver-core.jar and b/java_indexer/lib/java-symbol-solver-core.jar differ diff --git a/java_indexer/lib/java-symbol-solver-logic.jar b/java_indexer/lib/java-symbol-solver-logic.jar index 2a01daa8..219eebf0 100644 Binary files a/java_indexer/lib/java-symbol-solver-logic.jar and b/java_indexer/lib/java-symbol-solver-logic.jar differ diff --git a/java_indexer/lib/java-symbol-solver-model.jar b/java_indexer/lib/java-symbol-solver-model.jar index 814428b1..ebcb497d 100644 Binary files a/java_indexer/lib/java-symbol-solver-model.jar and b/java_indexer/lib/java-symbol-solver-model.jar differ diff --git a/java_indexer/src/main/java/com/sourcetrail/JavaIndexer.java b/java_indexer/src/main/java/com/sourcetrail/JavaIndexer.java index 8153d876..424e4e56 100644 --- a/java_indexer/src/main/java/com/sourcetrail/JavaIndexer.java +++ b/java_indexer/src/main/java/com/sourcetrail/JavaIndexer.java @@ -3,25 +3,25 @@ package com.sourcetrail; import java.io.File; import java.io.IOException; import java.io.StringReader; -import java.lang.String; import java.util.HashMap; import java.util.Map; -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.PackageDeclaration; import com.github.javaparser.JavaParser; import com.github.javaparser.ParseProblemException; import com.github.javaparser.Position; import com.github.javaparser.Problem; import com.github.javaparser.Range; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.PackageDeclaration; import com.github.javaparser.symbolsolver.javaparser.Navigator; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver; -import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; +import com.sourcetrail.typesolver.SynchronizedJavaParserTypeSolver; + public class JavaIndexer { private static Map typeSolvers = new HashMap<>(); @@ -37,36 +37,40 @@ public class JavaIndexer CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(); combinedTypeSolver.add(new ReflectionTypeSolver()); - for (String path: classPath.split("\\;")) + + synchronized (typeSolvers) { - if (typeSolvers.containsKey(path)) + for (String path: classPath.split("\\;")) { - combinedTypeSolver.add(typeSolvers.get(path)); - } - else - { - TypeSolver typeSolver = null; - - if (path.endsWith(".jar")) + if (typeSolvers.containsKey(path)) { - try - { - typeSolver = new JarTypeSolver(path); - } - catch (IOException e) - { - System.out.println("unable to add jar file: " + path); - } + combinedTypeSolver.add(typeSolvers.get(path)); } - else if (!path.isEmpty()) + else { - typeSolver = new JavaParserTypeSolver(new File(path)); - } - - if (typeSolver != null) - { - typeSolvers.put(path, typeSolver); - combinedTypeSolver.add(typeSolver); + TypeSolver typeSolver = null; + + if (path.endsWith(".jar")) + { + try + { + typeSolver = new JarTypeSolver(path); + } + catch (IOException e) + { + System.out.println("unable to add jar file: " + path); + } + } + else if (!path.isEmpty()) + { + typeSolver = new SynchronizedJavaParserTypeSolver(new File(path)); + } + + if (typeSolver != null) + { + typeSolvers.put(path, typeSolver); + combinedTypeSolver.add(typeSolver); + } } } } diff --git a/java_indexer/src/main/java/com/sourcetrail/typesolver/SynchronizedJavaParserTypeSolver.java b/java_indexer/src/main/java/com/sourcetrail/typesolver/SynchronizedJavaParserTypeSolver.java new file mode 100644 index 00000000..b1dae652 --- /dev/null +++ b/java_indexer/src/main/java/com/sourcetrail/typesolver/SynchronizedJavaParserTypeSolver.java @@ -0,0 +1,53 @@ +package com.sourcetrail.typesolver; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import com.github.javaparser.symbolsolver.model.declarations.ReferenceTypeDeclaration; +import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; +import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; + +public class SynchronizedJavaParserTypeSolver extends JavaParserTypeSolver +{ + private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private Map> solvedTypes = new HashMap<>(); + + public SynchronizedJavaParserTypeSolver(File srcDir) + { + super(srcDir); + } + + @Override + public SymbolReference tryToSolveType(String name) + { + SymbolReference solvedType = SymbolReference.unsolved(ReferenceTypeDeclaration.class); + + { + lock.readLock().lock(); + if (solvedTypes.containsKey(name)) + { + solvedType = solvedTypes.get(name); + } + lock.readLock().unlock(); + } + + if (!solvedType.isSolved()) + { + solvedType = super.tryToSolveType(name); + + if (solvedType.isSolved()) + { + lock.writeLock().lock(); + if (!solvedTypes.containsKey(name)) + { + solvedTypes.put(name, solvedType); + } + lock.writeLock().unlock(); + } + } + + return solvedType; + } +} diff --git a/src/lib_java/data/parser/java/JavaEnvironmentFactory.cpp b/src/lib_java/data/parser/java/JavaEnvironmentFactory.cpp index 7dd4b769..488a4f16 100644 --- a/src/lib_java/data/parser/java/JavaEnvironmentFactory.cpp +++ b/src/lib_java/data/parser/java/JavaEnvironmentFactory.cpp @@ -53,6 +53,14 @@ void JavaEnvironmentFactory::createInstance(std::string classPath, std::string& std::string classPathOption = "-Djava.class.path=" + classPath; options[0].optionString = const_cast(classPathOption.c_str()); options[1].optionString = const_cast("-Xms64m"); + + // use these options to enable profiling in VisualVM + //options[2].optionString = const_cast("-Dcom.sun.management.jmxremote"); + //options[3].optionString = const_cast("-Dcom.sun.management.jmxremote.port=9010"); + //options[4].optionString = const_cast("-Dcom.sun.management.jmxremote.local.only=false"); + //options[5].optionString = const_cast("-Dcom.sun.management.jmxremote.authenticate=false"); + //options[6].optionString = const_cast("-Dcom.sun.management.jmxremote.ssl=false"); + if (optionCount == 3) { options[2].optionString = const_cast(maximumMemoryOprionString.c_str());