support configscript in groovy compilation (IDEA-103342)
[idea/community.git] / plugins / groovy / rt / src / org / jetbrains / groovy / compiler / rt / GroovycRunner.java
1 /*
2  * Copyright 2000-2007 JetBrains s.r.o.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 package org.jetbrains.groovy.compiler.rt;
17
18 import com.intellij.util.lang.UrlClassLoader;
19 import org.jetbrains.annotations.Nullable;
20 import sun.misc.URLClassPath;
21
22 import java.io.BufferedReader;
23 import java.io.File;
24 import java.io.FileReader;
25 import java.io.IOException;
26 import java.lang.reflect.Method;
27 import java.net.URL;
28 import java.util.*;
29
30 /**
31  * @author: Dmitry.Krasilschikov
32  * @date: 16.04.2007
33  * @noinspection UseOfSystemOutOrSystemErr,CallToPrintStackTrace
34  */
35
36 public class GroovycRunner {
37
38   private GroovycRunner() {
39   }
40
41   /*
42   private static Controller initController() {
43     if (!"true".equals(System.getProperty("profile.groovy.compiler"))) {
44       return null;
45     }
46
47     try {
48       return new Controller();
49     }
50     catch (Exception ex) {
51       ex.printStackTrace();
52       return null;
53     }
54   }
55   */
56
57
58   public static void main(String[] args) {
59     /*
60     if (ourController != null) {
61       try {
62         ourController.startCPUProfiling(ProfilingModes.CPU_SAMPLING, null);
63       }
64       catch (Exception e) {
65         e.printStackTrace();
66       }
67     }
68     */
69
70     System.exit(intMain(args));
71     /*
72     finally {
73       if (ourController != null) {
74         try {
75           ourController.captureSnapshot(ProfilingModes.SNAPSHOT_WITHOUT_HEAP);
76           ourController.stopCPUProfiling();
77         }
78         catch (Exception e) {
79           e.printStackTrace();
80         }
81       }
82     }
83     */
84   }
85
86   public static int intMain(String[] args) {
87     boolean indy = false;
88     if (args.length != 3) {
89       if (args.length != 4 || !"--indy".equals(args[3])) {
90         System.err.println("There is no arguments for groovy compiler");
91         return 1;
92       }
93       indy = true;
94     }
95
96     final boolean optimize = GroovyRtConstants.OPTIMIZE.equals(args[0]);
97     final boolean forStubs = "stubs".equals(args[1]);
98     String argPath = args[2];
99
100     String configScript = System.getProperty(GroovyRtConstants.GROOVYC_CONFIG_SCRIPT);
101
102     return intMain2(indy, optimize, forStubs, argPath, configScript, null);
103   }
104
105   public static int intMain2(boolean indy, boolean optimize, boolean forStubs, String argPath, String configScript, Queue mailbox) {
106     if (indy) {
107       System.setProperty("groovy.target.indy", "true");
108     }
109
110     if (!new File(argPath).exists()) {
111       System.err.println("Arguments file for groovy compiler not found");
112       return 1;
113     }
114
115     ClassLoader loader = optimize ? buildMainLoader(argPath) : GroovycRunner.class.getClassLoader();
116     if (loader == null) {
117       return 1;
118     }
119     if (optimize) {
120       Thread.currentThread().setContextClassLoader(loader);
121     }
122
123     try {
124       Class.forName("org.codehaus.groovy.control.CompilationUnit", true, loader);
125     }
126     catch (Throwable e) {
127       System.err.println(GroovyRtConstants.NO_GROOVY);
128       return 1;
129     }
130
131     try {
132       Class<?> aClass = Class.forName("org.jetbrains.groovy.compiler.rt.DependentGroovycRunner", true, loader);
133       Method method = aClass.getDeclaredMethod("runGroovyc", boolean.class, String.class, String.class, Queue.class);
134       method.invoke(null, forStubs, argPath, configScript, mailbox);
135     }
136     catch (Throwable e) {
137       while (e.getCause() != null) {
138         e = e.getCause();
139       }
140       e.printStackTrace();
141       return 1;
142     }
143     return 0;
144   }
145
146   @Nullable
147   private static ClassLoader buildMainLoader(String argsPath) {
148     Set<URL> bootstrapUrls = new HashSet<URL>();
149     try {
150       Method method = ClassLoader.class.getDeclaredMethod("getBootstrapClassPath");
151       method.setAccessible(true);
152       URLClassPath ucp = (URLClassPath)method.invoke(null);
153       Collections.addAll(bootstrapUrls, ucp.getURLs());
154     }
155     catch (Exception e) {
156       e.printStackTrace();
157     }
158
159     final List<URL> urls = new ArrayList<URL>();
160     try {
161       //noinspection IOResourceOpenedButNotSafelyClosed
162       BufferedReader reader = new BufferedReader(new FileReader(argsPath));
163       String classpath = reader.readLine();
164       for (String s : classpath.split(File.pathSeparator)) {
165         URL url = new File(s).toURI().toURL();
166         if (!bootstrapUrls.contains(url)) {
167           urls.add(url);
168         }
169       }
170       reader.close();
171     }
172     catch (IOException e) {
173       e.printStackTrace();
174       return null;
175     }
176
177     final ClassLoader[] ref = new ClassLoader[1];
178     new Runnable() {
179       public void run() {
180         ref[0] = UrlClassLoader.build().urls(urls).useCache().get();
181       }
182     }.run();
183     return ref[0];
184   }
185 }