/* * Created on Jun 29, 2004 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package net.sf.jabref.imports; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.JDialog; import javax.swing.JOptionPane; import net.sf.jabref.BasePanel; import net.sf.jabref.BibtexEntry; import net.sf.jabref.undo.NamedCompound; import net.sf.jabref.undo.UndoableFieldChange; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @author mspiegel * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class CiteSeerUndoHandler extends DefaultHandler { NamedCompound citeseerNamedCompound = null; BibtexEntry bibEntry = null; String nextField = null; boolean nextAssign = false; BasePanel panel = null; BooleanAssign overwriteAll; BooleanAssign overwriteNone; BooleanAssign recordFound; String newAuthors = null; int citeseerCitationCount = 0; /* * Woe unto those who call this function from anywhere but * makeOverwriteChoice(). You will seriously f*&k things up. */ private boolean overwriteDialog(String oldValue, String newValue, String fieldName) { boolean retval = false; Object[] possibilities = { "Yes", "Yes to All", "No", "No to All" }; final JOptionPane optionPane = new JOptionPane( "Do you want to overwrite the value '" + oldValue + "' \nwith the value '" + newValue + "' \nfor the " + fieldName + " field?", JOptionPane.QUESTION_MESSAGE, JOptionPane.DEFAULT_OPTION, null, possibilities, "No"); final JDialog dialog = new JDialog(panel.frame().getFrame(), "Overwrite Value", true); dialog.setContentPane(optionPane); dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); optionPane.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (dialog.isVisible() && (e.getSource() == optionPane) && (prop.equals(JOptionPane.VALUE_PROPERTY))) { //If you were going to check something //before closing the window, you'd do //it here. dialog.setVisible(false); } } }); dialog.pack(); dialog.setVisible(true); String userChoice = (String) optionPane.getValue(); if (userChoice.equals("Yes to All")) { overwriteAll.setValue(true); retval = true; } else if (userChoice.equals("Yes")) { retval = true; } else if (userChoice.equals("No to All")) { overwriteNone.setValue(true); } return (retval); } public CiteSeerUndoHandler(NamedCompound newCompound, BibtexEntry be, BasePanel basePanel, BooleanAssign assignment, BooleanAssign overwriteAll, BooleanAssign overwriteNone) { citeseerNamedCompound = newCompound; bibEntry = be; panel = basePanel; recordFound = assignment; recordFound.setValue(false); this.overwriteAll = overwriteAll; this.overwriteNone = overwriteNone; } public CiteSeerUndoHandler(NamedCompound newCompound, BibtexEntry be, BasePanel basePanel, BooleanAssign assignment) { this(newCompound, be, basePanel, assignment, new BooleanAssign(false), new BooleanAssign(false)); } public void characters(char[] ch, int start, int length) { if (nextAssign == true) { String target = new String(ch, start, length); if (nextField.equals("title")) { if (makeOverwriteChoice(bibEntry.getField(nextField), target, nextField)) { UndoableFieldChange fieldChange = new UndoableFieldChange( bibEntry, nextField, bibEntry.getField(nextField), target); citeseerNamedCompound.addEdit(fieldChange); bibEntry.setField(nextField, target); } } else if (nextField.equals("year")) { if (makeOverwriteChoice(bibEntry.getField(nextField), String.valueOf(target.substring(0, 4)), nextField)) { UndoableFieldChange fieldChange = new UndoableFieldChange( bibEntry, nextField, bibEntry.getField(nextField), String.valueOf(target.substring(0, 4))); citeseerNamedCompound.addEdit(fieldChange); bibEntry.setField(nextField, String.valueOf(target .substring(0, 4))); } } else if (nextField.equals("citeseerurl")) { if (makeOverwriteChoice(bibEntry.getField(nextField), target, nextField)) { UndoableFieldChange fieldChange = new UndoableFieldChange( bibEntry, nextField, bibEntry.getField(nextField), target); citeseerNamedCompound.addEdit(fieldChange); bibEntry.setField(nextField, target); } } nextAssign = false; } } /** * @param oldValue * @param newValue * @param fieldName * @return overwrite */ private boolean makeOverwriteChoice(String oldValue, String newValue, String fieldName) { boolean overwrite; if ((oldValue == null) || (oldValue.equals(""))) overwrite = true; else if (oldValue.equals(newValue)) overwrite = false; else if (overwriteAll.getValue() == true) overwrite = true; else if (overwriteNone.getValue() == true) overwrite = false; else overwrite = overwriteDialog(oldValue, newValue, fieldName); if (overwrite) recordFound.setValue(true); return overwrite; } public void startElement(String name, String localName, String qName, Attributes attrs) throws SAXException { if (qName.equals("oai_citeseer:relation")) { for (int i = 0; i < attrs.getLength(); i++) { String attrName = attrs.getQName(i); String attrValue = attrs.getValue(i); if (attrName.equals("type") && attrValue.equals("Is Referenced By")) { citeseerCitationCount++; } } } else if (qName.equals("oai_citeseer:author")) { addAuthor(attrs.getValue("name")); } else if (qName.equals("dc:title")) { nextField = "title"; nextAssign = true; } else if (qName.equals("dc:date")) { nextField = "year"; nextAssign = true; } else if (qName.equals("dc:identifier")) { nextField = "citeseerurl"; nextAssign = true; } } public void endDocument() { if (newAuthors != null) { if (makeOverwriteChoice(bibEntry.getField("author"), newAuthors, "author")) { UndoableFieldChange fieldChange = new UndoableFieldChange( bibEntry, "author", bibEntry.getField("author"), newAuthors); citeseerNamedCompound.addEdit(fieldChange); bibEntry.setField("author", newAuthors); } } String newCount = new Integer(citeseerCitationCount).toString(); UndoableFieldChange fieldChange = new UndoableFieldChange( bibEntry, "citeseercitationcount", bibEntry.getField("citeseercitationcount"), newCount); citeseerNamedCompound.addEdit(fieldChange); bibEntry.setField("citeseercitationcount", newCount); } /** * @param string */ private void addAuthor(String newAuthor) { if (newAuthors == null) { newAuthors = newAuthor; } else { newAuthors = newAuthors + " and " + newAuthor; } } }