Skip to content

Commit 9c9c38a

Browse files
committed
Merge remote-tracking branch 'refs/remotes/origin/add-kotlin-support'
2 parents d575bf1 + 2c5ad3d commit 9c9c38a

21 files changed

+1158
-246
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ src/ServiceStackIDEA/.idea/workspace.xml
2828
src/ServiceStackIDEA/lib/sdk/
2929
src/ServiceStackIDEA/lib/idea-sdk.zip
3030
src/ServiceStackIDEA/.idea/libraries
31+
src/ServiceStackIDEA/.idea/
3132
linux.gtk.x86/
3233
linux.gtk.x86_64/
3334
macosx.cocoa.x86/

src/ServiceStackIDEA/.idea/gradle.xml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ServiceStackIDEA/.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ServiceStackIDEA/.idea/vcs.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ServiceStackIDEA/.idea/workspace.xml

Lines changed: 773 additions & 104 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.form

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@
157157
</grid>
158158
</constraints>
159159
<properties>
160-
<text value="dto.java"/>
160+
<text value="dtos.java"/>
161161
</properties>
162162
</component>
163163
</children>

src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddRef.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public class AddRef extends JDialog {
4343
private String errorMessage;
4444
private String selectedDirectory;
4545

46+
private INativeTypesHandler defaultNativeTypesHandler;
47+
4648
public AddRef(@NotNull Module module) {
4749
this.module = module;
4850
setContentPane(contentPane);
@@ -187,6 +189,14 @@ public void setSelectedPackage(@NotNull PsiPackage selectedPackage) {
187189
setPackageBrowseText(selectedPackage.getQualifiedName());
188190
}
189191

192+
public void setFileName(@NotNull String fileName) {
193+
nameTextField.setText(fileName);
194+
}
195+
196+
public void setDefaultNativeTypesHandler(INativeTypesHandler nativeTypesHandler) {
197+
defaultNativeTypesHandler = nativeTypesHandler;
198+
}
199+
190200
public void setSelectedDirectory(@NotNull String selectedDirectory) {
191201
this.selectedDirectory = selectedDirectory;
192202
}
@@ -358,7 +368,7 @@ private void onOK() {
358368
label3.setText("Name");
359369
panel4.add(label3, new GridConstraints(2, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
360370
nameTextField = new JTextField();
361-
nameTextField.setText("dto.java");
371+
nameTextField.setText("dtos.java");
362372
panel4.add(nameTextField, new GridConstraints(2, 1, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_FIXED, null, new Dimension(150, -1), null, 0, false));
363373
label1.setLabelFor(addressUrlTextField);
364374
label3.setLabelFor(nameTextField);

src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddServiceStackRefHandler.java

Lines changed: 62 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,23 @@
44
import com.intellij.notification.NotificationType;
55
import com.intellij.notification.Notifications;
66
import com.intellij.openapi.module.Module;
7-
import com.intellij.openapi.project.Project;
87
import com.intellij.openapi.vfs.LocalFileSystem;
98
import com.intellij.openapi.vfs.VirtualFile;
109
import com.intellij.openapi.vfs.VirtualFileManager;
1110
import com.intellij.psi.JavaPsiFacade;
1211
import com.intellij.psi.PsiDirectory;
1312
import com.intellij.psi.PsiManager;
1413
import com.intellij.psi.PsiPackage;
15-
import org.apache.http.client.utils.URIBuilder;
14+
import org.jetbrains.annotations.Nullable;
1615
import org.jetbrains.idea.maven.project.MavenProjectsManager;
1716

1817
import java.io.*;
1918
import java.net.MalformedURLException;
2019
import java.net.URISyntaxException;
21-
import java.net.URL;
22-
import java.net.URLConnection;
23-
import java.util.ArrayList;
20+
import java.util.HashMap;
2421
import java.util.List;
22+
import java.util.Map;
23+
2524

2625
public class AddServiceStackRefHandler {
2726

@@ -30,55 +29,19 @@ public class AddServiceStackRefHandler {
3029
//Fallback version of dependencies if GitHub tags can't be checked.
3130
private static String dependencyVersion = "1.0.15";
3231
private static final String clientPackageId = "client";
32+
private static INativeTypesHandler defaultNativeTypesHandler;
3333

3434
public static void setDependencyVersion(String version) {
3535
dependencyVersion = version;
3636
}
3737

38-
public static void handleOk(String addressUrl, String qualifiedPackageName, String fileName, String selectedDirectory, Module module, StringBuilder errorMessage) {
39-
String url;
40-
List<String> javaCodeLines = new ArrayList<String>();
41-
try {
42-
URIBuilder urlBuilder = createUrl(addressUrl);
43-
urlBuilder.addParameter("Package", qualifiedPackageName);
44-
String name = getDtoNameWithoutExtension(fileName).replaceAll("\\.", "_");
45-
urlBuilder.addParameter("GlobalNamespace", name);
46-
url = urlBuilder.build().toString();
47-
48-
URL serviceUrl = new URL(url);
49-
URLConnection javaResponseConnection = serviceUrl.openConnection();
50-
BufferedReader javaResponseReader = new BufferedReader(
51-
new InputStreamReader(
52-
javaResponseConnection.getInputStream()));
53-
String metadataInputLine;
5438

55-
while ((metadataInputLine = javaResponseReader.readLine()) != null)
56-
javaCodeLines.add(metadataInputLine);
57-
58-
javaResponseReader.close();
59-
60-
if(!javaCodeLines.get(0).startsWith("/* Options:")) {
61-
//Invalid endpoint
62-
errorMessage.append("The address url is not a valid ServiceStack endpoint.");
63-
return;
64-
}
65-
66-
} catch (URISyntaxException e) {
67-
e.printStackTrace();
68-
errorMessage.append(e.getClass().getName()).append(" - Invalid ServiceStack endpoint provided - ").append(addressUrl);
69-
return;
70-
} catch (MalformedURLException e) {
71-
e.printStackTrace();
72-
errorMessage.append(e.getClass().getName()).append(" - Invalid ServiceStack endpoint provided - ").append(addressUrl);
73-
return;
74-
} catch (IOException e) {
75-
e.printStackTrace();
76-
errorMessage.append(e.getClass().getName()).append(" - Failed to read response - ").append(addressUrl);
77-
return;
78-
}
79-
80-
81-
GradleBuildFileHelper gradleBuildFileHelper = new GradleBuildFileHelper(module);
39+
public static void handleOk(String addressUrl, String qualifiedPackageName,
40+
String fileName, String selectedDirectory,
41+
Module module, StringBuilder errorMessage) {
42+
List<String> javaCodeLines = getDtoLines(addressUrl, qualifiedPackageName, fileName, errorMessage);
43+
if (javaCodeLines == null) return;
44+
defaultNativeTypesHandler = IDEAUtils.getDefaultNativeTypesHandler(module);
8245
boolean showDto = true;
8346
final MavenProjectsManager mavenProjectsManager = MavenProjectsManager.getInstance(module.getProject());
8447

@@ -88,7 +51,7 @@ public static void handleOk(String addressUrl, String qualifiedPackageName, Stri
8851
} else {
8952
//Gradle
9053
try {
91-
showDto = addGradleDependencyIfRequired(module,gradleBuildFileHelper);
54+
showDto = addGradleDependencyIfRequired(module);
9255
} catch (FileNotFoundException e) {
9356
e.printStackTrace();
9457
String message = "Failed to update build.gradle with '" +
@@ -118,6 +81,44 @@ public static void handleOk(String addressUrl, String qualifiedPackageName, Stri
11881
VirtualFileManager.getInstance().syncRefresh();
11982
}
12083

84+
@Nullable
85+
private static List<String> getDtoLines(String addressUrl, String qualifiedPackageName, String fileName, StringBuilder errorMessage) {
86+
Map<String,String> options = new HashMap<String,String>();
87+
List<String> javaCodeLines;
88+
try {
89+
options.put("Package", qualifiedPackageName);
90+
String name = getDtoNameWithoutExtension(fileName).replaceAll("\\.", "_");
91+
options.put("GlobalNamespace", name);
92+
javaCodeLines = getNativeTypesHandler(fileName).getUpdatedCode(addressUrl,options);
93+
94+
if(!javaCodeLines.get(0).startsWith("/* Options:")) {
95+
//Invalid endpoint
96+
errorMessage.append("The address url is not a valid ServiceStack endpoint.");
97+
return null;
98+
}
99+
100+
} catch (URISyntaxException e) {
101+
e.printStackTrace();
102+
errorMessage.append(e.getClass().getName()).append(" - Invalid ServiceStack endpoint provided - ").append(addressUrl);
103+
return null;
104+
} catch (MalformedURLException e) {
105+
e.printStackTrace();
106+
errorMessage.append(e.getClass().getName()).append(" - Invalid ServiceStack endpoint provided - ").append(addressUrl);
107+
return null;
108+
} catch (IOException e) {
109+
e.printStackTrace();
110+
errorMessage.append(e.getClass().getName()).append(" - Failed to read response - ").append(addressUrl);
111+
return null;
112+
}
113+
return javaCodeLines;
114+
}
115+
116+
private static INativeTypesHandler getNativeTypesHandler(String fileName) {
117+
if(fileName.endsWith(".kt")) return new KotlinNativeTypesHandler();
118+
if(fileName.endsWith(".java")) return new JavaNativeTypesHandler();
119+
return defaultNativeTypesHandler;
120+
}
121+
121122
private static boolean tryAddMavenDependency(Module module) {
122123
boolean showDto;
123124
String message = "Unable to locate module pom.xml file. Can't add required dependency '" +
@@ -130,7 +131,7 @@ private static boolean tryAddMavenDependency(Module module) {
130131
NotificationType.WARNING);
131132
try {
132133
IDEAPomFileHelper pomFileHelper = new IDEAPomFileHelper();
133-
String pomFilePath = pomFileHelper.findNearestModulePomFile(module);
134+
String pomFilePath = IDEAPomFileHelper.findNearestModulePomFile(module);
134135
if(pomFilePath == null) {
135136
Notifications.Bus.notify(notification);
136137
return false;
@@ -151,9 +152,9 @@ private static boolean tryAddMavenDependency(Module module) {
151152
return showDto;
152153
}
153154

154-
private static boolean addGradleDependencyIfRequired(Module module, GradleBuildFileHelper gradleBuildFileHelper) throws FileNotFoundException {
155+
private static boolean addGradleDependencyIfRequired(Module module) throws FileNotFoundException {
155156
boolean result = true;
156-
if(gradleBuildFileHelper.addDependency(dependencyGroupId, dependencyPackageId, dependencyVersion)) {
157+
if(GradleBuildFileHelper.addDependency(module,dependencyGroupId, dependencyPackageId, dependencyVersion)) {
157158
result = false;
158159
IDEAUtils.refreshBuildFile(module);
159160
}
@@ -193,8 +194,8 @@ private static String getDtoPath(Module module, String qualifiedPackageName, Str
193194

194195
PsiPackage mainPackage = JavaPsiFacade.getInstance(module.getProject()).findPackage(qualifiedPackageName);
195196
if(mainPackage != null && mainPackage.isValid() && mainPackage.getDirectories().length > 0) {
196-
File foo = new File(selectedDirectory);
197-
VirtualFile selectedFolder = LocalFileSystem.getInstance().findFileByIoFile(foo);
197+
File file = new File(selectedDirectory);
198+
VirtualFile selectedFolder = LocalFileSystem.getInstance().findFileByIoFile(file);
198199
if(selectedFolder == null) {
199200
errorMessage.append("Unable to determine path for DTO file.");
200201
throw new FileNotFoundException();
@@ -217,43 +218,24 @@ private static String getDtoPath(Module module, String qualifiedPackageName, Str
217218
return fullDtoPath;
218219
}
219220

220-
public static URIBuilder createUrl(String text) throws MalformedURLException, URISyntaxException {
221-
String serverUrl = text.endsWith("/") ? text : (text + "/");
222-
serverUrl = (serverUrl.startsWith("http://") || serverUrl.startsWith("https://")) ? serverUrl : ("http://" + serverUrl);
223-
URL url = new URL(serverUrl);
224-
String path = url.getPath().contains("?") ? url.getPath().split("\\?", 2)[0] : url.getPath();
225-
if (!path.endsWith("types/java/")) {
226-
serverUrl += "types/java/";
227-
}
228-
URIBuilder builder;
229-
230-
try {
231-
builder = new URIBuilder(serverUrl);
232-
} catch (URISyntaxException e) {
233-
e.printStackTrace();
234-
throw e;
235-
}
236-
237-
238-
return builder;
239-
}
240-
241221
public static String getDtoFileName(String name) {
222+
INativeTypesHandler nativeTypesHandler = getNativeTypesHandler(name);
242223
int p = name.lastIndexOf(".");
243-
String e = name.substring(p + 1);
244-
if (p == -1 || !e.equals("java")) {
224+
String e = name.substring(p);
225+
if (p == -1 || !e.equals(nativeTypesHandler.getFileExtension())) {
245226
/* file has no extension */
246-
return name + ".java";
227+
return name + nativeTypesHandler.getFileExtension();
247228
} else {
248229
/* file has extension e */
249230
return name;
250231
}
251232
}
252233

253234
public static String getDtoNameWithoutExtension(String name) {
235+
INativeTypesHandler nativeTypesHandler = getNativeTypesHandler(name);
254236
int p = name.lastIndexOf(".");
255-
String e = name.substring(p + 1);
256-
if (p == -1 || !e.equals("java")) {
237+
String e = name.substring(p);
238+
if (p == -1 || !e.equals(nativeTypesHandler.getFileExtension())) {
257239
/* file has no extension */
258240
return name;
259241
} else {

src/ServiceStackIDEA/src/main/java/net/servicestack/idea/AddServiceStackReference.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void actionPerformed(AnActionEvent e) {
7575
//do nothing, can't get package name.
7676
}
7777
}
78-
dialog.setVisible(true);
78+
ShowDialog(module, dialog);
7979
return;
8080
}
8181

@@ -99,14 +99,14 @@ public void actionPerformed(AnActionEvent e) {
9999
//Check for document, display without a package name if no document.
100100
Document document = FileDocumentManager.getInstance().getDocument(selectedFile);
101101
if (document == null) {
102-
dialog.setVisible(true);
102+
ShowDialog(module, dialog);
103103
return;
104104
}
105105

106106
//Check if a 'PsiFile', display without a package name if no PsiFile.
107107
PsiFile psiFile = PsiDocumentManager.getInstance(module.getProject()).getPsiFile(document);
108108
if (psiFile == null) {
109-
dialog.setVisible(true);
109+
ShowDialog(module, dialog);
110110
return;
111111
}
112112

@@ -118,7 +118,17 @@ public void actionPerformed(AnActionEvent e) {
118118
dialog.setSelectedPackage(mainPackage);
119119
}
120120
}
121+
ShowDialog(module, dialog);
122+
}
121123

124+
private void ShowDialog(Module module, AddRef dialog) {
125+
if(GradleBuildFileHelper.isGradleModule(module) && GradleBuildFileHelper.isUsingKotlin(module)) {
126+
dialog.setFileName("dtos.kt");
127+
}
128+
129+
if(IDEAPomFileHelper.isMavenProjectWithKotlin(module)) {
130+
dialog.setFileName("dtos.kt");
131+
}
122132
dialog.setVisible(true);
123133
}
124134

0 commit comments

Comments
 (0)