Introduce mbox support
[gpl/argeo-slc.git] / ext / javax.mail.mbox / src / com / sun / mail / remote / RemoteStore.java
diff --git a/ext/javax.mail.mbox/src/com/sun/mail/remote/RemoteStore.java b/ext/javax.mail.mbox/src/com/sun/mail/remote/RemoteStore.java
new file mode 100644 (file)
index 0000000..faf9dd4
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * 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");
+    }
+}