blob: 1ba6a983691c2b39f314fecc01f5c684db39f77d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** Task script that is called by Ant's common-build.xml file:
* Patches Java 8 class files to replace method signatures by
* native Java 9 optimized ones (to be placed in MR-JAR).
*/
import org.apache.tools.ant.Project;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.commons.ClassRemapper;
import org.objectweb.asm.commons.Remapper;
def mappings = [
'org/apache/lucene/util/FutureObjects': 'java/util/Objects',
'org/apache/lucene/util/FutureArrays': 'java/util/Arrays',
];
if (properties['run.clover'] != null) {
task.log("Disabled class file remapping for Java 9, because Clover code coverage is enabled.", Project.MSG_INFO);
return;
}
File inputDir = new File(properties['build.dir'], 'classes/java');
File outputDir = new File(properties['build.dir'], 'classes/java9');
outputDir.mkdirs();
def scanner = ant.fileScanner {
fileset(dir:inputDir) {
include(name:"**/*.class")
}
}
int count = 0;
for (f in scanner) {
ClassReader reader = new ClassReader(f.getBytes());
if (mappings.containsKey(reader.className)) {
// we do not remap our replacements! :-)
continue;
}
ClassWriter writer = new ClassWriter(0 /* no recalculations needed */);
boolean remapped = false;
ClassRemapper remapper = new ClassRemapper(writer, new Remapper() {
@Override
public String map(String typeName) {
if (mappings.containsKey(typeName)) {
remapped = true;
return mappings.get(typeName);
}
return typeName;
}
});
reader.accept(remapper, 0 /* keep everything as-is*/);
if (remapped) {
task.log("Remapped: "+reader.className, Project.MSG_INFO);
File output = new File(outputDir, reader.className + '.class');
output.parentFile.mkdirs();
output.setBytes(writer.toByteArray());
count++;
}
}
task.log("Remapped $count class files for Java 9 to: $outputDir", Project.MSG_INFO);