blob: 828cce72dda96b46984cedf12d67a82458c60ce8 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed 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.
*/
package lockedregioncodeinjection;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class Main {
public static void main(String[] args) throws IOException {
String inJar = null;
String outJar = null;
String legacyTargets = null;
String legacyPreMethods = null;
String legacyPostMethods = null;
for (int i = 0; i < args.length; i++) {
if ("-i".equals(args[i].trim())) {
i++;
inJar = args[i].trim();
} else if ("-o".equals(args[i].trim())) {
i++;
outJar = args[i].trim();
} else if ("--targets".equals(args[i].trim())) {
i++;
legacyTargets = args[i].trim();
} else if ("--pre".equals(args[i].trim())) {
i++;
legacyPreMethods = args[i].trim();
} else if ("--post".equals(args[i].trim())) {
i++;
legacyPostMethods = args[i].trim();
}
}
// TODO(acleung): Better help message than asserts.
assert inJar != null;
assert outJar != null;
assert legacyTargets == null || (legacyPreMethods != null && legacyPostMethods != null);
ZipFile zipSrc = new ZipFile(inJar);
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outJar));
List<LockTarget> targets = null;
if (legacyTargets != null) {
targets = Utils.getTargetsFromLegacyJackConfig(legacyTargets, legacyPreMethods,
legacyPostMethods);
} else {
targets = Collections.emptyList();
}
Enumeration<? extends ZipEntry> srcEntries = zipSrc.entries();
while (srcEntries.hasMoreElements()) {
ZipEntry entry = srcEntries.nextElement();
ZipEntry newEntry = new ZipEntry(entry.getName());
newEntry.setTime(entry.getTime());
zos.putNextEntry(newEntry);
BufferedInputStream bis = new BufferedInputStream(zipSrc.getInputStream(entry));
if (entry.getName().endsWith(".class")) {
convert(bis, zos, targets);
} else {
while (bis.available() > 0) {
zos.write(bis.read());
}
zos.closeEntry();
bis.close();
}
}
zos.finish();
zos.close();
zipSrc.close();
}
private static void convert(InputStream in, OutputStream out, List<LockTarget> targets)
throws IOException {
ClassReader cr = new ClassReader(in);
ClassWriter cw = new ClassWriter(0);
LockFindingClassVisitor cv = new LockFindingClassVisitor(targets, cw);
cr.accept(cv, 0);
byte[] data = cw.toByteArray();
out.write(data);
}
}