Skip to content

Commit

Permalink
Further improved callable matching by name in Java.
Browse files Browse the repository at this point in the history
  • Loading branch information
MagielBruntink committed Jun 15, 2022
1 parent c5db407 commit 4ce7842
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@

import java.util.Map;

import static eu.fasten.analyzer.qualityanalyzer.data.QAConstants.QA_CALLABLE_START_END_LINE_TOLERANCE;
import static eu.fasten.analyzer.qualityanalyzer.data.QAConstants.JAVA_CONSTRUCTOR_NAME;
import static eu.fasten.analyzer.qualityanalyzer.data.QAConstants.LIZARD_CALLABLE_SEPARATOR;
import static eu.fasten.analyzer.qualityanalyzer.data.QAConstants.QA_VERSION_NUMBER;

public class MetadataUtils {
Expand Down Expand Up @@ -72,16 +73,34 @@ public void processJsonRecord(JSONObject jsonRecord) throws IllegalStateExceptio
String path = payload.getString("filename");
int startLine = payload.getInt("start_line");
int endLine = payload.getInt("end_line");
String methodName = getMethodName(payload);
String callableName = normalizeCallableName(payload.getString("callable_name"));
JSONObject metadata = getQualityMetadata(payload, rapidVersion);
updateCallableMetadata(forge, packageName, packageVersion, methodName, path, startLine, endLine, metadata);
updateCallableMetadata(forge, packageName, packageVersion, callableName, path, startLine, endLine, metadata);
}

private String getMethodName(JSONObject payload) {
String separator = ":";
String callableName = payload.getString("callable_name");
int position = callableName.lastIndexOf(separator);
return callableName.substring(position+separator.length());
public static String normalizeCallableName(String callableName) {
StringBuilder result = new StringBuilder();
if(callableName == null) {
return "";
}
var components = callableName.split(LIZARD_CALLABLE_SEPARATOR);

if(components.length == 1) {
result = new StringBuilder(components[0]);
}
else if(components.length > 1) {
if(components[components.length - 2].equals(components[components.length - 1])) {
components[components.length - 1] = JAVA_CONSTRUCTOR_NAME;
}
result.append(components[0]);
int i = 1;
while(i < components.length - 1) {
result.append("$").append(components[i]);
i++;
}
result.append(".").append(components[i]);
}
return result.toString();
}

private JSONObject getQualityMetadata(JSONObject payload, String rapidVersion) {
Expand All @@ -100,7 +119,7 @@ private JSONObject getQualityMetadata(JSONObject payload, String rapidVersion) {
return metadata;
}

public void updateCallableMetadata(String forge, String packageName, String packageVersion, String methodName, String path, int lineStart, int lineEnd, JSONObject metadata) {
public void updateCallableMetadata(String forge, String packageName, String packageVersion, String callableName, String path, int lineStart, int lineEnd, JSONObject metadata) {
var context = dslContexts.get(forge);
context.transaction(configuration -> {
Record1<Long> result;
Expand All @@ -117,13 +136,9 @@ public void updateCallableMetadata(String forge, String packageName, String pack
.and(ModuleContents.MODULE_CONTENTS.FILE_ID.equal(Files.FILES.ID))
.and(Modules.MODULES.ID.equal(ModuleContents.MODULE_CONTENTS.MODULE_ID))
.and(Callables.CALLABLES.MODULE_ID.equal(Modules.MODULES.ID))
.and(Callables.CALLABLES.LINE_START.between(
lineStart - QA_CALLABLE_START_END_LINE_TOLERANCE,
lineStart + QA_CALLABLE_START_END_LINE_TOLERANCE))
.and(Callables.CALLABLES.LINE_END.between(
lineEnd - QA_CALLABLE_START_END_LINE_TOLERANCE,
lineEnd + QA_CALLABLE_START_END_LINE_TOLERANCE))
.and(Callables.CALLABLES.FASTEN_URI.contains(methodName))
.and(Callables.CALLABLES.LINE_START.lessOrEqual(lineEnd))
.and(Callables.CALLABLES.LINE_END.greaterOrEqual(lineStart))
.and(Callables.CALLABLES.FASTEN_URI.contains(callableName))
.returningResult(Callables.CALLABLES.ID)
.fetchOne();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ public class QAConstants {
public static final String QA_VERSION_NUMBER = "1.2.2";
public static final String QA_PLUGIN_NAME = "Quality Analyzer Plugin";

// Number of lines difference allowed between the start of a callable measured by Lizard and
// stored in the metadata DB.
public static final int QA_CALLABLE_START_END_LINE_TOLERANCE = 2;
public static final String LIZARD_CALLABLE_SEPARATOR = "::";
public static final String JAVA_CONSTRUCTOR_NAME = "%3Cinit%3E";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package eu.fasten.analyzer.qualityanalyzer;

import org.junit.jupiter.api.Test;

import static eu.fasten.analyzer.qualityanalyzer.MetadataUtils.normalizeCallableName;
import static org.junit.jupiter.api.Assertions.*;

class MetadataUtilsTest {

@Test
void normalizeCallableNameJavaTest() {
assertEquals("",
normalizeCallableName(""));

assertEquals("NDC.clear",
normalizeCallableName("NDC::clear"));

assertEquals("SMTPAppender.%3Cinit%3E",
normalizeCallableName("SMTPAppender::SMTPAppender"));

assertEquals("LoggingReceiver$Slurper.run",
normalizeCallableName("LoggingReceiver::Slurper::run"));

assertEquals("LoggingReceiver$Slurper.%3Cinit%3E",
normalizeCallableName("LoggingReceiver::Slurper::Slurper"));

assertEquals("PatternParser$NamedPatternConverter.%3Cinit%3E",
normalizeCallableName("PatternParser::NamedPatternConverter::NamedPatternConverter"));
}

@Test
void normalizeCallableNamePythonTest() {
assertEquals("get_filing_list",
normalizeCallableName("get_filing_list"));

assertEquals("_get_daily_listing_url",
normalizeCallableName("_get_daily_listing_url"));
}

@Test
void normalizeCallableNameCTest() {
assertEquals("drop_excludes",
normalizeCallableName("drop_excludes"));

assertEquals("gda_xslt_getxmlvalue_function",
normalizeCallableName("gda_xslt_getxmlvalue_function"));
}
}

0 comments on commit 4ce7842

Please sign in to comment.