Skip to content

Commit b28927c

Browse files
committed
Start refactor to support kotlin add ref
1 parent 0efd273 commit b28927c

File tree

13 files changed

+291
-107
lines changed

13 files changed

+291
-107
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/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
plugins {
2-
id "org.jetbrains.intellij" version "0.0.23"
2+
id "org.jetbrains.intellij" version "0.0.32"
33
}
44

55
apply plugin: 'org.jetbrains.intellij'
@@ -19,7 +19,7 @@ if(properties.getProperty("jetbrains.plugins.user", null) == null) {
1919
}
2020

2121
intellij {
22-
version '14.1.4'
22+
version 'IC-14.1.4'
2323
plugins 'maven'
2424
pluginName 'ServiceStackIDEA'
2525

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,10 @@ public void setSelectedPackage(@NotNull PsiPackage selectedPackage) {
187187
setPackageBrowseText(selectedPackage.getQualifiedName());
188188
}
189189

190+
public void setFileName(@NotNull String fileName) {
191+
nameTextField.setText(fileName);
192+
}
193+
190194
public void setSelectedDirectory(@NotNull String selectedDirectory) {
191195
this.selectedDirectory = selectedDirectory;
192196
}

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

Lines changed: 57 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,17 @@
1515
import com.intellij.psi.PsiDirectory;
1616
import com.intellij.psi.PsiManager;
1717
import com.intellij.psi.PsiPackage;
18-
import org.apache.http.client.utils.URIBuilder;
18+
import org.jetbrains.annotations.Nullable;
1919
import org.jetbrains.idea.maven.project.MavenProjectsManager;
2020

2121
import java.io.*;
2222
import java.net.MalformedURLException;
2323
import java.net.URISyntaxException;
24-
import java.net.URL;
25-
import java.net.URLConnection;
26-
import java.util.ArrayList;
24+
import java.util.HashMap;
2725
import java.util.List;
26+
import java.util.Map;
27+
2828

29-
/**
30-
* Created by Layoric on 14/05/2015.
31-
*/
3229
public class AddServiceStackRefHandler {
3330

3431
private static final String dependencyGroupId = "net.servicestack";
@@ -42,49 +39,10 @@ public static void setDependencyVersion(String version) {
4239
}
4340

4441
public static void handleOk(String addressUrl, String qualifiedPackageName, String fileName, String selectedDirectory, Module module, StringBuilder errorMessage) {
45-
String url;
46-
List<String> javaCodeLines = new ArrayList<String>();
47-
try {
48-
URIBuilder urlBuilder = createUrl(addressUrl);
49-
urlBuilder.addParameter("Package", qualifiedPackageName);
50-
String name = getDtoNameWithoutExtension(fileName).replaceAll("\\.", "_");
51-
urlBuilder.addParameter("GlobalNamespace", name);
52-
url = urlBuilder.build().toString();
53-
54-
URL serviceUrl = new URL(url);
55-
URLConnection javaResponseConnection = serviceUrl.openConnection();
56-
BufferedReader javaResponseReader = new BufferedReader(
57-
new InputStreamReader(
58-
javaResponseConnection.getInputStream()));
59-
String metadataInputLine;
42+
List<String> javaCodeLines = getDtoLines(addressUrl, qualifiedPackageName, fileName, errorMessage);
6043

61-
while ((metadataInputLine = javaResponseReader.readLine()) != null)
62-
javaCodeLines.add(metadataInputLine);
44+
if (javaCodeLines == null) return;
6345

64-
javaResponseReader.close();
65-
66-
if(!javaCodeLines.get(0).startsWith("/* Options:")) {
67-
//Invalid endpoint
68-
errorMessage.append("The address url is not a valid ServiceStack endpoint.");
69-
return;
70-
}
71-
72-
} catch (URISyntaxException e) {
73-
e.printStackTrace();
74-
errorMessage.append(e.getClass().getName()).append(" - Invalid ServiceStack endpoint provided - ").append(addressUrl);
75-
return;
76-
} catch (MalformedURLException e) {
77-
e.printStackTrace();
78-
errorMessage.append(e.getClass().getName()).append(" - Invalid ServiceStack endpoint provided - ").append(addressUrl);
79-
return;
80-
} catch (IOException e) {
81-
e.printStackTrace();
82-
errorMessage.append(e.getClass().getName()).append(" - Failed to read response - ").append(addressUrl);
83-
return;
84-
}
85-
86-
87-
GradleBuildFileHelper gradleBuildFileHelper = new GradleBuildFileHelper(module);
8846
boolean showDto = true;
8947
final MavenProjectsManager mavenProjectsManager = MavenProjectsManager.getInstance(module.getProject());
9048

@@ -94,7 +52,7 @@ public static void handleOk(String addressUrl, String qualifiedPackageName, Stri
9452
} else {
9553
//Gradle
9654
try {
97-
showDto = addGradleDependencyIfRequired(module,gradleBuildFileHelper);
55+
showDto = addGradleDependencyIfRequired(module);
9856
} catch (FileNotFoundException e) {
9957
e.printStackTrace();
10058
String message = "Failed to update build.gradle with '" +
@@ -123,6 +81,45 @@ public static void handleOk(String addressUrl, String qualifiedPackageName, Stri
12381
VirtualFileManager.getInstance().syncRefresh();
12482
}
12583

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+
//Default Java
118+
INativeTypesHandler result = new JavaNativeTypesHandler();
119+
if(fileName.endsWith(".kt")) return new KotlinNativeTypesHandler();
120+
return result;
121+
}
122+
126123
private static boolean tryAddMavenDependency(Module module) {
127124
boolean showDto;
128125
String message = "Unable to locate module pom.xml file. Can't add required dependency '" +
@@ -155,9 +152,9 @@ private static boolean tryAddMavenDependency(Module module) {
155152
return showDto;
156153
}
157154

158-
private static boolean addGradleDependencyIfRequired(Module module, GradleBuildFileHelper gradleBuildFileHelper) throws FileNotFoundException {
155+
private static boolean addGradleDependencyIfRequired(Module module) throws FileNotFoundException {
159156
boolean result = true;
160-
if(gradleBuildFileHelper.addDependency(dependencyGroupId, dependencyPackageId, dependencyVersion)) {
157+
if(GradleBuildFileHelper.addDependency(module,dependencyGroupId, dependencyPackageId, dependencyVersion)) {
161158
result = false;
162159
refreshBuildFile(module);
163160
}
@@ -197,8 +194,8 @@ private static String getDtoPath(Module module, String qualifiedPackageName, Str
197194

198195
PsiPackage mainPackage = JavaPsiFacade.getInstance(module.getProject()).findPackage(qualifiedPackageName);
199196
if(mainPackage != null && mainPackage.isValid() && mainPackage.getDirectories().length > 0) {
200-
File foo = new File(selectedDirectory);
201-
VirtualFile selectedFolder = LocalFileSystem.getInstance().findFileByIoFile(foo);
197+
File file = new File(selectedDirectory);
198+
VirtualFile selectedFolder = LocalFileSystem.getInstance().findFileByIoFile(file);
202199
if(selectedFolder == null) {
203200
errorMessage.append("Unable to determine path for DTO file.");
204201
throw new FileNotFoundException();
@@ -258,43 +255,24 @@ private static void refreshFile(Module module, String filePath, boolean openFile
258255
VirtualFileManager.getInstance().syncRefresh();
259256
}
260257

261-
public static URIBuilder createUrl(String text) throws MalformedURLException, URISyntaxException {
262-
String serverUrl = text.endsWith("/") ? text : (text + "/");
263-
serverUrl = (serverUrl.startsWith("http://") || serverUrl.startsWith("https://")) ? serverUrl : ("http://" + serverUrl);
264-
URL url = new URL(serverUrl);
265-
String path = url.getPath().contains("?") ? url.getPath().split("\\?", 2)[0] : url.getPath();
266-
if (!path.endsWith("types/java/")) {
267-
serverUrl += "types/java/";
268-
}
269-
URIBuilder builder;
270-
271-
try {
272-
builder = new URIBuilder(serverUrl);
273-
} catch (URISyntaxException e) {
274-
e.printStackTrace();
275-
throw e;
276-
}
277-
278-
279-
return builder;
280-
}
281-
282258
public static String getDtoFileName(String name) {
259+
INativeTypesHandler nativeTypesHandler = getNativeTypesHandler(name);
283260
int p = name.lastIndexOf(".");
284-
String e = name.substring(p + 1);
285-
if (p == -1 || !e.equals("java")) {
261+
String e = name.substring(p);
262+
if (p == -1 || !e.equals(nativeTypesHandler.getFileExtension())) {
286263
/* file has no extension */
287-
return name + ".java";
264+
return name + nativeTypesHandler.getFileExtension();
288265
} else {
289266
/* file has extension e */
290267
return name;
291268
}
292269
}
293270

294271
public static String getDtoNameWithoutExtension(String name) {
272+
INativeTypesHandler nativeTypesHandler = getNativeTypesHandler(name);
295273
int p = name.lastIndexOf(".");
296-
String e = name.substring(p + 1);
297-
if (p == -1 || !e.equals("java")) {
274+
String e = name.substring(p);
275+
if (p == -1 || !e.equals(nativeTypesHandler.getFileExtension())) {
298276
/* file has no extension */
299277
return name;
300278
} else {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ public void actionPerformed(AnActionEvent e) {
119119
}
120120
}
121121

122+
if(GradleBuildFileHelper.isGradleModule(module) && GradleBuildFileHelper.isUsingKotlin(module)) {
123+
dialog.setFileName("dto.kt");
124+
}
125+
122126
dialog.setVisible(true);
123127
}
124128

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package net.servicestack.idea;
2+
3+
import org.apache.http.client.utils.URIBuilder;
4+
5+
import java.io.BufferedReader;
6+
import java.io.IOException;
7+
import java.io.InputStreamReader;
8+
import java.net.MalformedURLException;
9+
import java.net.URISyntaxException;
10+
import java.net.URL;
11+
import java.net.URLConnection;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
import java.util.Map;
15+
16+
/**
17+
* Created by Layoric on 4/12/2015.
18+
*/
19+
public abstract class BaseNativeTypesHandler implements INativeTypesHandler {
20+
21+
@Override
22+
public List<String> getUpdatedCode(String baseUrl, Map<String, String> options) throws IOException, URISyntaxException {
23+
String url;
24+
List<String> javaCodeLines = new ArrayList<String>();
25+
URIBuilder urlBuilder = this.getUrl(baseUrl,options);
26+
for(Map.Entry<String, String> option : options.entrySet()) {
27+
urlBuilder.addParameter(option.getKey(),option.getValue());
28+
}
29+
url = urlBuilder.build().toString();
30+
31+
URL serviceUrl = new URL(url);
32+
URLConnection javaResponseConnection = serviceUrl.openConnection();
33+
BufferedReader javaResponseReader = new BufferedReader(
34+
new InputStreamReader(
35+
javaResponseConnection.getInputStream()));
36+
String metadataInputLine;
37+
38+
while ((metadataInputLine = javaResponseReader.readLine()) != null)
39+
javaCodeLines.add(metadataInputLine);
40+
41+
javaResponseReader.close();
42+
43+
return javaCodeLines;
44+
}
45+
46+
@Override
47+
public URIBuilder getUrl(String baseUrl, Map<String, String> options) throws MalformedURLException, URISyntaxException {
48+
String serverUrl = baseUrl.endsWith("/") ? baseUrl : (baseUrl + "/");
49+
serverUrl = (serverUrl.startsWith("http://") || serverUrl.startsWith("https://")) ? serverUrl : ("http://" + serverUrl);
50+
URL url = new URL(serverUrl);
51+
String path = url.getPath().contains("?") ? url.getPath().split("\\?", 2)[0] : url.getPath();
52+
if (!path.endsWith(this.getRelativeTypesUrl() + "/")) {
53+
serverUrl += (this.getRelativeTypesUrl() + "/");
54+
}
55+
URIBuilder builder;
56+
57+
try {
58+
builder = new URIBuilder(serverUrl);
59+
} catch (URISyntaxException e) {
60+
e.printStackTrace();
61+
throw e;
62+
}
63+
return builder;
64+
}
65+
}

0 commit comments

Comments
 (0)