Пример #1
0
 public synchronized boolean setCiteKeyForEntry(String id, String key) {
   if (!_entries.containsKey(id)) return false; // Entry doesn't exist!
   BibtexEntry entry = getEntryById(id);
   String oldKey = entry.getCiteKey();
   if (key != null) entry.setField(BibtexFields.KEY_FIELD, key);
   else entry.clearField(BibtexFields.KEY_FIELD);
   return checkForDuplicateKeyAndAdd(oldKey, entry.getCiteKey(), false);
 }
Пример #2
0
  public synchronized BibtexEntry[] getEntriesByKey(String key) {

    ArrayList<BibtexEntry> entries = new ArrayList<BibtexEntry>();

    for (BibtexEntry entry : _entries.values()) {
      if (key.equals(entry.getCiteKey())) entries.add(entry);
    }

    return entries.toArray(new BibtexEntry[entries.size()]);
  }
Пример #3
0
  /** Returns the entry with the given bibtex key. */
  public synchronized BibtexEntry getEntryByKey(String key) {
    BibtexEntry back = null;

    int keyHash = key.hashCode(); // key hash for better performance

    Set<String> keySet = _entries.keySet();
    for (String entrieID : keySet) {
      BibtexEntry entry = getEntryById(entrieID);
      if ((entry != null) && (entry.getCiteKey() != null)) {
        String citeKey = entry.getCiteKey();
        if (citeKey != null) {
          if (keyHash == citeKey.hashCode()) {
            back = entry;
          }
        }
      }
    }
    return back;
  }
Пример #4
0
  /**
   * Removes the entry with the given string.
   *
   * <p>Returns null if not found.
   */
  public synchronized BibtexEntry removeEntry(String id) {
    BibtexEntry oldValue = _entries.remove(id);

    if (oldValue == null) return null;

    removeKeyFromSet(oldValue.getCiteKey());
    oldValue.removePropertyChangeListener(listener);
    fireDatabaseChanged(
        new DatabaseChangeEvent(this, DatabaseChangeEvent.ChangeType.REMOVED_ENTRY, oldValue));

    return oldValue;
  }
Пример #5
0
  /**
   * Inserts the entry, given that its ID is not already in use. use Util.createId(...) to make up a
   * unique ID for an entry.
   */
  public synchronized boolean insertEntry(BibtexEntry entry) throws KeyCollisionException {
    String id = entry.getId();
    if (getEntryById(id) != null) {
      throw new KeyCollisionException("ID is already in use, please choose another");
    }

    entry.addPropertyChangeListener(listener);

    _entries.put(id, entry);

    fireDatabaseChanged(
        new DatabaseChangeEvent(this, DatabaseChangeEvent.ChangeType.ADDED_ENTRY, entry));

    return checkForDuplicateKeyAndAdd(null, entry.getCiteKey(), false);
  }
