Skip to content

Commit 0c6a8fd

Browse files
Merge pull request #50 from dynatrace-oss/feature/dql/allowing-query-configuration
Adding the query configuration fields into the toolbar for DQL files
2 parents 34013d3 + 8eec6bb commit 0c6a8fd

23 files changed

+908
-295
lines changed

src/main/java/pl/thedeem/intellij/dql/DQLUtil.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import com.intellij.psi.util.PsiTreeUtil;
1313
import org.jetbrains.annotations.NotNull;
1414
import org.jetbrains.annotations.Nullable;
15+
import org.jsoup.internal.StringUtil;
16+
import pl.thedeem.intellij.dql.definition.model.DQLDurationType;
1517
import pl.thedeem.intellij.dql.definition.model.MappedParameter;
1618
import pl.thedeem.intellij.dql.definition.model.Parameter;
1719
import pl.thedeem.intellij.dql.psi.DQLFieldExpression;
@@ -24,13 +26,21 @@
2426
import java.time.ZoneId;
2527
import java.time.ZonedDateTime;
2628
import java.time.format.DateTimeFormatter;
29+
import java.time.format.DateTimeParseException;
30+
import java.time.temporal.TemporalAccessor;
2731
import java.util.*;
32+
import java.util.regex.Matcher;
33+
import java.util.regex.Pattern;
2834
import java.util.stream.Collectors;
2935

3036
public class DQLUtil {
3137
public final static DateTimeFormatter DQL_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
3238
public final static DateTimeFormatter USER_FRIENDLY_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
33-
39+
public final static Pattern DURATION_PATTERN = Pattern.compile(
40+
"^\\s*(-?)\\s*(\\d+)\\s*("
41+
+ String.join("|", DQLDurationType.getTypes()) +
42+
")$");
43+
3444
private final static String PARTIAL_DQL_NAME = ".partial.";
3545
private final static String CREDENTIALS_PREFIX = "pl.thedeem.intellij.dql/";
3646

@@ -160,4 +170,29 @@ public static CredentialAttributes createCredentialAttributes(@NotNull String cr
160170
})
161171
.collect(Collectors.toList());
162172
}
173+
174+
public static @Nullable String parseUserTime(@NotNull String text) throws IllegalArgumentException {
175+
if (StringUtil.isBlank(text)) {
176+
return null;
177+
}
178+
Matcher durationMatcher = DURATION_PATTERN.matcher(text);
179+
if (durationMatcher.matches()) {
180+
int negative = durationMatcher.group(1).trim().isBlank() ? 0 : -1;
181+
int amount = Integer.parseInt(durationMatcher.group(2)) * negative;
182+
String unit = durationMatcher.group(3);
183+
DQLDurationType type = DQLDurationType.getByType(unit);
184+
if (type == null) {
185+
throw new IllegalArgumentException("Invalid duration type: " + unit);
186+
}
187+
Instant instant = type.getInstant(amount, Instant.now());
188+
return DQLUtil.DQL_DATE_FORMATTER.format(instant.atZone(ZoneId.systemDefault()));
189+
}
190+
191+
try {
192+
TemporalAccessor parsed = DQLUtil.DQL_DATE_FORMATTER.parse(text);
193+
return DQLUtil.DQL_DATE_FORMATTER.format(parsed);
194+
} catch (DateTimeParseException ex) {
195+
throw new IllegalArgumentException("Invalid date format", ex);
196+
}
197+
}
163198
}

src/main/java/pl/thedeem/intellij/dql/actions/ActionUtils.java

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
import com.intellij.openapi.editor.Editor;
1010
import com.intellij.openapi.fileEditor.FileEditor;
1111
import com.intellij.openapi.fileEditor.TextEditor;
12+
import com.intellij.openapi.project.Project;
13+
import com.intellij.openapi.vfs.VirtualFile;
1214
import com.intellij.psi.PsiElement;
1315
import com.intellij.psi.PsiFile;
16+
import com.intellij.psi.PsiManager;
1417
import org.jetbrains.annotations.NotNull;
1518
import org.jetbrains.annotations.Nullable;
1619
import pl.thedeem.intellij.dql.DQLFileType;
@@ -33,20 +36,37 @@ public abstract class ActionUtils {
3336
return serviceClass.cast(serviceKey);
3437
}
3538

