public void removeTypedefClasses() { if (classDir != null && typedefsToRemove != null && !typedefsToRemove.isEmpty()) { // Perform immediately boolean quiet = false; boolean verbose = false; boolean dryRun = false; //noinspection ConstantConditions TypedefRemover remover = new TypedefRemover(this, quiet, verbose, dryRun); remover.remove(classDir, typedefsToRemove); } }
public void remove(@NonNull File classDir, @NonNull List<String> owners) { if (!mQuiet) { info("Deleting @IntDef and @StringDef annotation class files"); } // Record typedef annotation names and files for (String owner : owners) { addTypeDef(owner); } // Rewrite the .class files for any classes that *contain* typedefs as innerclasses rewriteOuterClasses(classDir); // Removes the actual .class files for the typedef annotations deleteAnnotationClasses(classDir); }
public static void removeTypedefClasses(@NonNull File classDir, @NonNull File typedefFile) { // Perform immediately boolean quiet = false; boolean verbose = false; boolean dryRun = false; //noinspection ConstantConditions TypedefRemover remover = new TypedefRemover(null, quiet, verbose, dryRun); remover.removeFromTypedefFile(classDir, typedefFile); }
public void remove(@NonNull File classDir, @NonNull List<String> owners) { if (!mQuiet) { mExtractor.info("Deleting @IntDef and @StringDef annotation class files"); } // Record typedef annotation names and files for (String owner : owners) { File file = new File(classDir, owner.replace('/', File.separatorChar) + DOT_CLASS); addTypeDef(owner, file); } // Rewrite the .class files for any classes that *contain* typedefs as innerclasses rewriteOuterClasses(); // Removes the actual .class files for the typedef annotations deleteAnnotationClasses(); }
public void removeFromTypedefFile(@NonNull File classDir, @NonNull File file) { setTypedefFile(file); remove(classDir, Collections.emptyList()); }
private void jarFolderToRootLocation(@NonNull File file, @NonNull final List<Pattern> excludes) throws IOException { JarMerger jarMerger = new JarMerger(mainClassLocation); jarMerger.setFilter(archivePath -> checkEntry(excludes, archivePath)); if (typedefRecipe.isFile()) { jarMerger.setTypedefRemover(new TypedefRemover().setTypedefFile(typedefRecipe)); } jarMerger.addFolder(file); jarMerger.close(); }
@NonNull public TypedefRemover setTypedefFile(@NonNull File file) { try { for (String line : Files.readLines(file, Charsets.UTF_8)) { if (line.startsWith("D ")) { String clz = line.substring(2).trim(); addTypeDef(clz); } } } catch (IOException e) { Extractor.error("Could not read " + file + ": " + e.getLocalizedMessage()); } return this; }
logger.verbose("addFolder(%1$s, %2$s): entry %3$s", folder, path, entryPath); if (typedefRemover != null && typedefRemover.isRemoved(entryPath)) { continue; InputStream fis = localCloser.register(new FileInputStream(file)); if (typedefRemover != null) { fis = typedefRemover.filter(entryPath, fis); assert fis != null; // because we checked isRemoved above
/** * Filter the given file (given by a path). * * @param path the path within the jar file * @param input the contents of the file * @return a stream which provides the content of the file, which may be null (to delete/not * package the file), or the original input stream if the file should be packaged as is, or * possibly a different input stream with the file rewritten */ @Nullable public InputStream filter(@NonNull String path, @NonNull InputStream input) { if (mAnnotationClassFiles.contains(path)) { return null; } if (!mAnnotationOuterClassFiles.contains(path)) { return input; } // Transform try { ClassReader reader = new ClassReader(input); byte[] rewritten = rewriteOuterClass(reader); return new ByteArrayInputStream(rewritten); } catch (IOException ioe) { Extractor.error("Could not process " + path + ": " + ioe.getLocalizedMessage()); return input; } }
/** * Performs the actual deletion (or display, if in dry-run mode) of the typedef annotation * files */ private void deleteAnnotationClasses(@NonNull File classDir) { for (String relative : mAnnotationClassFiles) { File file = new File(classDir, relative.replace('/', File.separatorChar)); if (!file.isFile()) { Extractor.error("Warning: Could not find class file " + file + " for typedef"); continue; } if (mVerbose) { if (mDryRun) { info("Would delete " + file); } else { info("Deleting " + file); } } if (!mDryRun) { boolean deleted = file.delete(); if (!deleted) { Extractor.warning("Could not delete " + file); } } } } }
/** * Rewrites the outer classes containing the typedefs such that they no longer refer to * the (now removed) typedef annotation inner classes */ private void rewriteOuterClasses(@NonNull File classDir) { for (String relative : mAnnotationOuterClassFiles) { File file = new File(classDir, relative.replace('/', File.separatorChar)); if (!file.isFile()) { Extractor.error("Warning: Could not find outer class " + file + " for typedef"); continue; } byte[] bytes; try { bytes = Files.toByteArray(file); } catch (IOException e) { Extractor.error("Could not read " + file + ": " + e.getLocalizedMessage()); continue; } ClassReader reader = new ClassReader(bytes); byte[] rewritten = rewriteOuterClass(reader); try { Files.write(rewritten, file); } catch (IOException e) { Extractor.error("Could not write " + file + ": " + e.getLocalizedMessage()); //noinspection UnnecessaryContinue continue; } } }
public void removeTypedefClasses() { if (classDir != null && typedefClasses != null && !typedefClasses.isEmpty()) { boolean quiet = false; boolean verbose = false; boolean dryRun = false; //noinspection ConstantConditions TypedefRemover remover = new TypedefRemover(this, quiet, verbose, dryRun); remover.remove(classDir, typedefClasses); } }