Пример #6
0
  public void run() {

    if (!goOn) return;

    for (int i = 0; i < entries.length; i++) {

      BibtexEntry entry = entries[i];

      // Make a list of all PDFs linked from this entry:
      List<File> files = new ArrayList<File>();

      // First check the (legacy) "pdf" field:
      String pdf = entry.getField("pdf");
      String dir = panel.metaData().getFileDirectory("pdf");
      File f = Util.expandFilename(pdf, new String[] {dir, "."});
      if (f != null) files.add(f);

      // Then check the "file" field:
      dir = panel.metaData().getFileDirectory(GUIGlobals.FILE_FIELD);
      String field = entry.getField(GUIGlobals.FILE_FIELD);
      if (field != null) {
        FileListTableModel tm = new FileListTableModel();
        tm.setContent(field);
        for (int j = 0; j < tm.getRowCount(); j++) {
          FileListEntry flEntry = tm.getEntry(j);
          if ((flEntry.getType() != null)
              && (flEntry.getType().getName().toLowerCase().equals("pdf"))) {
            f = Util.expandFilename(flEntry.getLink(), new String[] {dir, "."});
            if (f != null) files.add(f);
          }
        }
      }

      optDiag.progressArea.append(entry.getCiteKey() + "\n");

      if (files.size() == 0) {
        skipped++;
        optDiag.progressArea.append("  " + Globals.lang("Skipped - No PDF linked") + ".\n");
      } else
        for (File file : files) {
          if (!file.exists()) {
            skipped++;
            optDiag.progressArea.append(
                "  " + Globals.lang("Skipped - PDF does not exist") + ":\n");
            optDiag.progressArea.append("    " + file.getPath() + "\n");

          } else {
            try {
              XMPUtil.writeXMP(file, entry, database);
              optDiag.progressArea.append("  " + Globals.lang("Ok") + ".\n");
              entriesChanged++;
            } catch (Exception e) {
              optDiag.progressArea.append(
                  "  " + Globals.lang("Error while writing") + " '" + file.getPath() + "':\n");
              optDiag.progressArea.append("    " + e.getLocalizedMessage() + "\n");
              errors++;
            }
          }
        }

      if (optDiag.canceled) {
        optDiag.progressArea.append("\n" + Globals.lang("Operation canceled.\n"));
        break;
      }
    }
    optDiag.progressArea.append(
        "\n"
            + Globals.lang(
                "Finished writing XMP for %0 file (%1 skipped, %2 errors).",
                String.valueOf(entriesChanged), String.valueOf(skipped), String.valueOf(errors)));
    optDiag.done();
  }
Пример #7
0
 public void update() {
   // pdfURL = new URL("http://geog-www.sbs.ohio-state.edu/faculty/bmark/abbott_etal_ppp03.pdf");
   if (result.url != null) {
     // System.out.println("PDF URL: "+result.url);
     String bibtexKey = entry.getCiteKey();
     String fileDir = basePanel.metaData().getFileDirectory(GUIGlobals.FILE_FIELD);
     if (fileDir == null) {
       // TODO: error message if file dir not defined
       // JOptionPane.showMessageDialog(frame, Globals.lang);
       return;
     }
     DownloadExternalFile def =
         new DownloadExternalFile(basePanel.frame(), basePanel.metaData(), bibtexKey);
     try {
       def.download(
           result.url,
           new DownloadExternalFile.DownloadCallback() {
             public void downloadComplete(FileListEntry file) {
               System.out.println("finished");
               FileListTableModel tm = new FileListTableModel();
               String oldValue = entry.getField(GUIGlobals.FILE_FIELD);
               tm.setContent(oldValue);
               tm.addEntry(tm.getRowCount(), file);
               String newValue = tm.getStringRepresentation();
               UndoableFieldChange edit =
                   new UndoableFieldChange(entry, GUIGlobals.FILE_FIELD, oldValue, newValue);
               entry.setField(GUIGlobals.FILE_FIELD, newValue);
               basePanel.undoManager.addEdit(edit);
               basePanel.markBaseChanged();
             }
           });
     } catch (IOException e) {
       e.printStackTrace();
     }
     basePanel.output(Globals.lang("Finished downloading full text document"));
   } else {
     String message = null;
     switch (result.status) {
       case FindFullText.UNKNOWN_DOMAIN:
         message =
             Globals.lang(
                 "Unable to find full text article. No search algorithm "
                     + "defined for the '%0' web site.",
                 result.host);
         break;
       case FindFullText.WRONG_MIME_TYPE:
         message =
             Globals.lang(
                 "Found pdf link, but received the wrong MIME type. "
                     + "This could indicate that you don't have access to the fulltext article.");
         break;
       case FindFullText.LINK_NOT_FOUND:
         message = Globals.lang("Unable to find full text document in the linked web page.");
         break;
       case FindFullText.IO_EXCEPTION:
         message = Globals.lang("Connection error when trying to find full text document.");
         break;
       case FindFullText.NO_URLS_DEFINED:
         message = Globals.lang("This entry provides no URL or DOI links.");
         break;
     }
     basePanel.output(Globals.lang("Full text article download failed"));
     JOptionPane.showMessageDialog(
         basePanel.frame(),
         message,
         Globals.lang("Full text article download failed"),
         JOptionPane.ERROR_MESSAGE);
   }
 }