You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oodt.apache.org by bf...@apache.org on 2011/05/28 01:47:43 UTC

svn commit: r1128535 - in /oodt/branches/protocol/protocol-imaps: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/oodt/ src/main/java/org/apache/oodt/cas/ src/main/java/org/apache/oodt/cas/protocol...

Author: bfoster
Date: Fri May 27 23:47:42 2011
New Revision: 1128535

URL: http://svn.apache.org/viewvc?rev=1128535&view=rev
Log:

- imaps protocol initial

-------------
OODT-194

Added:
    oodt/branches/protocol/protocol-imaps/
    oodt/branches/protocol/protocol-imaps/pom.xml   (with props)
    oodt/branches/protocol/protocol-imaps/src/
    oodt/branches/protocol/protocol-imaps/src/main/
    oodt/branches/protocol/protocol-imaps/src/main/java/
    oodt/branches/protocol/protocol-imaps/src/main/java/org/
    oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/
    oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/
    oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/
    oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/
    oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/
    oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClient.java   (with props)
    oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClientFactory.java   (with props)
    oodt/branches/protocol/protocol-imaps/src/main/test/

Added: oodt/branches/protocol/protocol-imaps/pom.xml
URL: http://svn.apache.org/viewvc/oodt/branches/protocol/protocol-imaps/pom.xml?rev=1128535&view=auto
==============================================================================
--- oodt/branches/protocol/protocol-imaps/pom.xml (added)
+++ oodt/branches/protocol/protocol-imaps/pom.xml Fri May 27 23:47:42 2011
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
+	license agreements. See the NOTICE file distributed with this work for additional 
+	information regarding copyright ownership. The ASF licenses this file to 
+	You under the Apache License, Version 2.0 (the "License"); you may not use 
+	this file except in compliance with the License. You may obtain a copy of 
+	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
+	by applicable law or agreed to in writing, software distributed under the 
+	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
+	OF ANY KIND, either express or implied. See the License for the specific 
+	language governing permissions and limitations under the License. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.oodt</groupId>
+		<artifactId>oodt-core</artifactId>
+		<version>0.3-SNAPSHOT</version>
+		<relativePath>../core/pom.xml</relativePath>
+	</parent>
+	<artifactId>cas-protocol-imaps</artifactId>
+	<name>CAS Protocol IMAPS Implementation</name>
+	<profiles>
+		<profile>
+			<id>audit</id>
+			<activation>
+				<activeByDefault>false</activeByDefault>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>rat-maven-plugin</artifactId>
+						<configuration>
+							<excludes>
+								<exclude>**/resources/examples/**/*</exclude>
+							</excludes>
+						</configuration>
+						<executions>
+							<execution>
+								<phase>verify</phase>
+								<goals>
+									<goal>check</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.2-beta-2</version>
+				<configuration>
+					<descriptors>
+						<descriptor>src/main/assembly/assembly.xml</descriptor>
+					</descriptors>
+				</configuration>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.oodt</groupId>
+			<artifactId>cas-protocol-api</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.geronimo.javamail</groupId>
+			<artifactId>geronimo-javamail_1.4_mail</artifactId>
+			<version>1.8.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.geronimo.specs</groupId>
+			<artifactId>geronimo-activation_1.1_spec</artifactId>
+			<version>1.1</version>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>3.8.2</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+</project>

