package org.korsakow.ide.ui.controller.action;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.BoxLayout;
import javax.swing.JDialog;
import javax.swing.JProgressBar;
import org.apache.log4j.Logger;
import org.dsrg.soenea.domain.MapperException;
import org.korsakow.domain.interf.IProject;
import org.korsakow.domain.k3.importer.K3ImportException;
import org.korsakow.domain.k3.importer.K3ImportReport;
import org.korsakow.domain.k3.importer.K3Importer;
import org.korsakow.domain.k3.importer.exception.K3InvalidRuleException;
import org.korsakow.domain.k3.parser.K3InterfaceParserException;
import org.korsakow.domain.k3.parser.K3ParserException;
import org.korsakow.domain.task.IWorker;
import org.korsakow.ide.Application;
import org.korsakow.ide.DataRegistry;
import org.korsakow.ide.controller.ApplicationAdapter;
import org.korsakow.ide.lang.LanguageBundle;
import org.korsakow.ide.ui.controller.ImportHelper;
import org.korsakow.ide.ui.controller.ProjectLoader;
import org.korsakow.ide.ui.controller.ProjectExplorerController.ProgressBarWorkerListener;
import org.korsakow.ide.ui.controller.action.helper.ProgressDialogStatusListener;
import org.korsakow.ide.ui.dialogs.K3ImportDialog;
import org.korsakow.ide.util.Command;
import org.korsakow.ide.util.Pair;
import org.korsakow.ide.util.UIUtil;
public class ImportK3Action extends ApplicationAdapter implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
try {
if (!ExitAction.checkForChangesAndPrompt())
return;
} catch (MapperException e) {
Application.getInstance().showUnhandledErrorDialog(e);
return;
}
File defaultFile = new File(".");
File file = Application.getInstance().showFileOpenDialog(Application.getInstance().getProjectExplorer(), defaultFile, new File("database.txt"));
if (file == null)
return;
try {
doimport(file);
} catch (Exception e) {
Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.cantimport.title"), e);
ProjectLoader.newProject();
}
}
public static void doimport(File originalFile) throws Exception
{
Logger.getLogger(ImportK3Action.class).info("ImportK3Action: " + originalFile.getAbsolutePath());
Application app = Application.getInstance();
File file = originalFile;
// we use a fairly lame heuristic to try and locate the data directory
if (!file.isDirectory() || !file.getName().equals("data")) {
while (file != null) {
file = file.getParentFile();
if (file != null && file.isDirectory() && file.getName().equals("data"))
break;
}
if (file == null) {
app.showAlertDialog(LanguageBundle.getString("import.notak3project.window.title"), LanguageBundle.getString("import.notak3project.window.message", originalFile.getAbsolutePath()));
return;
}
}
System.gc(); // TODO: Why?
final JDialog progressDialog = new JDialog(Application.getInstance().getProjectExplorer());
progressDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
final JProgressBar taskProgressBar = new JProgressBar(0, 100);
taskProgressBar.setIndeterminate(true);
final JProgressBar totalProgressBar = new JProgressBar(0, 100);
totalProgressBar.setStringPainted(true);
totalProgressBar.setValue(0);
totalProgressBar.setString(LanguageBundle.getString("import.progress.initial"));
progressDialog.setLayout(new BoxLayout(progressDialog.getContentPane(), BoxLayout.Y_AXIS));
progressDialog.add(totalProgressBar);
progressDialog.setTitle(LanguageBundle.getString("import.progress.window.title"));
progressDialog.pack();
progressDialog.setSize(640, progressDialog.getSize().height);
UIUtil.centerOnFrame(progressDialog, Application.getInstance().getProjectExplorer());
progressDialog.setModal(true);
// K3Importer k3Importer = new K3Importer();
//
// List<Task> importTasks = k3Importer.createImportTasks(file);
//
// UIWorker importWorker = new UIWorker(importTasks);
Pair<IWorker, K3Importer> pair = Command.importK3(file.getPath());
IWorker importWorker = pair.getFirst();
K3Importer k3Importer = pair.getSecond();
if (!k3Importer.getDatabaseFile().exists()) {
app.showAlertDialog(LanguageBundle.getString("import.notak3project.window.title"), LanguageBundle.getString("import.notak3project.window.message", originalFile.getAbsolutePath()));
return;
}
ProgressBarWorkerListener progressListener = new ProgressBarWorkerListener(totalProgressBar);
importWorker.addPropertyChangeListener("state", new ImportDoneWorkerListener(progressDialog, k3Importer));
importWorker.addPropertyChangeListener("progress", progressListener);
importWorker.addPropertyChangeListener("displayString", progressListener);
importWorker.execute();
progressDialog.setVisible(true);
System.gc(); // purely speculative
}
private static void handleUnknownException(Throwable e)
{
Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.cantimport.title"), e);
ProjectLoader.newProject();
}
private static void handleImportException(K3ImportException e)
{
if (e instanceof K3InvalidRuleException) {
K3InvalidRuleException ruleException = (K3InvalidRuleException)e;
String details = e.getMessage();
if (e.getCause() != null)
details = e.getCause().getMessage();
else
details = e.getMessage();
K3ImportDialog dialog = new K3ImportDialog(ruleException.getDatabaseFile().getAbsolutePath(), ruleException.getLine(),
LanguageBundle.getString("import.invalidrule.message", ruleException.getCode(), ruleException.getLine(), details));
Application.getInstance().showAlertDialog(LanguageBundle.getString("import.invalidrule.title"), dialog);
} else {
Integer line = null;
String file = null;
String details = e.getCause()!=null?e.getCause().getMessage():e.getMessage();
if (e.getCause() instanceof K3ParserException) {
K3ParserException parseException = (K3ParserException)e.getCause();
line = parseException.getLineNumber();
}
if (e.getCause() instanceof K3InterfaceParserException) {
if (e.getInterfaceFile() != null)
file = e.getInterfaceFile().getAbsolutePath();
}
if (file == null) {
if (e.getDatabaseFile() != null)
file = e.getDatabaseFile().getAbsolutePath();
else
file = "";
}
K3ImportDialog dialog = new K3ImportDialog(file, line,
LanguageBundle.getString("import.notak3project.window.message", details));
Application.getInstance().showAlertDialog(LanguageBundle.getString("import.notak3project.window.title"), dialog);
// handleUnknownException(e);
}
}
private static class ImportDoneWorkerListener extends ProgressDialogStatusListener
{
private final K3Importer importer;
public ImportDoneWorkerListener(JDialog progressDialog, K3Importer importer)
{
super(progressDialog);
this.importer = importer;
}
@Override
protected void handleException(Throwable e)
{
if (e instanceof K3ImportException)
handleImportException((K3ImportException)e);
else
handleUnknownException(e);
}
@Override
protected void onDone() {
K3ImportReport report = importer.getReport();
try {
Application.getInstance().setSaveFile(null, DataRegistry.getHeadVersion());
Application.getInstance().clearRegistry();
IProject project = importer.getProject();
ImportHelper.createK3FolderStructure(Application.getInstance().getProjectExplorer().getResourceBrowser().getResourceTreeTable().getTreeTableModel(), importer);
Application.getInstance().notifyProjectLoaded(project);
// checkInterfaces(); // should be done in domain but is currently a bit tricky to do so
Application.getInstance().showAlertDialog(LanguageBundle.getString("import.complete.title"), LanguageBundle.getString("import.complete.message"));
} catch (Exception e) {
handleUnknownException(e);
}
System.gc();
}
}
}