de.danielluedecke.zettelkasten.tasks.SaveFileTask.java Source code

Java tutorial

Introduction

Here is the source code for de.danielluedecke.zettelkasten.tasks.SaveFileTask.java

Source

/*
 * Zettelkasten - nach Luhmann
 ** Copyright (C) 2001-2014 by Daniel Ldecke (http://www.danielluedecke.de)
 * 
 * Homepage: http://zettelkasten.danielluedecke.de
 * 
 * 
 * This program is free software; you can redistribute it and/or modify it under the terms of the
 * GNU General Public License as published by the Free Software Foundation; either version 3 of 
 * the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along with this program;
 * if not, see <http://www.gnu.org/licenses/>.
 * 
 * 
 * Dieses Programm ist freie Software. Sie knnen es unter den Bedingungen der GNU
 * General Public License, wie von der Free Software Foundation verffentlicht, weitergeben
 * und/oder modifizieren, entweder gem Version 3 der Lizenz oder (wenn Sie mchten)
 * jeder spteren Version.
 * 
 * Die Verffentlichung dieses Programms erfolgt in der Hoffnung, da es Ihnen von Nutzen sein 
 * wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder 
 * der VERWENDBARKEIT FR EINEN BESTIMMTEN ZWECK. Details finden Sie in der 
 * GNU General Public License.
 * 
 * Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm 
 * erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>.
 */
package de.danielluedecke.zettelkasten.tasks;

import de.danielluedecke.zettelkasten.database.BibTex;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.swing.JOptionPane;
import org.jdom2.output.XMLOutputter;
import de.danielluedecke.zettelkasten.database.Bookmarks;
import de.danielluedecke.zettelkasten.util.Constants;
import de.danielluedecke.zettelkasten.database.Daten;
import de.danielluedecke.zettelkasten.database.DesktopData;
import de.danielluedecke.zettelkasten.database.SearchRequests;
import de.danielluedecke.zettelkasten.database.Settings;
import de.danielluedecke.zettelkasten.database.Synonyms;
import java.io.ByteArrayOutputStream;

/**
 *
 * @author danielludecke
 */
public class SaveFileTask extends org.jdesktop.application.Task<Object, Void> {
    /**
     * Daten object, which contains the XML data of the Zettelkasten
     */
    private final Daten dataObj;
    /**
     * CBookmark object, which contains the XML data of the entries' bookmarks
     */
    private final Bookmarks bookmarkObj;
    /**
     * DesktopData object, which contains the XML data of the desktop
     */
    private final DesktopData desktopObj;
    private final Synonyms synonymsObj;
    private final BibTex bibtexObj;
    /**
     * Settings object, which contains the setting, for instance the file paths etc...
     */
    private final Settings settingsObj;
    /**
     * SearchRequests object, which contains the XML data of the searchrequests and -result
     * that are related with this data file
     */
    private final SearchRequests searchrequestsObj;

    private boolean saveOk = true;

