package agg.gui.saveload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InvalidClassException;
import java.io.ObjectInputStream;
import java.io.OptionalDataException;
import java.io.StreamCorruptedException;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import agg.editor.impl.EdGraGra;
import agg.gui.AGGAppl;
import agg.gui.ProgressBar;
import agg.gui.event.LoadEvent;
import agg.gui.event.LoadEventListener;
import agg.util.XMLHelper;
//import agg.xt_basis.BaseFactory;
import agg.xt_basis.BaseFactory;
import agg.xt_basis.GraGra;
/**
* @version $Id: GraGraLoad.java,v 1.4 2010/09/23 08:22:04 olga Exp $
* @author $Author: olga $
*/
public class GraGraLoad {
final private Vector<LoadEventListener> loadListeners = new Vector<LoadEventListener>();
public GraGraLoad(JFrame fr) {
this(fr, "", "");
}
public GraGraLoad(JFrame fr, String dname, String fname) {
this.applFrame = fr;
this.dirName = dname;
this.fileName = fname;
/* create a file chooser */
if (!this.dirName.equals(""))
this.chooser = new JFileChooser(this.dirName);
else
this.chooser = new JFileChooser(System.getProperty("user.dir"));
/* create file filters */
this.filterXML = new AGGFileFilter("ggx", "AGG Files XML (.ggx)");
this.chooser.addChoosableFileFilter(this.filterXML);
/* set a file filter */
this.chooser.setFileFilter(this.filterXML);
/* create a progress bar */
this.bar = createProgressBar();
}
public javax.swing.filechooser.FileFilter getFileFilter() {
return this.chooser.getFileFilter();
}
public void setFileFilter(javax.swing.filechooser.FileFilter filter) {
this.chooser.setFileFilter(filter);
}
public void setExtensionFileFilter(ExtensionFileFilter filter) {
this.chooser.setFileFilter(filter);
}
public void load() {
fireLoad(new LoadEvent(this, LoadEvent.LOAD, ""));
this.gra = null;
this.basis = null;
int returnVal = this.chooser.showOpenDialog(this.applFrame);
this.dirName = this.chooser.getCurrentDirectory().toString();
if (returnVal == JFileChooser.APPROVE_OPTION) {
if (this.chooser.getSelectedFile() != null
&& !this.chooser.getSelectedFile().getName().equals("")) {
this.fileName = this.chooser.getSelectedFile().getName();
if (!this.dirName.endsWith(File.separator))
this.dirName += File.separator;
reload();
} else
fireLoad(new LoadEvent(this, LoadEvent.EMPTY_ERROR, ""));
} else if (returnVal == JFileChooser.CANCEL_OPTION) {
this.canceled = true;
}
}
public boolean isCanceled() {
return this.canceled;
}
public void reload(String dirname, String filename) {
this.dirName = dirname;
this.fileName = filename;
reload();
}
public void reload() {
AGGAppl.showFileLoadLogo();
if (!this.fileName.endsWith(".ggx")
&& this.chooser.getFileFilter() == this.filterXML)
this.fileName = this.fileName + ".ggx";
if (this.fileName.endsWith(".ggx")
|| this.chooser.getFileFilter() != this.filterXML) {
File f = new File(this.dirName + this.fileName);
if (f.exists()) {
fireLoad(new LoadEvent(this, LoadEvent.PROGRESS_BEGIN, ""));
XMLHelper h = new XMLHelper();
/*
* if(XMLHelper.hasGermanSpecialCh(this.fileName)){
* JOptionPane.showMessageDialog(null, "\t"+this.fileName +"\n Read
* file name exception occurred! " +"\n Maybe the German
* characters like ä, ö, ü, ß or space were used. " +"\n Please
* rename the file " +"\nand try again.", "Cannot load file",
* JOptionPane.WARNING_MESSAGE); this.gra = null; return; }
*/
if ((this.dirName.equals("") && h.read_from_xml(this.fileName))
|| h.read_from_xml(this.dirName + this.fileName)) {
long time0 = System.currentTimeMillis();
GraGra bgra = BaseFactory.theFactory().createGraGra(false);
h.getTopObject(bgra);
this.gra = new EdGraGra(bgra);
this.gra.setDirName(this.dirName);
this.gra.setFileName(this.fileName);
this.gra.getTypeSet().setResourcesPath(this.dirName);
h.enrichObject(this.gra);
System.out.println("(Base) Grammar <" + this.gra.getName()
+ "> loaded in "
+ (System.currentTimeMillis() - time0) + "ms");
fireLoad(new LoadEvent(this, LoadEvent.LOADED, this.dirName
+ this.fileName));
fireLoad(new LoadEvent(this, LoadEvent.PROGRESS_FINISHED, ""));
}
} else {
JOptionPane.showMessageDialog(null, "File \"" + this.dirName
+ this.fileName + "\" does not exist!", "Cannot load file",
JOptionPane.WARNING_MESSAGE);
System.out.println("agg.gui.GraGraLoad: File \"" + this.dirName
+ this.fileName + "\" does not exist!");
}
} // if XML
else {
if (!this.dirName.equals("") && !this.fileName.equals("")) {
fireLoad(new LoadEvent(this, LoadEvent.PROGRESS_BEGIN, this.bar
.getContentPanel(), ""));
this.bar.start();
int key = -1;
this.addMsg = "";
try {
File f = new File(this.dirName + this.fileName);
long datei = f.length();
double multi = (datei + datei * 0.04) / 16000.0;
LoadSaveStatus.setMaximum((int) (100 * multi));
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
this.gra = (EdGraGra) ois.readObject();
this.gra.setDirName(this.dirName);
this.gra.setFileName(this.fileName);
this.gra.getTypeSet().setResourcesPath(this.dirName);
if (!this.gra.getTypeSet().basisTypeReprComplete())
this.gra.getTypeSet().setAdditionalReprOfBasisType();
this.gra.update();
fis.close();
key = LoadEvent.LOADED;
} // try
catch (FileNotFoundException fnfx) {
this.gra = null;
key = LoadEvent.CLASS_NOT_FOUND_ERROR;
this.addMsg = "";
} catch (SecurityException sx) {
this.gra = null;
key = LoadEvent.SECURITY_ERROR;
if (sx.getMessage() == null) {
this.addMsg = "";
} else {
this.addMsg = sx.getLocalizedMessage();
}
} catch (StreamCorruptedException scx) {
this.gra = null;
key = LoadEvent.STREAM_ERROR;
} catch (ClassNotFoundException cnfx) {
this.gra = null;
key = LoadEvent.CLASS_NOT_FOUND_ERROR;
this.addMsg = cnfx.getLocalizedMessage();
} catch (InvalidClassException icx) {
this.gra = null;
key = LoadEvent.INVALID_CLASS_ERROR;
this.addMsg = icx.getLocalizedMessage();
} catch (OptionalDataException odx) { // what kind exception
// is this?
this.gra = null;
key = LoadEvent.DATA_ERROR;
this.addMsg = odx.getLocalizedMessage();
} catch (IOException iox) {
this.gra = null;
key = LoadEvent.IO_ERROR;
if (iox.getLocalizedMessage() == null) {
this.addMsg = "";
} else {
this.addMsg = iox.getLocalizedMessage();
}
} catch (StackOverflowError sox) {
this.gra = null;
key = LoadEvent.STACK_OVERFLOW_ERROR;
if (sox.getLocalizedMessage() == null) {
this.addMsg = "";
} else {
this.addMsg = sox.getLocalizedMessage();
}
} finally {
fireLoad(new LoadEvent(this, LoadEvent.PROGRESS_FINISHED,
this.bar.getContentPanel(), ""));
fireLoad(new LoadEvent(this, key, this.dirName + this.fileName,
this.addMsg));
this.bar.finish();
this.bar.quit();
}
} // if (!this.dirName.equals("") && !this.fileName.equals("")
} // else
}
public void loadBase() {
fireLoad(new LoadEvent(this, LoadEvent.LOAD, ""));
int returnVal = this.chooser.showOpenDialog(this.applFrame);
this.dirName = this.chooser.getCurrentDirectory().toString();
if (returnVal == JFileChooser.APPROVE_OPTION) {
if (this.chooser.getSelectedFile() != null
&& !this.chooser.getSelectedFile().getName().equals("")) {
this.fileName = this.chooser.getSelectedFile().getName();
if (!this.dirName.endsWith(File.separator))
this.dirName += File.separator;
reloadBase();
} else
fireLoad(new LoadEvent(this, LoadEvent.EMPTY_ERROR, ""));
} else
fireLoad(new LoadEvent(this, LoadEvent.EMPTY_ERROR, ""));
}
public void reloadBase() {
AGGAppl.showFileLoadLogo();
if (this.fileName.endsWith(".ggx")
&& this.chooser.getFileFilter() == this.filterXML) {
fireLoad(new LoadEvent(this, LoadEvent.PROGRESS_BEGIN, ""));
XMLHelper h = new XMLHelper();
/*
* if(XMLHelper.hasGermanSpecialCh(this.fileName)){
* JOptionPane.showMessageDialog(null, "\t"+this.fileName +"\n Read file
* name exception occurred! " +"\n Maybe the German characters like
* ä, ö, ü, ß or space were used. " +"\n Please rename the file "
* +"\nand try again.", "Cannot load file",
* JOptionPane.WARNING_MESSAGE); this.gra = null; return; }
*/
if ((this.dirName.equals("") && h.read_from_xml(this.fileName))
|| h.read_from_xml(this.dirName + this.fileName)) {
// this.basis = BaseFactory.theFactory().createGraGra();
this.basis = new GraGra(false);
h.getTopObject(this.basis);
fireLoad(new LoadEvent(this, LoadEvent.LOADED, this.dirName + this.fileName));
// fireLoad(new LoadEvent(this, LoadEvent.PROGRESS_FINISHED, ""));
}
} // if XML
else {
if (!this.dirName.equals("") && !this.fileName.equals("")) {
fireLoad(new LoadEvent(this, LoadEvent.PROGRESS_BEGIN, this.bar
.getContentPanel(), ""));
this.bar.start();
int key = -1;
this.addMsg = "";
try {
File f = new File(this.dirName + this.fileName);
long datei = f.length();
double multi = (datei + datei * 0.04) / 16000.0;
LoadSaveStatus.setMaximum((int) (100 * multi));
FileInputStream fis = new FileInputStream(f);
ObjectInputStream ois = new ObjectInputStream(fis);
this.basis = (GraGra) ois.readObject();
fis.close();
key = LoadEvent.LOADED;
} catch (FileNotFoundException fnfx) {
key = LoadEvent.CLASS_NOT_FOUND_ERROR;
this.addMsg = "";
} catch (SecurityException sx) {
key = LoadEvent.SECURITY_ERROR;
if (sx.getMessage() == null) {
this.addMsg = "";
} else {
this.addMsg = sx.getLocalizedMessage();
}
} catch (StreamCorruptedException scx) {
key = LoadEvent.STREAM_ERROR;
} catch (ClassNotFoundException cnfx) {
key = LoadEvent.CLASS_NOT_FOUND_ERROR;
this.addMsg = cnfx.getLocalizedMessage();
} catch (InvalidClassException icx) {
key = LoadEvent.INVALID_CLASS_ERROR;
this.addMsg = icx.getLocalizedMessage();
} catch (OptionalDataException odx) {
key = LoadEvent.DATA_ERROR;
this.addMsg = odx.getLocalizedMessage();
} catch (IOException iox) {
key = LoadEvent.IO_ERROR;
if (iox.getMessage() == null) {
this.addMsg = "";
} else {
this.addMsg = iox.getLocalizedMessage();
}
} catch (StackOverflowError sox) {
key = LoadEvent.STACK_OVERFLOW_ERROR;
if (sox.getMessage() == null) {
this.addMsg = "";
} else {
this.addMsg = sox.getLocalizedMessage();
}
} finally {
fireLoad(new LoadEvent(this, LoadEvent.PROGRESS_FINISHED,
this.bar.getContentPanel(), ""));
fireLoad(new LoadEvent(this, key, this.dirName + this.fileName,
this.addMsg));
this.bar.finish();
this.bar.quit();
}
}
}
}
public String getFileName() {
return this.fileName;
}
public String getDirName() {
return this.dirName;
}
public void setDirName(String directory) {
if (!directory.equals("")) {
this.dirName = directory;
this.chooser = new JFileChooser(this.dirName);
/* create file filters */
this.filterXML = new AGGFileFilter("ggx", "AGG Files XML (.ggx)");
this.chooser.addChoosableFileFilter(this.filterXML);
/* set a file filter */
this.chooser.setFileFilter(this.filterXML);
}
}
public EdGraGra getGraGra() {
return this.gra;
}
public GraGra getBaseGraGra() {
return this.basis;
}
public void setGraGra(EdGraGra gragra, String dirname, String filename) {
this.gra = gragra;
if ((dirname != null) && !dirname.equals("")) {
if (dirname.endsWith(File.separator))
this.dirName = dirname;
else
this.dirName = dirname.concat(File.separator);
}
this.fileName = filename;
}
public void setBaseGraGra(GraGra gragra) {
this.basis = gragra;
}
public void setBaseGraGra(GraGra gragra, String dirname, String filename) {
this.basis = gragra;
if ((dirname != null) && !dirname.equals("")) {
if (dirname.endsWith(File.separator))
this.dirName = dirname;
else
this.dirName = dirname.concat(File.separator);
}
this.fileName = filename;
}
public void setFrame(JFrame f) {
this.applFrame = f;
if (this.bar != null)
this.bar.setFrame(f);
}
public synchronized void addLoadEventListener(LoadEventListener l) {
if (!this.loadListeners.contains(l))
this.loadListeners.addElement(l);
}
public synchronized void removeLoadEventListener(LoadEventListener l) {
if (this.loadListeners.contains(l))
this.loadListeners.removeElement(l);
}
private void fireLoad(LoadEvent e) {
for (int i = 0; i < this.loadListeners.size(); i++) {
this.loadListeners.elementAt(i).loadEventOccurred(e);
}
}
/* create a progress bar */
private ProgressBar createProgressBar() {
ProgressBar pbar = new ProgressBar("Save");
// pbar.setFrame(this.applFrame);
pbar.setLabel("Saving Files ...");
pbar.setFinishText("Saving Files done");
pbar.setToolTipText("Save Status");
pbar.setFinishAppend(false);
return pbar;
}
private ProgressBar bar;
private JFrame applFrame;
private JFileChooser chooser;
private boolean canceled;
private ExtensionFileFilter filterXML;
private String addMsg;
private EdGraGra gra;
private GraGra basis;
private String dirName = "";
private String fileName = "";
}
// $Log: GraGraLoad.java,v $
// Revision 1.4 2010/09/23 08:22:04 olga
// tuning
//
// Revision 1.3 2010/01/28 19:33:01 olga
// reloadGraGra - bug fixed
//
// Revision 1.2 2009/05/12 10:36:59 olga
// CPA: bug fixed
// Applicability of Rule Seq. : bug fixed
//
// Revision 1.1 2008/10/29 09:04:11 olga
// new sub packages of the package agg.gui: typeeditor, editor, trafo, cpa, options, treeview, popupmenu, saveload
//
// Revision 1.15 2008/10/22 14:07:52 olga
// GUI, ARS and CPA tuning
//
// Revision 1.14 2008/10/20 07:42:32 olga
// added : set priority of transformation engine to improve synchronization
// of trafo and graph visualization
//
// Revision 1.13 2008/10/02 16:40:55 olga
// - Reset host graph - bug fixed ,
// - improved mouse event handling,
// - Applicability of rule sequences: save and load grammar : layout data will be saved
// and loaded, too
//
// Revision 1.12 2008/04/07 09:36:52 olga
// Code tuning: refactoring + profiling
// Extension: CPA - two new options added
//
// Revision 1.11 2007/09/24 09:42:35 olga
// AGG transformation engine tuning
//
// Revision 1.10 2007/09/10 13:05:22 olga
// In this update:
// - package xerces2.5.0 is not used anymore;
// - class com.objectspace.jgl.Pair is replaced by the agg own generic class agg.util.Pair;
// - bugs fixed in: usage of PACs in rules; match completion;
// usage of static method calls in attr. conditions
// - graph editing: added some new features
//
// Revision 1.9 2007/07/09 08:00:26 olga
// GUI tuning
//
// Revision 1.8 2007/06/13 08:32:53 olga
// Update: V161
//
// Revision 1.7 2007/04/19 14:50:03 olga
// Loading grammar - tuning
//
// Revision 1.6 2007/04/19 07:52:39 olga
// Tuning of: Undo/Redo, Graph layouter, loading grammars
//
// Revision 1.5 2007/03/28 10:00:44 olga
// - extensive changes of Node/Edge Type Editor,
// - first Undo implementation for graphs and Node/edge Type editing and
// transformation,
// - new / reimplemented options for layered transformation, for graph layouter
// - enable / disable for NACs, attr conditions, formula
// - GUI tuning
//
// Revision 1.4 2006/11/15 09:00:32 olga
// Transform with input parameter : bug fixed
//
// Revision 1.3 2006/05/29 07:59:42 olga
// GUI, undo delete - tuning.
//
// Revision 1.2 2005/12/21 14:49:05 olga
// GUI tuning
//
// Revision 1.1 2005/08/25 11:56:53 enrico
// *** empty log message ***
//
// Revision 1.2 2005/06/20 13:37:03 olga
// Up to now the version 1.2.8 will be prepared.
//
// Revision 1.1 2005/05/30 12:58:02 olga
// Version with Eclipse
//
// Revision 1.12 2005/05/11 12:34:55 olga
// Error fixed: Transform options after an imported graph has been integrated in
// the current grammar as the host graph
//
// Revision 1.11 2005/03/03 13:48:42 olga
// - Match with NACs and attr. conditions with mixed variables - error corrected
// - save/load class packages written by user
// - PACs : creating T-equivalents - improved
// - save/load matches of the rules (only one match of a rule)
// - more friendly graph/rule editor GUI
// - more syntactical checks in attr. editor
//
// Revision 1.10 2004/05/19 15:41:34 olga
// Comments
//
// Revision 1.9 2003/04/14 08:21:10 olga
// Bei Save und Load ist Serializable Format rausgenommen.
//
// Revision 1.8 2003/03/20 13:35:17 olga
// Delete TypeGraph neu
//
// Revision 1.7 2003/03/17 15:33:28 olga
// GUI Aenderungen
//
// Revision 1.6 2003/03/05 18:24:20 komm
// sorted/optimized import statements
//
// Revision 1.5 2002/11/25 15:04:39 olga
// Arbeit an dem TypeEditor.
//
// Revision 1.4 2002/11/11 09:43:15 olga
// Fehler im TypeEditor beseitigt
//
// Revision 1.3 2002/10/02 18:30:48 olga
// XXX
//
// Revision 1.2 2002/09/05 16:16:53 olga
// Arbeit an GUI
//
// Revision 1.1.1.1 2002/07/11 12:17:10 olga
// Imported sources
//
// Revision 1.13 2001/07/30 13:16:14 olga
// Kleine GUI Korrektur.
//
// Revision 1.12 2001/03/14 17:31:45 olga
// Korrektur wegen Layout und XML
//
// Revision 1.11 2001/03/12 13:35:13 olga
// *** empty log message ***
//
// Revision 1.10 2001/03/08 11:00:04 olga
// Das ist Stand nach der AGG GUI Reimplementierung
// und Parser Anbindung.
//
// Revision 1.9 2000/12/21 10:53:55 olga
// XML save / load Format fuer basis gragra eingefuegt.
//
// Revision 1.8 2000/12/21 09:49:03 olga
// In dieser Version wurden XML und GUI Reimplementierung zusammen gefuehrt.
//
// Revision 1.7 2000/12/07 14:23:37 matzmich
// XML-Kram
// Man beachte: xerces (/home/tfs/gragra/AGG/LIB/Xerces/xerces.jar) wird
// jetzt im CLASSPATH benoetigt.
//
// Revision 1.6.4.3 2000/12/04 13:26:02 olga
// Erste Stufe der GUI Reimplementierung abgeschlossen:
// - AGGAppl.java optimiert
// - Print eingebaut (GraGraPrint.java)
// - GraGraTreeView.java, GraGraEditor.java optimiert
// - Event eingebaut
// - GraTra umgestellt
//
// Revision 1.6.4.2 2000/11/09 17:54:42 olga
// Fehlerbeseitigt im TypeEditor und bei den Kanten.
//
// Revision 1.6.4.1 2000/11/06 09:32:46 olga
// Erste Version fuer neue GUI (Branch reimpl)
//
// Revision 1.6 2000/07/19 12:32:00 olga
// Load Dialog geaendert.
//
// Revision 1.5 2000/01/04 13:52:09 shultzke
// Progressbalken fuer das Laden und Speichern
// integriert.
//