package org.Algy.controllers;
import java.awt.EventQueue;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Stack;
import org.Algy.dialogs.RenamerDialog;
import org.Algy.frames.Mainframe;
import org.Algy.frames.MyTreeNode;
import org.Algy.jar.JarSource;
import org.Algy.jar.JavaDecompiler;
import org.Algy.models.CachedJarModel;
import org.Algy.models.JarRenamer;
import org.Algy.models.NoSuchClassFile;
import org.Algy.models.RemapFormater;
public class MainController implements Runnable{
private CachedJarModel jarModel;
private Mainframe frame;
private boolean renaming = false;
public static final void main(String args[])
{
MainController controller = new MainController();
controller.startView();
}
public void startView()
{
try {
jarModel = new CachedJarModel(null, new JavaDecompiler(), false);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
EventQueue.invokeLater(this);
}
@Override
public void run() {
try {
frame = new Mainframe(jarModel, this);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean openFile(File file) throws IOException
{
if(renaming)
return false;
jarModel.setJar(file);
jarModel.analyzeJar();
frame.clearMainEditorText();
frame.updateTreeModel();
return true;
}
public boolean saveFileAs(File file, boolean overwrite) throws IOException
{
if(renaming)
return false;
if(file.exists() && !overwrite)
return false;
jarModel.safeSave(file);
return true;
}
MyTreeNode selected = null;
public void treeItemSelection(MyTreeNode node)
{
selected = node;
if(node.getType() == MyTreeNode.TREENODE_CLASS || node.getType() == MyTreeNode.TREENODE_INNERCLASS)
{
try {
JarSource source = jarModel.compile(node.getClassName());
frame.setMainEditorText(source.getRawSource());
} catch (NoSuchClassFile e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void deobfucate() throws IOException
{
if(renaming)
return;
renaming= true;
int min = 2, max = 40;
File oldFile = jarModel.getJarFile().getFile();
try
{
File file = JarRenamer.DeObfuscate(oldFile, min, max);
jarModel.setJar(file);
jarModel.analyzeJar();
}
catch (Exception e)
{
e.printStackTrace();
jarModel.setJar(oldFile);
jarModel.analyzeJar();
}
frame.clearMainEditorText();
frame.updateTreeModel();
renaming= false;
}
public void singleRename() throws IOException
{
if(renaming)
return;
RenamerDialog dlg = new RenamerDialog();
dlg.setLocationRelativeTo(frame);
dlg.setVisible(true);
if(!dlg.isAccepted())
return;
RemapFormater formatter = new RemapFormater();
switch(dlg.getRenamingType())
{
case Class:
formatter.putClass(dlg.getFromText(), dlg.getToText());
break;
case Field:
formatter.putField(dlg.getFromText(), dlg.getAdditionalName(), dlg.getToText());
break;
case Method:
formatter.putMethod(dlg.getFromText(),dlg.getAdditionalName(), dlg.getToText());
break;
case Package:
formatter.putPackage(dlg.getFromText(), dlg.getToText());
break;
}
rename(formatter);
}
public void rename(RemapFormater formatter) throws IOException
{
if(renaming)
return;
renaming= true;
System.out.print("cmd:");
System.out.println(formatter.formatCommand());
String cmd = formatter.formatCommand();
File f = JarRenamer.remapWithConfig(jarModel.getJarFile().getFile(), cmd);
jarModel.clearSourceData();
jarModel.setJar(f);
jarModel.analyzeJar();
frame.clearMainEditorText();
frame.updateTreeModel();
if(selected != null)
frame.selectPath(replaceClassName(selected.getClassName(), formatter), selected.getType());
renaming= false;
}
public void rename(String cmd) throws IOException
{
if(renaming)
return;
renaming= true;
File f = JarRenamer.remapWithConfig(jarModel.getJarFile().getFile(), cmd);
jarModel.clearSourceData();
jarModel.setJar(f);
jarModel.analyzeJar();
frame.clearMainEditorText();
frame.updateTreeModel();
renaming= false;
}
public static String replaceClassName(String className, RemapFormater remapper)
{
Stack<String> stack = new Stack<>();
String str = new String(className);
int ed;
int cnt = 0;
while(!str.equals(""))
{
ed = str.lastIndexOf("/");
String stub = str.substring(ed+1);
if(cnt == 0)
{
//class
HashMap<String, String>classMap = remapper.getClassMap();
if(classMap.containsKey(str))
{
//class remapped
stack.push(classMap.get(str));
}
else
stack.push(stub);
}
else
{
//package
HashMap<String, String> packageMap = remapper.getPakageMap();
if(packageMap.containsKey(str))
{
//package remapped
stack.push(packageMap.get(str));
}
else
stack.push(stub);
}
if(ed == -1)
break;
str = str.substring(0, ed);
cnt++;
}
// reconstruct
String result = "";
if(!stack.isEmpty())
result += stack.pop();
while(!stack.isEmpty())
{
result += "/";
result += stack.pop();
}
return result;
}
public boolean modelOpenned()
{
return (jarModel.getJarFile() != null) && (jarModel.getJarFile().getFile() != null);
}
public boolean isRenaming() {
return renaming;
}
}