44import com .intellij .notification .NotificationType ;
55import com .intellij .notification .Notifications ;
66import com .intellij .openapi .module .Module ;
7- import com .intellij .openapi .project .Project ;
87import com .intellij .openapi .vfs .LocalFileSystem ;
98import com .intellij .openapi .vfs .VirtualFile ;
109import com .intellij .openapi .vfs .VirtualFileManager ;
1110import com .intellij .psi .JavaPsiFacade ;
1211import com .intellij .psi .PsiDirectory ;
1312import com .intellij .psi .PsiManager ;
1413import com .intellij .psi .PsiPackage ;
15- import org .apache . http . client . utils . URIBuilder ;
14+ import org .jetbrains . annotations . Nullable ;
1615import org .jetbrains .idea .maven .project .MavenProjectsManager ;
1716
1817import java .io .*;
1918import java .net .MalformedURLException ;
2019import java .net .URISyntaxException ;
21- import java .net .URL ;
22- import java .net .URLConnection ;
23- import java .util .ArrayList ;
20+ import java .util .HashMap ;
2421import java .util .List ;
22+ import java .util .Map ;
23+
2524
2625public 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 {
0 commit comments