View Javadoc
1   package org.codehaus.gmavenplus.util;
2   
3   import org.apache.maven.plugin.logging.Log;
4   import org.apache.maven.plugin.logging.SystemStreamLog;
5   import org.codehaus.gmavenplus.model.GroovyCompileConfiguration;
6   import org.codehaus.gmavenplus.model.GroovyDocConfiguration;
7   import org.codehaus.gmavenplus.model.GroovyStubConfiguration;
8   
9   import java.io.IOException;
10  import java.io.ObjectInputStream;
11  import java.nio.file.Files;
12  import java.nio.file.Paths;
13  import java.util.Collections;
14  import java.util.List;
15  
16  /**
17   * Main class to be executed in a forked process for Groovy compilation.
18   *
19   * @author Keegan Witt
20   */
21  public class ForkedGroovyCompiler {
22  
23      public static void main(String[] args) {
24          if (args.length != 1) {
25              System.err.println("Usage: java " + ForkedGroovyCompiler.class.getName() + " <configuration-file>");
26              System.exit(1);
27          }
28  
29          String configFilePath = args[0];
30          try (ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get(configFilePath)))) {
31              Object configuration = ois.readObject();
32              Log log = new SystemStreamLog();
33  
34              List<?> classpath = Collections.emptyList();
35              org.codehaus.gmavenplus.model.IncludeClasspath includeClasspath = null;
36  
37              if (configuration instanceof GroovyCompileConfiguration) {
38                  classpath = ((GroovyCompileConfiguration) configuration).getClasspath();
39                  includeClasspath = ((GroovyCompileConfiguration) configuration).getIncludeClasspath();
40              } else if (configuration instanceof GroovyStubConfiguration) {
41                  classpath = ((GroovyStubConfiguration) configuration).getClasspath();
42                  includeClasspath = ((GroovyStubConfiguration) configuration).getIncludeClasspath();
43              } else if (configuration instanceof GroovyDocConfiguration) {
44                  classpath = ((GroovyDocConfiguration) configuration).getClasspath();
45                  includeClasspath = ((GroovyDocConfiguration) configuration).getIncludeClasspath();
46              }
47  
48              ClassLoader parent = ClassLoader.getSystemClassLoader();
49              if (includeClasspath != null && includeClasspath.name().equals("PROJECT_ONLY")) {
50                  try {
51                      java.lang.reflect.Method getPlatformClassLoader = ClassLoader.class.getMethod("getPlatformClassLoader");
52                      parent = (ClassLoader) getPlatformClassLoader.invoke(null);
53                  } catch (Exception e) {
54                      parent = null;
55                  }
56              }
57  
58              List<?> finalClasspath = classpath != null ? classpath : Collections.emptyList();
59              if (includeClasspath != null && includeClasspath.name().equals("PLUGIN_ONLY")) {
60                  finalClasspath = Collections.emptyList();
61              }
62  
63              ClassWrangler classWrangler = new ClassWrangler(finalClasspath, parent, log);
64              GroovyCompiler compiler = new GroovyCompiler(classWrangler, log);
65  
66              if (configuration instanceof GroovyCompileConfiguration) {
67                  compiler.compile((GroovyCompileConfiguration) configuration);
68              } else if (configuration instanceof GroovyStubConfiguration) {
69                  compiler.generateStubs((GroovyStubConfiguration) configuration);
70              } else if (configuration instanceof GroovyDocConfiguration) {
71                  compiler.generateGroovyDoc((GroovyDocConfiguration) configuration);
72              } else {
73                  throw new IllegalArgumentException("Unknown configuration type: " + configuration.getClass().getName());
74              }
75          } catch (IOException | ClassNotFoundException | InstantiationException | IllegalAccessException | java.lang.reflect.InvocationTargetException e) {
76              e.printStackTrace();
77              System.exit(1);
78          }
79      }
80  }