populate.java Source code

Java tutorial

Introduction

Here is the source code for populate.java

Source

/*
 * @(#)populate.java  1.12 06/02/28
 *
 * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * - Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * 
 * - Redistribution in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 * 
 * Neither the name of Sun Microsystems, Inc. or the names of contributors
 * may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 * 
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
 * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES
 * SUFFERED BY LICENSEE AS A RESULT OF  OR RELATING TO USE, MODIFICATION
 * OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
 * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
 * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
 * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
 * ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 * 
 * You acknowledge that Software is not designed, licensed or intended
 * for use in the design, construction, operation or maintenance of any
 * nuclear facility.
 */

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;
import javax.mail.internet.MimeMessage;

/*
 * Copy folder hierarchies between different Stores. This is a useful utility to
 * populate new (and possibly empty) mail stores. Specify both the source and
 * destination folders as URLs.
 * 
 * @author John Mani @author Bill Shannon
 */

public class populate {

    static boolean force = false;

    static boolean skipSpecial = false;

    static boolean clear = false;

    static boolean dontPreserveFlags = false;

    public static void main(String argv[]) {
        String srcURL = null;
        String dstURL = null;
        boolean debug = false;

        int optind;

        for (optind = 0; optind < argv.length; optind++) {
            if (argv[optind].equals("-s")) {
                srcURL = argv[++optind];
            } else if (argv[optind].equals("-d")) {
                dstURL = argv[++optind];
            } else if (argv[optind].equals("-D")) {
                debug = true;
            } else if (argv[optind].equals("-f")) {
                force = true;
            } else if (argv[optind].equals("-S")) {
                skipSpecial = true;
            } else if (argv[optind].equals("-c")) {
                clear = true;
            } else if (argv[optind].equals("-P")) {
                dontPreserveFlags = true;
            } else if (argv[optind].equals("--")) {
                optind++;
                break;
            } else if (argv[optind].startsWith("-")) {
                printUsage();
                System.exit(1);
            } else {
                break;
            }
        }

        try {

            if (srcURL == null || dstURL == null) {
                printUsage();
                System.exit(1);
            }

            Session session = Session.getInstance(System.getProperties(), null);
            session.setDebug(debug);

            // Get source folder
            URLName srcURLName = new URLName(srcURL);
            Folder srcFolder;
            // Check if the source URL has a folder specified. If
            // not, we use the default folder
            if (srcURLName.getFile() == null) {
                Store s = session.getStore(srcURLName);
                s.connect();
                srcFolder = s.getDefaultFolder();
            } else {
                srcFolder = session.getFolder(new URLName(srcURL));
                if (!srcFolder.exists()) {
                    System.out.println("source folder does not exist");
                    srcFolder.getStore().close();
                    System.exit(1);
                }
            }

            // Set up destination folder
            URLName dstURLName = new URLName(dstURL);
            Folder dstFolder;
            // Check if the destination URL has a folder specified. If
            // not, we use the source folder name
            if (dstURLName.getFile() == null) {
                Store s = session.getStore(dstURLName);
                s.connect();
                dstFolder = s.getFolder(srcFolder.getName());
            } else
                dstFolder = session.getFolder(dstURLName);

            if (clear && dstFolder.exists()) {
                if (!dstFolder.delete(true)) {
                    System.out.println("couldn't delete " + dstFolder.getFullName());
                    return;
                }
            }
            copy(srcFolder, dstFolder);

            // Close the respective stores.
            srcFolder.getStore().close();
            dstFolder.getStore().close();

        } catch (MessagingException mex) {
            System.out.println(mex.getMessage());
            mex.printStackTrace();
        }
    }

    private static void copy(Folder src, Folder dst) throws MessagingException {
        System.out.println("Populating " + dst.getFullName());

        Folder ddst = dst;
        Folder[] srcFolders = null;
        if ((src.getType() & Folder.HOLDS_FOLDERS) != 0)
            srcFolders = src.list();
        boolean srcHasChildren = srcFolders != null && srcFolders.length > 0;

        if (!dst.exists()) {
            // Create it.
            boolean dstHoldsOnlyFolders = false;
            try {
                if (!dst.create(src.getType())) {
                    System.out.println("couldn't create " + dst.getFullName());
                    return;
                }
            } catch (MessagingException mex) {
                // might not be able to create a folder that holds both
                if (src.getType() != (Folder.HOLDS_MESSAGES | Folder.HOLDS_FOLDERS))
                    throw mex;
                if (!dst.create(srcHasChildren ? Folder.HOLDS_FOLDERS : Folder.HOLDS_MESSAGES)) {
                    System.out.println("couldn't create " + dst.getFullName());
                    return;
                }
                dstHoldsOnlyFolders = srcHasChildren;
            }

            // Copy over any messges from src to dst
            if ((src.getType() & Folder.HOLDS_MESSAGES) != 0) {
                src.open(Folder.READ_ONLY);
                if (dstHoldsOnlyFolders) {
                    if (src.getMessageCount() > 0) {
                        System.out.println("Unable to copy messages from " + src.getFullName() + " to "
                                + dst.getFullName() + " because destination holds only folders");
                    }
                } else
                    copyMessages(src, dst);
                src.close(false);
            }
        } else {
            System.out.println(dst.getFullName() + " already exists");
            // Copy over any messges from src to dst
            if (force && (src.getType() & Folder.HOLDS_MESSAGES) != 0) {
                src.open(Folder.READ_ONLY);
                copyMessages(src, dst);
                src.close(false);
            }
        }

        // Copy over subfolders
        if (srcHasChildren) {
            for (int i = 0; i < srcFolders.length; i++) {
                // skip special directories?
                if (skipSpecial) {
                    if (srcFolders[i].getName().equals("SCCS") || srcFolders[i].getName().equals("Drafts")
                            || srcFolders[i].getName().equals("Trash")
                            || srcFolders[i].getName().equals("Shared Folders"))
                        continue;
                }
                copy(srcFolders[i], dst.getFolder(srcFolders[i].getName()));
            }
        }
    }

    /**
     * Copy message from src to dst. If dontPreserveFlags is set we first copy the
     * messages to memory, clear all the flags, and then copy to the destination.
     */
    private static void copyMessages(Folder src, Folder dst) throws MessagingException {
        Message[] msgs = src.getMessages();
        if (dontPreserveFlags) {
            for (int i = 0; i < msgs.length; i++) {
                MimeMessage m = new MimeMessage((MimeMessage) msgs[i]);
                m.setFlags(m.getFlags(), false);
                msgs[i] = m;
            }
        }
        src.copyMessages(msgs, dst);
    }

    private static void printUsage() {
        System.out.println("populate [-D] [-f] [-S] [-c] " + "-s source_url -d dest_url");
        System.out.println("URLs are of the form: " + "protocol://username:password@hostname/foldername");
        System.out.println("The destination URL does not need a foldername,"
                + " in which case, the source foldername is used");
    }
}