Skip to content
This repository was archived by the owner on Feb 1, 2023. It is now read-only.

Commit cb7c2c0

Browse files
authored
Merge pull request #5 from DeepCodeAI/dev
Major release with markers
2 parents e54986f + 4ffc327 commit cb7c2c0

15 files changed

Lines changed: 701 additions & 146 deletions

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Deepcode Public API package in Java
33

44
[![deepcode](https://www.deepcode.ai/api/gh/badge?key=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwbGF0Zm9ybTEiOiJnaCIsIm93bmVyMSI6IkRlZXBDb2RlQUkiLCJyZXBvMSI6ImphdmEtY2xpZW50IiwiaW5jbHVkZUxpbnQiOmZhbHNlLCJhdXRob3JJZCI6MTI0NjksImlhdCI6MTU5NjA5NzIzMn0.a8lZClW69fj53juqAW0NJ6uWh-1iOXiR-mn5pN3eATc)](https://www.deepcode.ai/app/gh/DeepCodeAI/java-client/_/dashboard?utm_content=gh%2FDeepCodeAI%2Fjava-client)
55

6-
For low level APIs look for `DeepCodeRestApi` public methods. For descriptions look [Rest APIs and CLI](https://deepcode.freshdesk.com/support/solutions/folders/60000321393)
6+
For low level APIs look for `DeepCodeRestApi` public methods. For descriptions - look [Rest APIs and CLI](https://deepcode.freshdesk.com/support/solutions/folders/60000321393)
77

88
For high-level APIs look inside `ai.deepcode.javaclient.core` package.
99
Here common logic for any Java made IDE presented as `abstract` classes that need to be instantiated and finalised with platform specific code.
@@ -19,4 +19,10 @@ To make a standalone jar file with all dependencies use `shadowJar` gradle task.
1919

2020
## Run tests
2121

22+
- 2 environment variables with __already logged__ Tokens need to be declared:
23+
24+
`DEEPCODE_API_KEY` - logged at https://www.deepcode.ai Token
25+
26+
`DEEPCODE_API_KEY_STAGING` - logged at https://www.deepcoded.com Token
27+
2228
- Run gradle test task: `source gradlew test --stacktrace --scan`

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ repositories {
1818
jcenter()
1919
}
2020

21-
version '2.0.0'
21+
version '2.0.14'
2222
sourceCompatibility = 1.8
2323

2424
dependencies {

src/main/java/ai/deepcode/javaclient/core/AnalysisDataBase.java

Lines changed: 149 additions & 58 deletions
Large diffs are not rendered by default.

src/main/java/ai/deepcode/javaclient/core/DeepCodeIgnoreInfoHolderBase.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,30 @@ protected DeepCodeIgnoreInfoHolderBase(
1717
}
1818

1919
private static final Map<Object, Set<String>> map_dcignore2Regexps = new ConcurrentHashMap<>();
20+
private static final Map<Object, Set<String>> map_gitignore2Regexps = new ConcurrentHashMap<>();
2021

21-
public boolean isIgnoredFile(@NotNull Object file) {
22+
public boolean isDcIgnoredFile(@NotNull Object file) {
2223
return map_dcignore2Regexps.entrySet().stream()
2324
.filter(e -> inScope(e.getKey(), file))
2425
.flatMap(e -> e.getValue().stream())
2526
.anyMatch(getFilePath(file)::matches);
2627
}
2728

29+
public boolean isGitIgnoredFile(@NotNull Object file) {
30+
return map_gitignore2Regexps.entrySet().stream()
31+
.filter(e -> inScope(e.getKey(), file))
32+
.flatMap(e -> e.getValue().stream())
33+
.anyMatch(getFilePath(file)::matches);
34+
}
35+
2836
protected abstract String getFilePath(@NotNull Object file);
2937

30-
protected abstract boolean inScope(@NotNull Object dcignoreFile, @NotNull Object fileToCheck);
38+
private boolean inScope(@NotNull Object ignoreFile, @NotNull Object fileToCheck) {
39+
return getFilePath(fileToCheck).startsWith(getDirPath(ignoreFile));
40+
};
3141

3242
public boolean is_ignoreFile(@NotNull Object file) {
33-
return is_dcignoreFile(file) || getFileName(file).equals(".gitignore");
43+
return is_dcignoreFile(file) || is_gitignoreFile(file);
3444
}
3545

3646
protected abstract String getFileName(@NotNull Object file);
@@ -39,18 +49,29 @@ public boolean is_dcignoreFile(@NotNull Object file) {
3949
return getFileName(file).equals(".dcignore");
4050
}
4151

52+
public boolean is_gitignoreFile(@NotNull Object file) {
53+
return getFileName(file).equals(".gitignore");
54+
}
55+
4256
public void remove_dcignoreFileContent(@NotNull Object file) {
4357
map_dcignore2Regexps.remove(file);
4458
}
4559

60+
public void remove_gitignoreFileContent(@NotNull Object file) {
61+
map_gitignore2Regexps.remove(file);
62+
}
63+
4664
public void update_dcignoreFileContent(@NotNull Object file) {
47-
// map_dcignore2Regexps.remove(file);
48-
map_dcignore2Regexps.put(file, parse_dcignoreFile2Regexps(file));
65+
map_dcignore2Regexps.put(file, parse_ignoreFile2Regexps(file));
66+
}
67+
68+
public void update_gitignoreFileContent(@NotNull Object file) {
69+
map_gitignore2Regexps.put(file, parse_ignoreFile2Regexps(file));
4970
}
5071

5172
protected abstract String getDirPath(@NotNull Object file);
5273

53-
private Set<String> parse_dcignoreFile2Regexps(@NotNull Object file) {
74+
private Set<String> parse_ignoreFile2Regexps(@NotNull Object file) {
5475
Set<String> result = new HashSet<>();
5576
String basePath = getDirPath(file);
5677
String lineSeparator = "[\n\r]";

src/main/java/ai/deepcode/javaclient/core/DeepCodeUtilsBase.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public List<Object> getAllSupportedFilesInProject(@NotNull Object project) {
3838
allProjectFiles.stream()
3939
.filter(ignoreInfoHolder::is_dcignoreFile)
4040
.forEach(ignoreInfoHolder::update_dcignoreFileContent);
41+
// Initial scan for .gitignore files
42+
allProjectFiles.stream()
43+
.filter(ignoreInfoHolder::is_gitignoreFile)
44+
.forEach(ignoreInfoHolder::update_gitignoreFileContent);
45+
4146
final List<Object> result =
4247
allProjectFiles.stream().filter(this::isSupportedFileFormat).collect(Collectors.toList());
4348
if (result.isEmpty()) dcLogger.logWarn("Empty supported files list for project: " + project);
@@ -46,11 +51,11 @@ public List<Object> getAllSupportedFilesInProject(@NotNull Object project) {
4651

4752
protected abstract Collection<Object> allProjectFiles(@NotNull Object project);
4853

49-
private static final long MAX_FILE_SIZE = 5242880; // 5MB in bytes
54+
private static final long MAX_FILE_SIZE = 4000000; // ~ 4MB in bytes
5055

5156
public boolean isSupportedFileFormat(@NotNull Object file) {
5257
// DCLogger.getInstance().info("isSupportedFileFormat started for " + psiFile.getName());
53-
if (ignoreInfoHolder.isIgnoredFile(file) || isGitIgnored(file)) return false;
58+
if (ignoreInfoHolder.isDcIgnoredFile(file) || isGitIgnored(file)) return false;
5459
final boolean result =
5560
getFileLength(file) < MAX_FILE_SIZE
5661
&& (supportedExtensions.contains(getFileExtention(file))

src/main/java/ai/deepcode/javaclient/core/HashContentUtilsBase.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,18 @@ private String doGetHash(@NotNull String fileText) {
8080
return bytesToHex(encodedHash);
8181
}
8282

83+
/**
84+
* Look for cached content first, require manual cache invalidation if file been changed
85+
*/
8386
@NotNull
84-
String getFileContent(@NotNull Object file) {
87+
public String getFileContent(@NotNull Object file) {
8588
// potential OutOfMemoryException for too large projects
8689
return mapFile2Content.computeIfAbsent(file, this::doGetFileContent);
8790
}
8891

92+
/**
93+
* Make direct read of File content. NO cache check.
94+
*/
8995
@NotNull
9096
public abstract String doGetFileContent(@NotNull Object file);
9197

src/main/java/ai/deepcode/javaclient/core/LoginUtilsBase.java

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import org.jetbrains.annotations.NotNull;
77
import org.jetbrains.annotations.Nullable;
88

9+
import java.util.HashSet;
10+
import java.util.Set;
11+
912
public abstract class LoginUtilsBase {
1013

1114
private final PlatformDependentUtilsBase pdUtils;
@@ -26,12 +29,21 @@ protected LoginUtilsBase(
2629

2730
protected abstract String getUserAgent();
2831

29-
private static boolean isLoginCheckLoopStarted = false;
32+
private static final Set<Object> PROJECTS_WITH_LOGIN_CHECK_LOOP_STARTED = new HashSet<>();
3033

31-
/** network request! */
34+
/** inner network request! */
3235
public boolean isLogged(@Nullable Object project, boolean userActionNeeded) {
36+
boolean isLogged = checkLogin(project, userActionNeeded);
37+
if (isLogged && project != null) {
38+
isLogged = checkConsent(project, userActionNeeded);
39+
}
40+
return isLogged;
41+
}
42+
43+
/** network request! */
44+
public boolean checkLogin(@Nullable Object project, boolean userActionNeeded) {
3345
final String sessionToken = deepCodeParams.getSessionToken();
34-
pdUtils.progressCheckCanceled();
46+
// pdUtils.progressCheckCanceled();
3547
final EmptyResponse response = DeepCodeRestApi.checkSession(sessionToken);
3648
boolean isLogged = response.getStatusCode() == 200;
3749
String message = response.getStatusDescription();
@@ -41,24 +53,35 @@ public boolean isLogged(@Nullable Object project, boolean userActionNeeded) {
4153
dcLogger.logWarn("Login check fails: " + message + " Token: " + sessionToken);
4254
}
4355
if (!isLogged && userActionNeeded) {
44-
if (sessionToken.isEmpty() && response.getStatusCode() == 401) {
45-
message = "Authenticate using your GitHub, Bitbucket or GitLab account";
56+
if (response.getStatusCode() != 401) {
57+
pdUtils.showError(message, project);
4658
}
47-
pdUtils.showLoginLink(project, message);
48-
} else if (isLogged && project != null) {
49-
if (deepCodeParams.consentGiven(project)) {
50-
dcLogger.logInfo("Consent check succeed for: " + pdUtils.getProjectName(project));
59+
if (sessionToken.isEmpty()) {
60+
pdUtils.showLoginLink(
61+
project, "Authenticate using your GitHub, Bitbucket or GitLab account");
5162
} else {
52-
dcLogger.logWarn("Consent check fail! Project: " + pdUtils.getProjectName(project));
53-
isLogged = false;
54-
pdUtils.showConsentRequest(project, userActionNeeded);
63+
pdUtils.showLoginLink(
64+
project, "Invalid Token. Correct it or create a new one, please.");
5565
}
5666
}
5767
return isLogged;
5868
}
5969

70+
public boolean checkConsent(@NotNull Object project, boolean userActionNeeded) {
71+
final boolean consentGiven = deepCodeParams.consentGiven(project);
72+
if (consentGiven) {
73+
dcLogger.logInfo("Consent check succeed for: " + pdUtils.getProjectName(project));
74+
} else {
75+
dcLogger.logWarn("Consent check fail! Project: " + pdUtils.getProjectName(project));
76+
if (userActionNeeded) {
77+
pdUtils.showConsentRequest(project, userActionNeeded);
78+
}
79+
}
80+
return consentGiven;
81+
}
82+
6083
/** network request! */
61-
public void requestNewLogin(@NotNull Object project, boolean openBrowser) {
84+
public void requestNewLogin(@Nullable Object project, boolean openBrowser) {
6285
dcLogger.logInfo("New Login requested.");
6386
deepCodeParams.clearLoginParams();
6487
LoginResponse response = DeepCodeRestApi.newLogin(getUserAgent());
@@ -70,31 +93,36 @@ public void requestNewLogin(@NotNull Object project, boolean openBrowser) {
7093
pdUtils.showInBrowser(deepCodeParams.getLoginUrl());
7194
// BrowserUtil.open(DeepCodeParams.getInstance().getLoginUrl());
7295
}
73-
if (!isLoginCheckLoopStarted) {
74-
pdUtils.runInBackground(project, () -> startLoginCheckLoop(project));
75-
// ReadAction.nonBlocking(() -> startLoginCheckLoop(project))
76-
// .submit(NonUrgentExecutor.getInstance());
77-
dcLogger.logInfo("LoginCheckLoop started");
96+
// all projects should be re-scanned
97+
for (Object prj : pdUtils.getOpenProjects()) {
98+
if (PROJECTS_WITH_LOGIN_CHECK_LOOP_STARTED.add(prj)) {
99+
pdUtils.runInBackground(
100+
prj,
101+
"Waiting Login for " + pdUtils.getProjectName(prj),
102+
(progress) -> startLoginCheckLoop(prj, progress));
103+
dcLogger.logInfo("LoginCheckLoop started for " + pdUtils.getProjectName(prj));
104+
}
78105
}
79106
} else {
80107
dcLogger.logWarn("New Login request fail: " + response.getStatusDescription());
81108
pdUtils.showError(response.getStatusDescription(), project);
82109
}
83110
}
84111

85-
private void startLoginCheckLoop(@NotNull Object project) {
86-
isLoginCheckLoopStarted = true;
112+
private void startLoginCheckLoop(@NotNull Object project, @NotNull Object progress) {
87113
try {
88114
do {
89-
pdUtils.delay(pdUtils.DEFAULT_DELAY);
90-
} while (!isLogged(project, false));
115+
pdUtils.delay(pdUtils.DEFAULT_DELAY, progress);
116+
} while (!checkLogin(project, false));
91117
} finally {
92-
isLoginCheckLoopStarted = false;
118+
PROJECTS_WITH_LOGIN_CHECK_LOOP_STARTED.remove(project);
93119
dcLogger.logInfo("LoginCheckLoop finished for project: " + pdUtils.getProjectName(project));
94120
}
95-
pdUtils.showInfo("Login succeed", project);
121+
// pdUtils.showInfo("Login succeed", project);
96122
analysisData.resetCachesAndTasks(project); // do we need it??
97-
pdUtils.doFullRescan(project);
123+
if (checkConsent(project, true)) {
124+
pdUtils.doFullRescan(project);
125+
}
98126
// AnalysisData.getInstance().resetCachesAndTasks(project);
99127
// RunUtils.asyncAnalyseProjectAndUpdatePanel(project);
100128
}

src/main/java/ai/deepcode/javaclient/core/MyTextRange.java

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,39 @@
11
package ai.deepcode.javaclient.core;
22

3+
import java.util.Collections;
4+
import java.util.List;
5+
import java.util.Map;
6+
37
public class MyTextRange {
48
private final int start;
59
private final int end;
10+
private final int startRow;
11+
private final int endRow;
12+
private final int startCol;
13+
private final int endCol;
14+
// msg range poses in source file
15+
private final Map<MyTextRange, List<MyTextRange>> markers;
616

7-
public MyTextRange(int start, int end) {
17+
MyTextRange(
18+
int start,
19+
int end,
20+
int startRow,
21+
int endRow,
22+
int startCol,
23+
int endCol,
24+
Map<MyTextRange, List<MyTextRange>> markers) {
825

926
this.start = start;
1027
this.end = end;
28+
this.startRow = startRow;
29+
this.endRow = endRow;
30+
this.startCol = startCol;
31+
this.endCol = endCol;
32+
this.markers = markers;
33+
}
34+
35+
MyTextRange(int start, int end) {
36+
this(start, end, -1, -1, -1, -1, Collections.emptyMap());
1137
}
1238

1339
public int getStart() {
@@ -17,4 +43,24 @@ public int getStart() {
1743
public int getEnd() {
1844
return end;
1945
}
46+
47+
public int getStartRow() {
48+
return startRow;
49+
}
50+
51+
public int getEndRow() {
52+
return endRow;
53+
}
54+
55+
public int getStartCol() {
56+
return startCol;
57+
}
58+
59+
public int getEndCol() {
60+
return endCol;
61+
}
62+
63+
public Map<MyTextRange, List<MyTextRange>> getMarkers() {
64+
return markers;
65+
}
2066
}

0 commit comments

Comments
 (0)