--- /dev/null
+/*
+ * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package com.sun.mail.remote;
+
+import java.io.*;
+import javax.mail.*;
+import com.sun.mail.mbox.*;
+
+/**
+ * A wrapper around a local <code>MboxStore</code> that fetches data
+ * from the Inbox in a remote store and adds it to our local Inbox.
+ */
+public abstract class RemoteStore extends MboxStore {
+
+ protected Store remoteStore;
+ protected Folder remoteInbox;
+ protected Folder inbox;
+ protected String host, user, password;
+ protected int port;
+ protected long lastUpdate = 0;
+
+ public RemoteStore(Session session, URLName url) {
+ super(session, url);
+ remoteStore = getRemoteStore(session, url);
+ }
+
+ /**
+ * Subclasses override this method to return the appropriate
+ * <code>Store</code> object. This method will be called by
+ * the <code>RemoteStore</code> constructor.
+ */
+ protected abstract Store getRemoteStore(Session session, URLName url);
+
+ /**
+ * Connect to the store.
+ */
+ public void connect(String host, int port, String user, String password)
+ throws MessagingException {
+ this.host = host;
+ this.port = port;
+ this.user = user;
+ this.password = password;
+ updateInbox();
+ }
+
+ /**
+ * Fetch any new mail in the remote INBOX and add it to the local INBOX.
+ */
+ protected void updateInbox() throws MessagingException {
+ // is it time to do an update yet?
+ // XXX - polling frequency, rules, etc. should be in properties
+ if (System.currentTimeMillis() < lastUpdate + (5 * 1000))
+ return;
+ try {
+ /*
+ * Connect to the remote store, using the saved
+ * authentication information.
+ */
+ remoteStore.connect(host, port, user, password);
+
+ /*
+ * If this store isn't connected yet, do it now, because
+ * it needs to be connected to get the INBOX folder.
+ */
+ if (!isConnected())
+ super.connect(host, port, user, password);
+ if (remoteInbox == null)
+ remoteInbox = remoteStore.getFolder("INBOX");
+ if (inbox == null)
+ inbox = getFolder("INBOX");
+ remoteInbox.open(Folder.READ_WRITE);
+ Message[] msgs = remoteInbox.getMessages();
+ inbox.appendMessages(msgs);
+ remoteInbox.setFlags(msgs, new Flags(Flags.Flag.DELETED), true);
+ remoteInbox.close(true);
+ remoteStore.close();
+ } catch (MessagingException ex) {
+ try {
+ if (remoteInbox != null && remoteInbox.isOpen())
+ remoteInbox.close(false);
+ } finally {
+ if (remoteStore != null && remoteStore.isConnected())
+ remoteStore.close();
+ }
+ throw ex;
+ }
+ }
+
+ public Folder getDefaultFolder() throws MessagingException {
+ checkConnected();
+
+ return new RemoteDefaultFolder(this, null);
+ }
+
+ public Folder getFolder(String name) throws MessagingException {
+ checkConnected();
+
+ if (name.equalsIgnoreCase("INBOX"))
+ return new RemoteInbox(this, name);
+ else
+ return super.getFolder(name);
+ }
+
+ public Folder getFolder(URLName url) throws MessagingException {
+ checkConnected();
+ return getFolder(url.getFile());
+ }
+
+ private void checkConnected() throws MessagingException {
+ if (!isConnected())
+ throw new MessagingException("Not connected");
+ }
+}