36-
public static @Nullable PsiFile getRelatedPsiFile(@Nullable PsiFile originalFile, @Nullable Editor editor, @Nullable PsiElement psiElement) {
37-
if (originalFile == null || editor == null) {
39+
public static @Nullable PsiFile getRelatedPsiFile(@NotNull AnActionEvent e) {
40+
Project project = e.getProject();
41+
if (project == null) {
3842
return null;
3943
}
40-
if (!DQLFileType.INSTANCE.equals(originalFile.getFileType())) {
41-
InjectedLanguageManager manager = InjectedLanguageManager.getInstance(originalFile.getProject());
42-
PsiElement injectedElement = manager.findInjectedElementAt(originalFile, editor.getCaretModel().getOffset());
44+
PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
45+
if (psiFile == null) {
46+
VirtualFile virtualFile = e.getData(CommonDataKeys.VIRTUAL_FILE);
47+
if (virtualFile != null) {
48+
psiFile = PsiManager.getInstance(project).findFile(virtualFile);
49+
}
50+
51+
}
52+
if (psiFile == null) {
53+
return null;
54+
}
55+
if (!DQLFileType.INSTANCE.equals(psiFile.getFileType())) {
56+
InjectedLanguageManager manager = InjectedLanguageManager.getInstance(psiFile.getProject());
57+
Editor editor = ActionUtils.getEditor(e);
58+
if (editor == null) {
59+
return null;
60+
}
61+
PsiElement psiElement = e.getData(CommonDataKeys.PSI_ELEMENT);
62+
PsiElement injectedElement = manager.findInjectedElementAt(psiFile, editor.getCaretModel().getOffset());
4363
if (injectedElement != null && DQLFileType.INSTANCE.equals(injectedElement.getContainingFile().getFileType())) {
4464
return injectedElement.getContainingFile();
4565
} else if (psiElement != null) {
4666
return DQLFileType.INSTANCE.equals(psiElement.getContainingFile().getFileType()) ? psiElement.getContainingFile() : null;
4767
}
4868
}
49-
return originalFile;
69+
return psiFile;
5070
}
5171

5272
public static boolean isNotRelatedToDQL(@NotNull AnActionEvent e) {

src/main/java/pl/thedeem/intellij/dql/actions/RunDQLQueryAction.java

Lines changed: 0 additions & 60 deletions
This file was deleted.

src/main/java/pl/thedeem/intellij/dql/actions/StopDQLQueryAction.java

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package pl.thedeem.intellij.dql.actions.executionToolbar;
2+
3+
import com.intellij.ui.components.JBTextField;
4+
import org.jetbrains.annotations.NotNull;
5+
import org.jetbrains.annotations.Nullable;
6+
7+
import javax.swing.*;
8+
import javax.swing.text.AbstractDocument;
9+
import javax.swing.text.AttributeSet;
10+
import javax.swing.text.BadLocationException;
11+
import javax.swing.text.DocumentFilter;
12+
13+
public abstract class AbstractNumericFieldAction extends AbstractTextFieldAction<Long> {
14+
public AbstractNumericFieldAction(@Nullable Long value, @NotNull String text, @Nullable String description, @Nullable Icon icon) {
15+
super(value != null ? String.valueOf(value) : null, text, description, icon);
16+
}
17+
18+
@Override
19+
protected JBTextField createTextField() {
20+
JBTextField result = super.createTextField();
21+
((AbstractDocument) result.getDocument()).setDocumentFilter(new NumericFilter());
22+
return result;
23+
}
24+
25+
private static class NumericFilter extends DocumentFilter {
26+
@Override
27+
public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
28+
throws BadLocationException {
29+
if (string.matches("-?\\d*")) {
30+
super.insertString(fb, offset, string, attr);
31+
}
32+
}
33+
34+
@Override
35+
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
36+
throws BadLocationException {
37+
if (text.matches("-?\\d*")) {
38+
super.replace(fb, offset, length, text, attrs);
39+
}
40+
}
41+
}
42+
43+
@Override
44+
public Long getValue() {
45+
String text = myField.getText();
46+
if (text == null || text.isEmpty()) {
47+
return null;
48+
}
49+
try {
50+
return Long.valueOf(text);
51+
} catch (NumberFormatException ignored) {
52+
return null;
53+
}
54+
}
55+
}

0 commit comments

Comments
 (0)