groovymain.java
来自「Groovy动态语言 运行在JVM中的动态语言 可以方便的处理业务逻辑变化大的业」· Java 代码 · 共 487 行 · 第 1/2 页
JAVA
487 行
}
main.isScriptFile = !line.hasOption('e');
main.debug = line.hasOption('d');
main.conf.setDebug(main.debug);
main.processFiles = line.hasOption('p') || line.hasOption('n');
main.autoOutput = line.hasOption('p');
main.editFiles = line.hasOption('i');
if (main.editFiles) {
main.backupExtension = line.getOptionValue('i');
}
main.autoSplit = line.hasOption('a');
String sp = line.getOptionValue('a');
if (sp != null)
main.splitPattern = sp;
if (main.isScriptFile) {
if (args.isEmpty())
throw new ParseException("neither -e or filename provided");
main.script = (String) args.remove(0);
if (main.script.endsWith(".java"))
throw new ParseException("error: cannot compile file with .java extension: " + main.script);
} else {
main.script = line.getOptionValue('e');
}
main.processSockets = line.hasOption('l');
if (main.processSockets) {
String p = line.getOptionValue('l', "1960"); // default port to listen to
main.port = new Integer(p).intValue();
}
main.args = args;
return main.run();
}
/**
* Run the script.
*/
private boolean run() {
try {
if (processSockets) {
processSockets();
} else if (processFiles) {
processFiles();
} else {
processOnce();
}
return true;
} catch (CompilationFailedException e) {
System.err.println(e);
return false;
} catch (Throwable e) {
if (e instanceof InvokerInvocationException) {
InvokerInvocationException iie = (InvokerInvocationException) e;
e = iie.getCause();
}
System.err.println("Caught: " + e);
if (debug) {
e.printStackTrace();
} else {
StackTraceElement[] stackTrace = e.getStackTrace();
for (int i = 0; i < stackTrace.length; i++) {
StackTraceElement element = stackTrace[i];
String fileName = element.getFileName();
if (fileName!=null && !fileName.endsWith(".java")) {
System.err.println("\tat " + element);
}
}
}
return false;
}
}
/**
* Process Sockets.
*/
private void processSockets() throws CompilationFailedException, IOException {
GroovyShell groovy = new GroovyShell(conf);
//check the script is currently valid before starting a server against the script
if (isScriptFile) {
groovy.parse(new FileInputStream(huntForTheScriptFile(script)));
} else {
groovy.parse(script);
}
new GroovySocketServer(groovy, isScriptFile, script, autoOutput, port);
}
/**
* Hunt for the script file, doesn't bother if it is named precisely.
*
* Tries in this order:
* - actual supplied name
* - name.groovy
* - name.gvy
* - name.gy
* - name.gsh
*/
public File huntForTheScriptFile(String scriptFileName) {
File scriptFile = new File(scriptFileName);
String[] standardExtensions = {".groovy",".gvy",".gy",".gsh"};
int i = 0;
while (i < standardExtensions.length && !scriptFile.exists()) {
scriptFile = new File(scriptFileName + standardExtensions[i]);
i++;
}
// if we still haven't found the file, point back to the originally specified filename
if (!scriptFile.exists()) {
scriptFile = new File(scriptFileName);
}
return scriptFile;
}
/**
* Process the input files.
*/
private void processFiles() throws CompilationFailedException, IOException {
GroovyShell groovy = new GroovyShell(conf);
Script s = null;
if (isScriptFile) {
s = groovy.parse(huntForTheScriptFile(script));
} else {
s = groovy.parse(script, "main");
}
if (args.isEmpty()) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter writer = new PrintWriter(System.out);
try {
processReader(s, reader, writer);
} finally {
reader.close();
writer.close();
}
} else {
Iterator i = args.iterator();
while (i.hasNext()) {
String filename = (String) i.next();
File file = huntForTheScriptFile(filename);
processFile(s, file);
}
}
}
/**
* Process a single input file.
*
* @param s the script to execute.
* @param file the input file.
*/
private void processFile(Script s, File file) throws IOException {
if (!file.exists())
throw new FileNotFoundException(file.getName());
if (!editFiles) {
BufferedReader reader = new BufferedReader(new FileReader(file));
try {
PrintWriter writer = new PrintWriter(System.out);
processReader(s, reader, writer);
writer.flush();
} finally {
reader.close();
}
} else {
File backup = null;
if (backupExtension == null) {
backup = File.createTempFile("groovy_", ".tmp");
backup.deleteOnExit();
} else {
backup = new File(file.getPath() + backupExtension);
}
backup.delete();
if (!file.renameTo(backup))
throw new IOException("unable to rename " + file + " to " + backup);
BufferedReader reader = new BufferedReader(new FileReader(backup));
try {
PrintWriter writer = new PrintWriter(new FileWriter(file));
try {
processReader(s, reader, writer);
} finally {
writer.close();
}
} finally {
reader.close();
}
}
}
/**
* Process a script against a single input file.
*
* @param s script to execute.
* @param reader input file.
* @param pw output sink.
*/
private void processReader(Script s, BufferedReader reader, PrintWriter pw) throws IOException {
String line = null;
String lineCountName = "count";
s.setProperty(lineCountName, BigInteger.ZERO);
String autoSplitName = "split";
s.setProperty("out", pw);
while ((line = reader.readLine()) != null) {
s.setProperty("line", line);
s.setProperty(lineCountName,
((BigInteger)s.getProperty(lineCountName)).add(BigInteger.ONE));
if(autoSplit)
s.setProperty(autoSplitName, line.split(splitPattern));
Object o = s.run();
if (autoOutput) {
pw.println(o);
}
}
}
private static ClassLoader getLoader(ClassLoader cl) {
if (cl!=null) return cl;
cl = Thread.currentThread().getContextClassLoader();
if (cl!=null) return cl;
cl = GroovyMain.class.getClassLoader();
if (cl!=null) return cl;
return null;
}
/**
* Process the standard, single script with args.
*/
private void processOnce() throws CompilationFailedException, IOException {
GroovyShell groovy = new GroovyShell(conf);
if (isScriptFile)
groovy.run(huntForTheScriptFile(script), args);
else
groovy.run(script, "script_from_command_line", args);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?