Propchange: oodt/branches/protocol/protocol-imaps/pom.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClient.java
URL: http://svn.apache.org/viewvc/oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClient.java?rev=1128535&view=auto
==============================================================================
--- oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClient.java (added)
+++ oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClient.java Fri May 27 23:47:42 2011
@@ -0,0 +1,377 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.oodt.cas.pushpull.protocol.imaps;
+
+//JDK imports
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.List;
+
+//Javamail imports
+import javax.mail.Address;
+import javax.mail.Flags;
+import javax.mail.Folder;
+import javax.mail.Header;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.Part;
+import javax.mail.Session;
+import javax.mail.Store;
+import org.xml.sax.SAXException;
+
+//APACHE imports
+import org.apache.commons.codec.DecoderException;
+
+//TIKA imports
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.html.HtmlParser;
+import org.apache.tika.sax.BodyContentHandler;
+import org.apache.tika.sax.TextContentHandler;
+
+//OODT imports
+import org.apache.oodt.cas.pushpull.exceptions.ProtocolException;
+import org.apache.oodt.cas.pushpull.protocol.Protocol;
+import org.apache.oodt.cas.pushpull.protocol.ProtocolFile;
+import org.apache.oodt.cas.pushpull.protocol.ProtocolPath;
+
+/**
+ * 
+ * @author bfoster
+ * @version $Revision$
+ * 
+ */
+public class ImapsClient extends Protocol {
+
+  static Store store;
+
+  static Folder currentFolder;
+
+  static int port = 993;
+
+  static Session session;
+
+  static int openCalls = 0;
+
+  static int connectCalls = 0;
+
+  // static LinkedList<ProtocolFile> currentFilesForCurrentFolder;
+  // static boolean changedDir = true;
+
+  public ImapsClient() {
+    super("imaps");
+  }
+
+  @Override
+  public synchronized void abortCurFileTransfer() throws ProtocolException {
+    // do nothing
+  }
+
+  @Override
+  public synchronized void chDir(ProtocolPath path) throws ProtocolException {
+    try {
+      String remotePath = path.getPathString();
+      // System.out.println("cd to " + remotePath);
+      if (remotePath.startsWith("/"))
+        remotePath = remotePath.substring(1);
+      if (remotePath.trim().equals(""))
+        currentFolder = store.getDefaultFolder();
+      else {
+        currentFolder = store.getFolder(remotePath);
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+    // changedDir = true;
+  }
+
+  @Override
+  public synchronized void cdToRoot() throws ProtocolException {
+    try {
+      chDir(new ProtocolPath("/", true));
+    } catch (Exception e) {
+      throw new ProtocolException("Failed to cd to root : " + e.getMessage());
+    }
+  }
+
+  @Override
+  public synchronized void connect(String host, String username, String password)
+      throws ProtocolException {
+    try {
+      if (store == null) {
+        store = (session = Session.getInstance(System.getProperties()))
+            .getStore("imaps");
+        store.connect(host, port, username, password);
+        currentFolder = store.getDefaultFolder();
+      }
+      this.incrementConnections();
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw new ProtocolException("Failed to connected to IMAPS server " + host
+          + " with username " + username + " : " + e.getMessage());
+    }
+  }
+
+  @Override
+  public synchronized void disconnectFromServer() throws ProtocolException {
+    decrementConnections();
+    if (connectCalls <= 0) {
+      // changedDir = true;
+      try {
+        if (!currentFolder.isOpen()) {
+          try {
+            currentFolder.open(Folder.READ_WRITE);
+          } catch (Exception e) {
+            try {
+              currentFolder.open(Folder.READ_ONLY);
+            } catch (Exception e2) {
+            }
+          }
+        }
+        currentFolder.close(true);
+        store.close();
+      } catch (Exception e) {
+        e.printStackTrace();
+      } finally {
+        store = null;
+      }
+    }
+  }
+
+  private synchronized void incrementConnections() {
+    connectCalls++;
+  }
+
+  private synchronized void decrementConnections() {
+    if (connectCalls > 0)
+      connectCalls--;
+  }
+
+  @Override
+  public synchronized void getFile(ProtocolFile file, File toLocalFile)
+      throws ProtocolException {
+    try {
+      openFolder(currentFolder);
+      Message[] messages = currentFolder.getMessages();
+      for (Message message : messages) {
+        if (this.getMessageName(message).equals(file.getName())) {
+          writeMessageToLocalFile(message, toLocalFile);
+          // message.setFlag(Flags.Flag.DELETED, true);
+          break;
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw new ProtocolException("Failed to download " + file + " to "
+          + toLocalFile + " : " + e.getMessage());
+    } finally {
+      try {
+        closeFolder(currentFolder);
+      } catch (Exception e) {
+      }
+    }
+  }
+
+  private void writeMessageToLocalFile(Message message, File toLocalFile)
+      throws MessagingException, IOException, DecoderException, SAXException,
+      TikaException {
+    PrintStream ps = new PrintStream(new FileOutputStream(toLocalFile));
+
+    ps.print("From:");
+    Address[] senders = message.getFrom();
+    for (Address address : senders)
+      ps.print(" " + address.toString());
+
+    ps.print("\nTo:");
+    Address[] recipients = message.getAllRecipients();
+    for (Address address : recipients)
+      ps.print(" " + address.toString());
+
+    ps.println("\nSubject: " + message.getSubject());
+
+    ps.println("----- ~ Message ~ -----");
+    String content = this.getContentFromHTML(message);
+    if (content.equals(""))
+      content = this.getContentFromPlainText(message);
+    ps.println(content);
+
+    ps.close();
+  }
+
+  @Override
+  public synchronized boolean isConnected() throws ProtocolException {
+    return store.isConnected();
+  }
+
+  @Override
+  public List<ProtocolFile> listFiles() throws ProtocolException {
+    // if (changedDir) {
+    // System.out.println("Refreshed LS");
+    // currentFilesForCurrentFolder = new LinkedList<ProtocolFile>();
+    LinkedList<ProtocolFile> currentFilesForCurrentFolder = new LinkedList<ProtocolFile>();
+    try {
+      openFolder(currentFolder);
+      if (!currentFolder.getFullName().equals(
+          store.getDefaultFolder().getFullName())) {
+        Message[] messages = currentFolder.getMessages();
+        for (Message message : messages) {
+          currentFilesForCurrentFolder.add(new ProtocolFile(this
+              .getRemoteSite(), new ProtocolPath(this.pwd().getProtocolPath()
+              .getPathString()
+              + "/" + this.getMessageName(message), false)));
+        }
+      }
+      // changedDir = false;
+    } catch (Exception e) {
+      if (!currentFolder.getFullName().equals(""))
+        throw new ProtocolException("Failed to ls");
+    } finally {
+      try {
+        closeFolder(currentFolder);
+      } catch (Exception e) {
+      }
+    }
+    // }
+    return currentFilesForCurrentFolder;
+  }
+
+  @Override
+  public synchronized ProtocolFile getCurrentWorkingDir()
+      throws ProtocolException {
+    try {
+      String pwd = this.currentFolder.getFullName();
+      if (!pwd.equals("") && !pwd.startsWith("/"))
+        pwd = "/" + pwd;
+      return new ProtocolFile(this.getRemoteSite(), new ProtocolPath(pwd, true));
+    } catch (Exception e) {
+      throw new ProtocolException("Failed to pwd : " + e.getMessage());
+    }
+  }
+
+  private String getMessageName(Message msg) throws MessagingException {
+    Enumeration headers = msg.getAllHeaders();
+    while (headers.hasMoreElements()) {
+      Header header = (Header) headers.nextElement();
+      if (header.getName().toLowerCase().equals("message-id")) {
+        String stringHeader = header.getValue();
+        // System.out.println(stringHeader);
+        stringHeader = stringHeader.replace("<", "");
+        return stringHeader.substring(0, stringHeader.indexOf("@"));
+      }
+    }
+    return null;
+  }
+
+  private String getContentFromPlainText(Part p) throws MessagingException,
+      IOException, DecoderException {
+    StringBuffer content = new StringBuffer("");
+    if (p.isMimeType("text/plain")) {
+      content.append((String) p.getContent());
+    } else if (p.isMimeType("multipart/*")) {
+      Multipart mp = (Multipart) p.getContent();
+      int count = mp.getCount();
+      for (int i = 0; i < count; i++)
+        content.append(getContentFromPlainText(mp.getBodyPart(i)));
+    } else {
+      Object obj = p.getContent();
+      if (obj instanceof Part)
+        content.append(getContentFromPlainText((Part) p.getContent()));
+    }
+    return content.toString().replaceAll(" \\r\\n", "").replaceAll(" \\n", "");
+  }
+
+  private String getContentFromHTML(Part p) throws MessagingException,
+      IOException, DecoderException, SAXException, TikaException {
+    StringBuffer content = new StringBuffer("");
+    if (p.isMimeType("multipart/*")) {
+      Multipart mp = (Multipart) p.getContent();
+      int count = mp.getCount();
+      for (int i = 0; i < count; i++)
+        content.append(getContentFromHTML(mp.getBodyPart(i)));
+    } else if (p.isMimeType("text/html")) {
+      HtmlParser parser = new HtmlParser();
+      Metadata met = new Metadata();
+      TextContentHandler handler = new TextContentHandler(
+          new BodyContentHandler());
+      parser.parse(new ByteArrayInputStream(((String) p.getContent())
+          .getBytes()), handler, met);
+      content.append(handler.toString());
+    } else {
+      Object obj = p.getContent();
+      if (obj instanceof Part)
+        content.append(getContentFromHTML((Part) p.getContent()));
+    }
+    return content.toString();
+  }
+
+  private synchronized void openFolder(Folder folder) throws ProtocolException {
+    if (!folder.isOpen()) {
+      try {
+        folder.open(Folder.READ_WRITE);
+      } catch (Exception e) {
+        try {
+          folder.open(Folder.READ_ONLY);
+        } catch (Exception e2) {
+          throw new ProtocolException("Failed to open folder : "
+              + e.getMessage() + " : " + e2.getMessage());
+        }
+      }
+    }
+    openCalls++;
+  }
+
+  private synchronized void closeFolder(Folder folder) {
+    if (openCalls > 0)
+      openCalls--;
+
+    if (openCalls <= 0) {
+      try {
+        folder.close(true);
+      } catch (Exception e) {
+      }
+    }
+  }
+
+  @Override
+  public synchronized boolean deleteFile(ProtocolFile file) {
+    boolean found = false;
+    try {
+      openFolder(currentFolder);
+      Message[] messages = currentFolder.getMessages();
+      for (Message message : messages) {
+        if (this.getMessageName(message).equals(file.getName())) {
+          message.setFlag(Flags.Flag.DELETED, true);
+          found = true;
+          break;
+        }
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+    } finally {
+      closeFolder(currentFolder);
+    }
+    return found;
+  }
+
+}

Propchange: oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClient.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClientFactory.java
URL: http://svn.apache.org/viewvc/oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClientFactory.java?rev=1128535&view=auto
==============================================================================
--- oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClientFactory.java (added)
+++ oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClientFactory.java Fri May 27 23:47:42 2011
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.oodt.cas.pushpull.protocol.imaps;
+
+//OODT imports
+import org.apache.oodt.cas.pushpull.protocol.Protocol;
+import org.apache.oodt.cas.pushpull.protocol.ProtocolFactory;
+
+/**
+ * 
+ * @author bfoster
+ * @version $Revision$
+ * 
+ * <p>
+ * Describe your class here
+ * </p>.
+ */
+public class ImapsClientFactory implements ProtocolFactory {
+
+    private ImapsClient imapsClient;
+
+    public Protocol newInstance() {
+        if (this.imapsClient == null)
+            this.imapsClient = new ImapsClient();
+        return this.imapsClient;
+    }
+
+}

Propchange: oodt/branches/protocol/protocol-imaps/src/main/java/org/apache/oodt/cas/protocol/imaps/ImapsClientFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain