processing.app.tools.Archiver.java Source code

Java tutorial

Introduction

Here is the source code for processing.app.tools.Archiver.java

Source

/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */

/*
  Archiver - plugin tool for archiving sketches
  Part of the Processing project - http://processing.org
    
  Copyright (c) 2004-06 Ben Fry and Casey Reas
    
  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 2 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, write to the Free Software Foundation,
  Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

package processing.app.tools;

import org.apache.commons.compress.utils.IOUtils;
import processing.app.Base;
import processing.app.Editor;
import processing.app.SketchController;

import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import static processing.app.I18n.tr;

public class Archiver implements Tool {
    Editor editor;

    // someday these will be settable
    boolean useDate;
    int digits = 3;

    NumberFormat numberFormat;
    SimpleDateFormat dateFormat;

    public String getMenuTitle() {
        return tr("Archive Sketch");
    }

    public void init(Editor editor) {
        this.editor = editor;

        numberFormat = NumberFormat.getInstance();
        numberFormat.setGroupingUsed(false); // no commas
        numberFormat.setMinimumIntegerDigits(digits);

        dateFormat = new SimpleDateFormat("yyMMdd");
    }

    public void run() {
        SketchController sketch = editor.getSketchController();

        // first save the sketch so that things don't archive strangely
        boolean success = false;
        try {
            success = sketch.save();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (!success) {
            Base.showWarning(tr("Couldn't archive sketch"),
                    tr("Archiving the sketch has been canceled because\nthe sketch couldn't save properly."), null);
            return;
        }

        File location = sketch.getSketch().getFolder();
        String name = location.getName();
        File parent = new File(location.getParent());

        //System.out.println("loc " + location);
        //System.out.println("par " + parent);

        File newbie = null;
        String namely = null;
        int index = 0;
        do {
            // only use the date if the sketch name isn't the default name
            useDate = !name.startsWith("sketch_");

            if (useDate) {
                String purty = dateFormat.format(new Date());
                String stamp = purty + ((char) ('a' + index));
                namely = name + "-" + stamp;
                newbie = new File(parent, namely + ".zip");

            } else {
                String diggie = numberFormat.format(index + 1);
                namely = name + "-" + diggie;
                newbie = new File(parent, namely + ".zip");
            }
            index++;
        } while (newbie.exists());

        // open up a prompt for where to save this fella
        FileDialog fd = new FileDialog(editor, tr("Archive sketch as:"), FileDialog.SAVE);
        fd.setDirectory(parent.getAbsolutePath());
        fd.setFile(newbie.getName());
        fd.setVisible(true);

        String directory = fd.getDirectory();
        String filename = fd.getFile();

        // only write the file if not canceled
        if (filename != null) {
            newbie = new File(directory, filename);

            ZipOutputStream zos = null;
            try {
                //System.out.println(newbie);
                zos = new ZipOutputStream(new FileOutputStream(newbie));

                // recursively fill the zip file
                buildZip(location, name, zos);

                // close up the jar file
                zos.flush();
                editor.statusNotice("Created archive " + newbie.getName() + ".");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeQuietly(zos);
            }
        } else {
            editor.statusNotice(tr("Archive sketch canceled."));
        }
    }

    public void buildZip(File dir, String sofar, ZipOutputStream zos) throws IOException {
        String files[] = dir.list();
        if (files == null) {
            throw new IOException("Unable to list files from " + dir);
        }
        for (int i = 0; i < files.length; i++) {
            if (files[i].equals(".") || files[i].equals(".."))
                continue;

            File sub = new File(dir, files[i]);
            String nowfar = (sofar == null) ? files[i] : (sofar + "/" + files[i]);

            if (sub.isDirectory()) {
                // directories are empty entries and have / at the end
                ZipEntry entry = new ZipEntry(nowfar + "/");
                //System.out.println(entry);
                zos.putNextEntry(entry);
                zos.closeEntry();
                buildZip(sub, nowfar, zos);

            } else {
                ZipEntry entry = new ZipEntry(nowfar);
                entry.setTime(sub.lastModified());
                zos.putNextEntry(entry);
                zos.write(Base.loadBytesRaw(sub));
                zos.closeEntry();
            }
        }
    }
}

/*
int index = 0;
SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd");
String purty = formatter.format(new Date());
do {
  newbieName = "sketch_" + purty + ((char) ('a' + index));
  newbieDir = new File(newbieParentDir, newbieName);
  index++;
} while (newbieDir.exists());
*/