提交 deac3c6e authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Get rid of SwitchSource

上级 cef97d64
......@@ -95,15 +95,6 @@ To run the build tool in shell mode, use the command line option <code>-</code>:
./build.sh -
</pre>
<h3>Switching the Source Code</h3>
<p>
The source code uses Java 7 features.
To switch the source code to the installed version of Java, run:
</p>
<pre>
build switchSource
</pre>
<h2 id="build_targets">Build Targets</h2>
<p>
The build system can generate smaller jar files as well. The following targets are currently supported:
......
......@@ -23,7 +23,6 @@ import java.util.concurrent.TimeUnit;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.h2.build.code.SwitchSource;
import org.h2.build.doc.XMLParser;
/**
......@@ -231,34 +230,11 @@ public class Build extends BuildBase {
m.invoke(d, new File("coverage/report/index.html"));
}
/**
* Switch the source code to the current JDK.
*/
@Description(summary = "Switch the source code to match the current JDK.")
public void switchSource() {
switchSource(true);
}
private static String getTargetJavaVersion() {
return System.getProperty("version");
}
private static void switchSource(boolean enableCheck) {
try {
String version = getTargetJavaVersion();
String check = enableCheck ? "+CHECK" : "-CHECK";
if (version == null) {
SwitchSource.main("-dir", "src", "-auto", check);
} else {
SwitchSource.main("-dir", "src", "-version", version, check);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void compileMVStore(boolean debugInfo) {
switchSource(debugInfo);
clean();
mkdir("temp");
String classpath = "temp";
......@@ -282,7 +258,6 @@ public class Build extends BuildBase {
private void compile(boolean debugInfo, boolean clientOnly,
boolean basicResourcesOnly) {
switchSource(debugInfo);
clean();
mkdir("temp");
download();
......
/*
* Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.build.code;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
/**
* Switched source code to a specific Java version, automatically to the current
* version, or enable / disable other blocks of source code in Java files.
*/
public class SwitchSource {
private final ArrayList<String> enable = new ArrayList<>();
private final ArrayList<String> disable = new ArrayList<>();
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String... args) throws IOException {
new SwitchSource().run(args);
}
private void run(String... args) throws IOException {
String dir = null;
String version = null;
for (int i = 0; i < args.length; i++) {
String a = args[i];
if ("-dir".equals(a)) {
dir = args[++i];
} else if ("-auto".equals(a)) {
enable.add("AWT");
version = System.getProperty("java.specification.version");
} else if ("-version".equals(a)) {
version = args[++i];
} else if (a.startsWith("-")) {
String x = a.substring(1);
disable.add(x);
enable.remove(x);
} else if (a.startsWith("+")) {
String x = a.substring(1);
enable.add(x);
disable.remove(x);
} else {
showUsage();
return;
}
}
if (version == null) {
// ok
} else if ("1.5".equals(version)) {
disable.add("Java 1.6");
disable.add("Java 1.7");
} else if ("1.6".equals(version)) {
enable.add("Java 1.6");
disable.add("Java 1.7");
} else if (version.compareTo("1.7") >= 0) {
enable.add("Java 1.6");
enable.add("Java 1.7");
} else {
throw new IllegalArgumentException("version: " + version);
}
if (dir == null) {
showUsage();
} else {
process(new File(dir));
}
}
private void showUsage() {
System.out.println("Switched source code to a specific Java version.");
System.out.println("java "+getClass().getName() + "\n" +
" -dir <dir> The target directory\n" +
" [-version] Use the specified Java version (1.4 or newer)\n" +
" [-auto] Auto-detect Java version (1.4 or newer)\n" +
" [+MODE] Enable code labeled MODE\n" +
" [-MODE] Disable code labeled MODE");
}
private void process(File f) throws IOException {
String name = f.getName();
if (name.startsWith(".svn")) {
return;
} else if (name.endsWith(".java")) {
processFile(f);
} else if (f.isDirectory()) {
for (File file : f.listFiles()) {
process(file);
}
}
}
private void processFile(File f) throws IOException {
byte[] buffer;
try (RandomAccessFile read = new RandomAccessFile(f, "r")) {
long len = read.length();
if (len >= Integer.MAX_VALUE) {
throw new IOException("Files bigger than Integer.MAX_VALUE are not supported");
}
buffer = new byte[(int) len];
read.readFully(buffer);
}
boolean found = false;
// check for ## without creating a string
for (int i = 0; i < buffer.length - 1; i++) {
if (buffer[i] == '#' && buffer[i + 1] == '#') {
found = true;
break;
}
}
if (!found) {
return;
}
String source = new String(buffer);
String target = source;
for (String x : enable) {
target = replaceAll(target, "/*## " + x + " ##", "//## " + x + " ##");
}
for (String x : disable) {
target = replaceAll(target, "//## " + x + " ##", "/*## " + x + " ##");
}
if (!source.equals(target)) {
String name = f.getPath();
File fileNew = new File(name + ".new");
FileWriter write = new FileWriter(fileNew);
write.write(target);
write.close();
File fileBack = new File(name + ".bak");
fileBack.delete();
f.renameTo(fileBack);
File fileCopy = new File(name);
if (!fileNew.renameTo(fileCopy)) {
throw new IOException("Could not rename "
+ fileNew.getAbsolutePath() + " to " + name);
}
if (!fileBack.delete()) {
throw new IOException("Could not delete " + fileBack.getAbsolutePath());
}
// System.out.println(name);
}
}
private static String replaceAll(String s, String before, String after) {
int index = 0;
while (true) {
int next = s.indexOf(before, index);
if (next < 0) {
return s;
}
s = s.substring(0, next) + after + s.substring(next + before.length());
index = next + after.length();
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论