Rename fileNameHandler to ClassFileNameHandler and move it to the utils project

git-svn-id: https://smali.googlecode.com/svn/trunk@787 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
JesusFreke@JesusFreke.com 2010-08-17 13:27:25 +00:00
parent 525ad75b9d
commit bbf4dbba61
2 changed files with 20 additions and 12 deletions

View File

@ -32,6 +32,7 @@ import org.jf.baksmali.Adaptors.ClassDefinition;
import org.jf.dexlib.ClassDefItem; import org.jf.dexlib.ClassDefItem;
import org.jf.dexlib.Code.Analysis.ClassPath; import org.jf.dexlib.Code.Analysis.ClassPath;
import org.jf.dexlib.DexFile; import org.jf.dexlib.DexFile;
import org.jf.util.ClassFileNameHandler;
import java.io.*; import java.io.*;
import java.util.ArrayList; import java.util.ArrayList;
@ -129,7 +130,7 @@ public class baksmali {
} }
}); });
fileNameHandler fileNameHandler = new fileNameHandler(outputDirectoryFile); ClassFileNameHandler fileNameHandler = new ClassFileNameHandler(outputDirectoryFile, ".smali");
for (ClassDefItem classDefItem: classDefItems) { for (ClassDefItem classDefItem: classDefItems) {
/** /**

View File

@ -26,7 +26,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
package org.jf.baksmali; package org.jf.util;
import ds.tree.RadixTree; import ds.tree.RadixTree;
import ds.tree.RadixTreeImpl; import ds.tree.RadixTreeImpl;
@ -34,11 +34,18 @@ import ds.tree.RadixTreeImpl;
import java.io.*; import java.io.*;
import java.nio.CharBuffer; import java.nio.CharBuffer;
public class fileNameHandler { /**
* This class checks for case-insensitive file systems, and generates file names based on a given class name, that are
* guaranteed to be unique. When "colliding" class names are found, it appends a numeric identifier to the end of the
* class name to distinguish it from another class with a name that differes only by case. i.e. a.smali and a_2.smali
*/
public class ClassFileNameHandler {
private PackageNameEntry top; private PackageNameEntry top;
private String fileExtension;
public fileNameHandler(File path) { public ClassFileNameHandler(File path, String fileExtension) {
this.top = new PackageNameEntry(path); this.top = new PackageNameEntry(path);
this.fileExtension = fileExtension;
} }
public File getUniqueFilenameForClass(String className) { public File getUniqueFilenameForClass(String className) {
@ -84,7 +91,7 @@ public class fileNameHandler {
return top.addUniqueChild(packageElements, 0); return top.addUniqueChild(packageElements, 0);
} }
private static abstract class FileSystemEntry { private abstract class FileSystemEntry {
public final File file; public final File file;
public FileSystemEntry(File file) { public FileSystemEntry(File file) {
@ -98,7 +105,7 @@ public class fileNameHandler {
} }
} }
private static class PackageNameEntry extends FileSystemEntry { private class PackageNameEntry extends FileSystemEntry {
//this contains the FileSystemEntries for all of this package's children //this contains the FileSystemEntries for all of this package's children
//the associated keys are all lowercase //the associated keys are all lowercase
private RadixTree<FileSystemEntry> children = new RadixTreeImpl<FileSystemEntry>(); private RadixTree<FileSystemEntry> children = new RadixTreeImpl<FileSystemEntry>();
@ -117,7 +124,7 @@ public class fileNameHandler {
String elementNameLower; String elementNameLower;
if (pathElementsIndex == pathElements.length - 1) { if (pathElementsIndex == pathElements.length - 1) {
elementName = pathElements[pathElementsIndex] + ".smali"; elementName = pathElements[pathElementsIndex] + fileExtension;
} else { } else {
elementName = pathElements[pathElementsIndex]; elementName = pathElements[pathElementsIndex];
} }
@ -159,7 +166,7 @@ public class fileNameHandler {
/** /**
* A virtual group that groups together file system entries with the same name, differing only in case * A virtual group that groups together file system entries with the same name, differing only in case
*/ */
private static class VirtualGroupEntry extends FileSystemEntry { private class VirtualGroupEntry extends FileSystemEntry {
//this contains the FileSystemEntries for all of the files/directories in this group //this contains the FileSystemEntries for all of the files/directories in this group
//the key is the unmodified name of the entry, before it is modified to be made unique (if needed). //the key is the unmodified name of the entry, before it is modified to be made unique (if needed).
private RadixTree<FileSystemEntry> groupEntries = new RadixTreeImpl<FileSystemEntry>(); private RadixTree<FileSystemEntry> groupEntries = new RadixTreeImpl<FileSystemEntry>();
@ -182,7 +189,7 @@ public class fileNameHandler {
String elementName = pathElements[pathElementsIndex]; String elementName = pathElements[pathElementsIndex];
if (pathElementsIndex == pathElements.length - 1) { if (pathElementsIndex == pathElements.length - 1) {
elementName = elementName + ".smali"; elementName = elementName + fileExtension;
} }
FileSystemEntry existingEntry = groupEntries.find(elementName); FileSystemEntry existingEntry = groupEntries.find(elementName);
@ -198,7 +205,7 @@ public class fileNameHandler {
if (pathElementsIndex == pathElements.length - 1) { if (pathElementsIndex == pathElements.length - 1) {
String fileName; String fileName;
if (!isCaseSensitive()) { if (!isCaseSensitive()) {
fileName = pathElements[pathElementsIndex] + "." + (groupEntries.getSize()+1) + ".smali"; fileName = pathElements[pathElementsIndex] + "." + (groupEntries.getSize()+1) + fileExtension;
} else { } else {
fileName = elementName; fileName = elementName;
} }
@ -244,7 +251,7 @@ public class fileNameHandler {
} }
} }
private static boolean testCaseSensitivity(File path) throws IOException { private boolean testCaseSensitivity(File path) throws IOException {
int num = 1; int num = 1;
File f, f2; File f, f2;
do { do {
@ -304,7 +311,7 @@ public class fileNameHandler {
} }
} }
private static class ClassNameEntry extends FileSystemEntry { private class ClassNameEntry extends FileSystemEntry {
public ClassNameEntry(File parent, String name) { public ClassNameEntry(File parent, String name) {
super(new File(parent, name)); super(new File(parent, name));
} }