
com.undefinedlabs.scope.utils.sourcecode.SourceCodeUtils Maven / Gradle / Ivy
package com.undefinedlabs.scope.utils.sourcecode;
import org.apache.commons.lang3.StringUtils;
import com.undefinedlabs.scope.utils.ClassNameUtils;
import java.io.InputStream;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class SourceCodeUtils {
private final Map sourceCodeMap;
public SourceCodeUtils(final Map sourceCodeMap) {
this.sourceCodeMap = sourceCodeMap;
}
public SourceCode getSourceCode(final String className) {
if (StringUtils.isEmpty(className)) {
return SourceCode.EMPTY;
}
final String baseClassName = ClassNameUtils.INSTANCE.extractBaseClassName(className);
final SourceCode sourceCode = sourceCodeMap.get(baseClassName);
if (sourceCode == null || SourceCode.EMPTY.equals(sourceCode)) {
final SourceCode.Builder builder = SourceCode.newBuilder();
final SourceCode newSourceCode = builder.withClassName(className).build();
sourceCodeMap.put(className, newSourceCode);
return newSourceCode;
}
return sourceCode;
}
public SourceCode getSourceCode(final String className, final ClassLoader cl) {
if (StringUtils.isEmpty(className)) {
return SourceCode.EMPTY;
}
final String baseClassName = ClassNameUtils.INSTANCE.extractBaseClassName(className);
final SourceCode sourceCode = sourceCodeMap.get(baseClassName);
if (sourceCode != null && !SourceCode.EMPTY.equals(sourceCode) && !sourceCode.hasConflicts()) {
return sourceCode;
}
final String vmClassName = baseClassName.replaceAll("\\.", "/").concat(".properties");
final InputStream is = cl.getResourceAsStream(vmClassName);
if (is == null) {
return getSourceCode(className);
}
try {
final Properties properties = new Properties();
properties.load(is);
final String sourcePath = properties.getProperty("source.path");
if (StringUtils.isEmpty(sourcePath)) {
return getSourceCode(className);
}
final SourceCode.Builder builder = SourceCode.newBuilder();
final SourceCode newSourceCode =
builder
.withClassName(className)
.withHasConflicts(false)
.withSourceFilePath(sourcePath)
.build();
sourceCodeMap.put(className, newSourceCode);
return newSourceCode;
} catch (final Exception e) {
return getSourceCode(className);
}
}
public Set getAllClassNamesWithSourceCode() {
return sourceCodeMap.keySet();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy