All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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