    private final javax.swing.JDialog parentDialog;
    private final javax.swing.JLabel msgLabel;
    /**
     * get the strings for file descriptions from the resource map
     */
    private final org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application
            .getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class).getContext()
            .getResourceMap(SaveFileTask.class);

    SaveFileTask(org.jdesktop.application.Application app, javax.swing.JDialog parent, javax.swing.JLabel label,
            Daten d, Bookmarks bm, SearchRequests sr, DesktopData dk, Synonyms sy, Settings s, BibTex bib) {
        // Runs on the EDT.  Copy GUI state that
        // doInBackground() depends on from parameters
        // to ImportFileTask fields, here.
        super(app);
        dataObj = d;
        bibtexObj = bib;
        synonymsObj = sy;
        bookmarkObj = bm;
        searchrequestsObj = sr;
        desktopObj = dk;
        settingsObj = s;
        parentDialog = parent;
        msgLabel = label;
        // show status text
        msgLabel.setText(resourceMap.getString("msg1"));
    }

    @Override
    protected Object doInBackground() {
        // Your Task's code here.  This method runs
        // on a background thread, so don't reference
        // the Swing GUI from here.
        // prevent task from processing when the file path is incorrect
        File fp = settingsObj.getFilePath();
        // if no file exists, exit task
        if (null == fp) {
            // log error
            Constants.zknlogger.log(Level.WARNING, "Filepath is null!");
            saveOk = false;
            return null;
        }
        // check whether file is write protected
        if (!fp.canWrite()) {
            // ask whether write protection should be removed
            int option = JOptionPane.showConfirmDialog(null, resourceMap.getString("removeWriteProtectMsg"),
                    resourceMap.getString("removeWriteProtectTitle"), JOptionPane.YES_NO_CANCEL_OPTION,
                    JOptionPane.PLAIN_MESSAGE);
            // user cancelled dialog
            if (JOptionPane.CANCEL_OPTION == option || JOptionPane.CLOSED_OPTION == option
                    || JOptionPane.NO_OPTION == option) {
                saveOk = false;
                return null;
            }
            // check return result
            if (JOptionPane.YES_OPTION == option) {
                try {
                    // try to remove write protection
                    fp.setWritable(true);
                } catch (SecurityException ex) {
                    // log error-message
                    Constants.zknlogger.log(Level.SEVERE, ex.getLocalizedMessage());
                    Constants.zknlogger.log(Level.SEVERE,
                            "File is write-protected. Write protection could not be removed!");
                    saveOk = false;
                    return null;
                }
            }
        }
        try {
            // log file path
            Constants.zknlogger.log(Level.INFO, "Saving file to {0}", fp.toString());
            // open the outputstream
            ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(fp));
            // I first wanted to use a pretty output format, so advanced users who
            // extract the data file can better watch the xml-files. but somehow, this
            // lead to an error within the method "retrieveElement" in the class "Daten.java",
            // saying the a org.jdom.text cannot be converted to org.jdom.element?!?
            // XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());
            XMLOutputter out = new XMLOutputter();
            // show status text
            msgLabel.setText(resourceMap.getString("msg1"));
            // save metainformation
            zip.putNextEntry(new ZipEntry(Constants.metainfFileName));
            out.output(dataObj.getMetaInformationData(), zip);
            // save main data.
            zip.putNextEntry(new ZipEntry(Constants.zknFileName));
            out.output(dataObj.getZknData(), zip);
            // show status text
            msgLabel.setText(resourceMap.getString("msg2"));
            // save authors
            zip.putNextEntry(new ZipEntry(Constants.authorFileName));
            out.output(dataObj.getAuthorData(), zip);
            // show status text
            msgLabel.setText(resourceMap.getString("msg3"));
            // save keywords
            zip.putNextEntry(new ZipEntry(Constants.keywordFileName));
            out.output(dataObj.getKeywordData(), zip);
            // show status text
            msgLabel.setText(resourceMap.getString("msg4"));
            // save keywords
            zip.putNextEntry(new ZipEntry(Constants.bookmarksFileName));
            out.output(bookmarkObj.getBookmarkData(), zip);
            // show status text
            msgLabel.setText(resourceMap.getString("msg5"));
            // save keywords
            zip.putNextEntry(new ZipEntry(Constants.searchrequestsFileName));
            out.output(searchrequestsObj.getSearchData(), zip);
            // show status text
            msgLabel.setText(resourceMap.getString("msg6"));
            // save synonyms
            zip.putNextEntry(new ZipEntry(Constants.synonymsFileName));
            out.output(synonymsObj.getDocument(), zip);
            // save bibtex file
            zip.putNextEntry(new ZipEntry(Constants.bibTexFileName));
            ByteArrayOutputStream bout = bibtexObj.saveFile();
            bout.writeTo(zip);
            // show status text
            msgLabel.setText(resourceMap.getString("msg6"));
            // save desktops
            zip.putNextEntry(new ZipEntry(Constants.desktopFileName));
            out.output(desktopObj.getDesktopData(), zip);
            zip.putNextEntry(new ZipEntry(Constants.desktopModifiedEntriesFileName));
            out.output(desktopObj.getDesktopModifiedEntriesData(), zip);
            zip.putNextEntry(new ZipEntry(Constants.desktopNotesFileName));
            out.output(desktopObj.getDesktopNotesData(), zip);
            // close zip-stream
            zip.close();
            bout.close();
        } catch (IOException e) {
            // log error-message
            Constants.zknlogger.log(Level.SEVERE, e.getLocalizedMessage());
            // check whether file is write protected
            if (!fp.canWrite()) {
                // log error-message
                Constants.zknlogger.log(Level.SEVERE, "Save failed. The file is write-protected.");
                // show error message
                JOptionPane.showMessageDialog(null, resourceMap.getString("errorSavingWriteProtectedMsg"),
                        resourceMap.getString("errorSavingTitle"), JOptionPane.PLAIN_MESSAGE);
            } else {
                // show error message
                JOptionPane.showMessageDialog(null, resourceMap.getString("errorSavingMsg"),
                        resourceMap.getString("errorSavingTitle"), JOptionPane.PLAIN_MESSAGE);
            }
            // change error-indicator
            saveOk = false;
        } catch (SecurityException e) {
            // log error-message
            Constants.zknlogger.log(Level.SEVERE, e.getLocalizedMessage());
            // show error message
            JOptionPane.showMessageDialog(null, resourceMap.getString("errorNoAccessMsg"),
                    resourceMap.getString("errorNoAccessTitle"), JOptionPane.PLAIN_MESSAGE);
            // change error-indicator
            saveOk = false;
        }
        return null; // return your result
    }

    @Override
    protected void succeeded(Object result) {
        // Runs on the EDT.  Update the GUI based on
        // the result computed by doInBackground().
        // after saving, change modified state to false.
        dataObj.setModified(!saveOk);
        dataObj.setMetaModified(!saveOk);
        searchrequestsObj.setModified(!saveOk);
        desktopObj.setModified(!saveOk);
        bookmarkObj.setModified(!saveOk);
        synonymsObj.setModified(!saveOk);
        bibtexObj.setModified(!saveOk);
    }

    @Override
    protected void finished() {
        super.finished();
        // save error-flag
        dataObj.setSaveOk(saveOk);
        // and log info message
        if (saveOk)
            Constants.zknlogger.log(Level.INFO, "The data file has been successfully saved to {0}",
                    settingsObj.getFilePath().toString());
        // and close window
        parentDialog.dispose();
        parentDialog.setVisible(false);
    }
}