dims        2002/12/13 12:46:08

  Modified:    java     build.xml
               java/src/org/apache/axis/utils Options.java
               java/xmls properties.xml targets.xml
  Added:       java/src/org/apache/axis/transport/mail Handler.java
                        MailConstants.java MailSender.java MailServer.java
                        MailTransport.java MailWorker.java
  Log:
  Checking in an Initial Impl of a SMTP/POP3 transport.
  
  Notes:
  - You will need a daily build of Jakarta Commons/Net from 
(http://jakarta.apache.org/commons/sandbox/net/)
  - Checked this in to be able to try Async API (When the Async Implementations start, 
as i don't have access to a  JMS environment)
  - One major problem is that Commons/Net uses Reader/Writer and JavaMail API uses 
InputStream/OutputStream so we need to store messages in an intermediate byte array
  
  Revision  Changes    Path
  1.219     +1 -0      xml-axis/java/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/build.xml,v
  retrieving revision 1.218
  retrieving revision 1.219
  diff -u -r1.218 -r1.219
  --- build.xml 6 Dec 2002 18:21:40 -0000       1.218
  +++ build.xml 13 Dec 2002 20:46:08 -0000      1.219
  @@ -126,6 +126,7 @@
         <exclude 
name="**/org/apache/axis/transport/http/ServletEndpointContextImpl.java" 
unless="servlet.present"/>
         <exclude 
name="**/org/apache/axis/transport/configuration/EngineConfigurationFactoryServlet.java"
 unless="servlet.present"/>
         <exclude name="**/org/apache/axis/transport/http/CommonsHTTPSender.java" 
unless="commons-httpclient.present"/>
  +      <exclude name="**/org/apache/axis/transport/mail/*.java" 
unless="commons-httpclient.present"/>
         <exclude name="**/org/apache/axis/transport/jms/*" unless="jms.present"/>
         <exclude name="**/org/apache/axis/components/jms/BeanVendorAdapter.java" 
unless="jms.present"/>
         <exclude name="**/org/apache/axis/components/jms/JMSVendorAdapter.java" 
unless="jms.present"/>
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/transport/mail/Handler.java
  
  Index: Handler.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions 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.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Axis" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.axis.transport.mail;
  
  import java.net.URL;
  import java.net.URLConnection;
  import java.net.URLStreamHandler;
  
  /**
   * A stub URLStreamHandler, so the system will recognize our
   * custom URLs as valid.
   * 
   * @author Davanum Srinivas <[EMAIL PROTECTED]>
   */
  public class Handler extends URLStreamHandler {
      protected URLConnection openConnection(URL u) {
          return null;
      }
  }
  
  
  
  1.1                  
xml-axis/java/src/org/apache/axis/transport/mail/MailConstants.java
  
  Index: MailConstants.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions 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.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Axis" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.axis.transport.mail;
  
  public class MailConstants {
      public final static String FROM_ADDRESS = "transport.mail.from";
      public final static String TO_ADDRESS = "transport.mail.to";
      public final static String SMTP_HOST = "transport.mail.smtp.host";
      public final static String POP3_HOST = "transport.mail.pop3.host";
      public final static String POP3_USERID = "transport.mail.pop3.userid";
      public final static String POP3_PASSWORD = "transport.mail.pop3.password";
  }
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/transport/mail/MailSender.java
  
  Index: MailSender.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions 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.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Axis" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.axis.transport.mail;
  
  import org.apache.axis.AxisFault;
  import org.apache.axis.Message;
  import org.apache.axis.MessageContext;
  import org.apache.axis.components.logger.LogFactory;
  import org.apache.axis.components.uuid.UUIDGen;
  import org.apache.axis.components.uuid.UUIDGenFactory;
  import org.apache.axis.handlers.BasicHandler;
  import org.apache.axis.transport.http.HTTPConstants;
  import org.apache.axis.utils.Messages;
  import org.apache.commons.logging.Log;
  import org.apache.commons.net.pop3.POP3Client;
  import org.apache.commons.net.pop3.POP3MessageInfo;
  import org.apache.commons.net.smtp.SMTPClient;
  import org.apache.commons.net.smtp.SMTPReply;
  
  import javax.mail.Session;
  import javax.mail.internet.InternetAddress;
  import javax.mail.internet.MimeMessage;
  import javax.mail.internet.MimePart;
  import java.io.BufferedReader;
  import java.io.ByteArrayInputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.Reader;
  import java.io.Writer;
  import java.util.Properties;
  
  /**
   * This is meant to be used on a SOAP Client to call a SOAP server via SMTP/POP3
   *
   * @author Davanum Srinivas ([EMAIL PROTECTED])
   */
  public class MailSender extends BasicHandler {
  
      protected static Log log = LogFactory.getLog(MailSender.class.getName());
      private UUIDGen uuidGen = UUIDGenFactory.getUUIDGen(null);
  
      Properties prop = new Properties();
      Session session = Session.getDefaultInstance(prop, null);
  
      /**
       * invoke creates a socket connection, sends the request SOAP message and then
       * reads the response SOAP message back from the SOAP server
       *
       * @param msgContext the messsage context
       *
       * @throws AxisFault
       */
      public void invoke(MessageContext msgContext) throws AxisFault {
  
          if (log.isDebugEnabled()) {
              log.debug(Messages.getMessage("enter00", "MailSender::invoke"));
          }
          try {
              // Send the SOAP request to the SMTP server
              String id = writeUsingSMTP(msgContext);
              
              // Read SOAP response from the POP3 Server
              readUsingPOP3(id, msgContext);
          } catch (Exception e) {
              log.debug(e);
              throw AxisFault.makeFault(e);
          }
          if (log.isDebugEnabled()) {
              log.debug(Messages.getMessage("exit00",
                      "HTTPDispatchHandler::invoke"));
          }
      }
  
  
      /**
       * Send the soap request message to the server
       *
       * @param msgContext message context
       *
       * @return id for the current message
       * @throws Exception
       */
      private String writeUsingSMTP(MessageContext msgContext)
              throws Exception {
          String id = (new java.rmi.server.UID()).toString();
          String smtpHost = msgContext.getStrProp(MailConstants.SMTP_HOST);
  
          SMTPClient client = new SMTPClient();
          client.connect(smtpHost);
          
          // After connection attempt, you should check the reply code to verify
          // success.
          System.out.print(client.getReplyString());
          int reply = client.getReplyCode();
          if (!SMTPReply.isPositiveCompletion(reply)) {
              client.disconnect();
              AxisFault fault = new AxisFault("SMTP", "( SMTP server refused 
connection )", null, null);
              throw fault;
          }
  
          client.login(smtpHost);
          System.out.print(client.getReplyString());
          reply = client.getReplyCode();
          if (!SMTPReply.isPositiveCompletion(reply)) {
              client.disconnect();
              AxisFault fault = new AxisFault("SMTP", "( SMTP server refused 
connection )", null, null);
              throw fault;
          }
  
          String fromAddress = msgContext.getStrProp(MailConstants.FROM_ADDRESS);
          String toAddress = msgContext.getStrProp(MailConstants.TO_ADDRESS);
  
          MimeMessage msg = new MimeMessage(session);
          msg.setFrom(new InternetAddress(fromAddress));
          msg.addRecipient(MimeMessage.RecipientType.TO, new 
InternetAddress(toAddress));
  
          // Get SOAPAction, default to ""
          String action = msgContext.useSOAPAction()
                  ? msgContext.getSOAPActionURI()
                  : "";
  
          if (action == null) {
              action = "";
          }
  
          Message reqMessage = msgContext.getRequestMessage();
  
          msg.addHeader(HTTPConstants.HEADER_USER_AGENT, 
Messages.getMessage("axisUserAgent"));
          msg.addHeader(HTTPConstants.HEADER_SOAP_ACTION, action);
          msg.setDisposition(MimePart.INLINE);
          msg.setSubject(id);
  
          ByteArrayOutputStream out = new ByteArrayOutputStream(8 * 1024);
          reqMessage.writeTo(out);
          msg.setContent(out.toString(), 
reqMessage.getContentType(msgContext.getSOAPConstants()));
  
          ByteArrayOutputStream out2 = new ByteArrayOutputStream(8 * 1024);
          msg.writeTo(out2);
  
          client.setSender(fromAddress);
          System.out.print(client.getReplyString());
          client.addRecipient(toAddress);
          System.out.print(client.getReplyString());
  
          Writer writer = client.sendMessageData();
          System.out.print(client.getReplyString());
          writer.write(out2.toString());
          writer.flush();
          writer.close();
  
          System.out.print(client.getReplyString());
          if (!client.completePendingCommand()) {
              System.out.print(client.getReplyString());
              AxisFault fault = new AxisFault("SMTP", "( Failed to send email )", 
null, null);
              throw fault;
          }
          System.out.print(client.getReplyString());
          client.logout();
          client.disconnect();
          return id;
      }
  
      /**
       * Read from server using POP3
       * @param msgContext
       * @throws Exception
       */
      private void readUsingPOP3(String id, MessageContext msgContext) throws 
Exception {
          // Read the response back from the server
          String pop3Host = msgContext.getStrProp(MailConstants.POP3_HOST);
          String pop3User = msgContext.getStrProp(MailConstants.POP3_USERID);
          String pop3passwd = msgContext.getStrProp(MailConstants.POP3_PASSWORD);
  
          Reader reader;
          POP3MessageInfo[] messages = null;
  
          MimeMessage mimeMsg = null;
          POP3Client pop3 = new POP3Client();
          // We want to timeout if a response takes longer than 60 seconds
          pop3.setDefaultTimeout(60000);
  
          for (int i = 0; i < 12; i++) {
              pop3.connect(pop3Host);
  
              if (!pop3.login(pop3User, pop3passwd)) {
                  pop3.disconnect();
                  AxisFault fault = new AxisFault("POP3", "( Could not login to 
server.  Check password. )", null, null);
                  throw fault;
              }
  
              messages = pop3.listMessages();
              if (messages != null && messages.length > 0) {
                  StringBuffer buffer = null;
                  for (int j = 0; j < messages.length; j++) {
                      reader = pop3.retrieveMessage(messages[j].number);
                      if (reader == null) {
                          AxisFault fault = new AxisFault("POP3", "( Could not 
retrieve message header. )", null, null);
                          throw fault;
                      }
  
                      buffer = new StringBuffer();
                      BufferedReader bufferedReader = new BufferedReader(reader);
                      int ch;
                      while ((ch = bufferedReader.read()) != -1) {
                          buffer.append((char) ch);
                      }
                      bufferedReader.close();
                      if (buffer.toString().indexOf(id) != -1) {
                          ByteArrayInputStream bais = new 
ByteArrayInputStream(buffer.toString().getBytes());
                          Properties prop = new Properties();
                          Session session = Session.getDefaultInstance(prop, null);
  
                          mimeMsg = new MimeMessage(session, bais);
                          pop3.deleteMessage(messages[j].number);
                          break;
                      }
                      buffer = null;
                  }
              }
              pop3.logout();
              pop3.disconnect();
              if (mimeMsg == null) {
                  Thread.sleep(5000);
              } else {
                  break;
              }
          }
  
          if (mimeMsg == null) {
              pop3.logout();
              pop3.disconnect();
              AxisFault fault = new AxisFault("POP3", "( Could not retrieve message 
list. )", null, null);
              throw fault;
          }
  
          String contentType = mimeMsg.getContentType();
          String contentLocation = mimeMsg.getContentID();
          Message outMsg = new Message(mimeMsg.getInputStream(), false,
                  contentType, contentLocation);
  
          outMsg.setMessageType(Message.RESPONSE);
          msgContext.setResponseMessage(outMsg);
          if (log.isDebugEnabled()) {
              log.debug("\n" + Messages.getMessage("xmlRecd00"));
              log.debug("-----------------------------------------------");
              log.debug(outMsg.getSOAPPartAsString());
          }
      }
  }
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/transport/mail/MailServer.java
  
  Index: MailServer.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions 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.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Axis" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.axis.transport.mail;
  
  import org.apache.axis.components.logger.LogFactory;
  import org.apache.axis.i18n.Messages;
  import org.apache.axis.server.AxisServer;
  import org.apache.axis.utils.Options;
  import org.apache.commons.logging.Log;
  import org.apache.commons.net.pop3.POP3Client;
  import org.apache.commons.net.pop3.POP3MessageInfo;
  
  import javax.mail.Session;
  import javax.mail.internet.MimeMessage;
  import java.io.BufferedReader;
  import java.io.ByteArrayInputStream;
  import java.io.Reader;
  import java.net.MalformedURLException;
  import java.util.Properties;
  
  /**
   * This is a simple implementation of an SMTP/POP3 server for processing
   * SOAP requests via Apache's xml-axis.  This is not intended for production
   * use.  Its intended uses are for demos, debugging, and performance
   * profiling.
   *
   * @author Davanum Srinivas <[EMAIL PROTECTED]>
   * @author Rob Jellinghaus ([EMAIL PROTECTED])
   */
  
  public class MailServer implements Runnable {
      protected static Log log =
              LogFactory.getLog(MailServer.class.getName());
  
      private String host;
      private int port;
      private String userid;
      private String password;
  
      public MailServer(String host, int port, String userid, String password) {
          this.host = host;
          this.port = port;
          this.userid = userid;
          this.password = password;
      }
  
      // Are we doing threads?
      private static boolean doThreads = true;
  
      public void setDoThreads(boolean value) {
          doThreads = value;
      }
  
      public boolean getDoThreads() {
          return doThreads;
      }
  
      public String getHost() {
          return host;
      }
  
      // Axis server (shared between instances)
      private static AxisServer myAxisServer = null;
  
      protected static synchronized AxisServer getAxisServer() {
          if (myAxisServer == null) {
              myAxisServer = new AxisServer();
          }
          return myAxisServer;
      }
  
      // are we stopped?
      // latch to true if stop() is called
      private boolean stopped = false;
  
      /**
       * Accept requests from a given TCP port and send them through the
       * Axis engine for processing.
       */
      public void run() {
          log.info(Messages.getMessage("start00", "MailServer", host + ":" + port));
  
          // Accept and process requests from the socket
          while (!stopped) {
              try {
                  pop3.connect(host, port);
                  pop3.login(userid, password);
  
                  POP3MessageInfo[] messages = pop3.listMessages();
                  if (messages != null && messages.length > 0) {
                      for (int i = 0; i < messages.length; i++) {
                          Reader reader = pop3.retrieveMessage(messages[i].number);
                          if (reader == null) {
                              continue;
                          }
  
                          StringBuffer buffer = new StringBuffer();
                          BufferedReader bufferedReader =
                                  new BufferedReader(reader);
                          int ch;
                          while ((ch = bufferedReader.read()) != -1) {
                              buffer.append((char) ch);
                          }
                          bufferedReader.close();
                          ByteArrayInputStream bais = new 
ByteArrayInputStream(buffer.toString().getBytes());
                          Properties prop = new Properties();
                          Session session = Session.getDefaultInstance(prop, null);
  
                          MimeMessage mimeMsg = new MimeMessage(session, bais);
                          pop3.deleteMessage(messages[i].number);
                          if (mimeMsg != null) {
                              MailWorker worker = new MailWorker(this, mimeMsg);
                              if (doThreads) {
                                  Thread thread = new Thread(worker);
                                  thread.setDaemon(true);
                                  thread.start();
                              } else {
                                  worker.run();
                              }
                          }
                      }
                  }
              } catch (java.io.InterruptedIOException iie) {
              } catch (Exception e) {
                  log.debug(Messages.getMessage("exception00"), e);
                  break;
              } finally {
                  try {
                      pop3.logout();
                      pop3.disconnect();
                      Thread.sleep(3000);
                  } catch (Exception e) {
                      log.error(Messages.getMessage("exception00"), e);
                  }
              }
          }
          log.info(Messages.getMessage("quit00", "MailServer"));
      }
  
      /**
       * POP3 connection
       */
      private POP3Client pop3;
  
      /**
       * Obtain the serverSocket that that MailServer is listening on.
       */
      public POP3Client getPOP3() {
          return pop3;
      }
  
      /**
       * Set the serverSocket this server should listen on.
       * (note : changing this will not affect a running server, but if you
       *  stop() and then start() the server, the new socket will be used).
       */
      public void setPOP3(POP3Client pop3) {
          this.pop3 = pop3;
      }
  
      /**
       * Start this server.
       *
       * Spawns a worker thread to listen for HTTP requests.
       *
       * @param daemon a boolean indicating if the thread should be a daemon.
       */
      public void start(boolean daemon) throws Exception {
          if (doThreads) {
              Thread thread = new Thread(this);
              thread.setDaemon(daemon);
              thread.start();
          } else {
              run();
          }
      }
  
      /**
       * Start this server as a NON-daemon.
       */
      public void start() throws Exception {
          start(false);
      }
  
      /**
       * Stop this server.
       *
       * This will interrupt any pending accept().
       */
      public void stop() throws Exception {
          /* 
           * Close the server socket cleanly, but avoid fresh accepts while
           * the socket is closing.
           */
          stopped = true;
          log.info(Messages.getMessage("quit00", "MailServer"));
  
          // Kill the JVM, which will interrupt pending accepts even on linux.
          System.exit(0);
      }
  
      /**
       * Server process.
       */
      public static void main(String args[]) {
          Options opts = null;
          try {
              opts = new Options(args);
          } catch (MalformedURLException e) {
              log.error(Messages.getMessage("malformedURLException00"), e);
              return;
          }
  
          try {
              doThreads = (opts.isFlagSet('t') > 0);
              String host = opts.getHost();
              int port = ((opts.isFlagSet('p') > 0) ? opts.getPort() : 110);
              POP3Client pop3 = new POP3Client();
              MailServer sas = new MailServer(host, port, opts.getUser(), 
opts.getPassword());
  
              sas.setPOP3(pop3);
              sas.start();
          } catch (Exception e) {
              log.error(Messages.getMessage("exception00"), e);
              return;
          }
  
      }
  }
  
  
  
  1.1                  
xml-axis/java/src/org/apache/axis/transport/mail/MailTransport.java
  
  Index: MailTransport.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions 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.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *    Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Axis" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.axis.transport.mail;
  
  import org.apache.axis.AxisEngine;
  import org.apache.axis.MessageContext;
  import org.apache.axis.client.Call;
  import org.apache.axis.client.Transport;
  
  /**
   * A Transport which will cause an invocation via "mail" 
   * 
   * @author Davanum Srinivas <[EMAIL PROTECTED]>
   */
  public class MailTransport extends Transport {
      public MailTransport() {
          transportName = "mail";
      }
  
      /**
       * Set up any transport-specific derived properties in the message context.
       * @param mc the context to set up
       * @param call the Call object
       * @param engine the engine containing the registries
       */
      public void setupMessageContextImpl(MessageContext mc,
                                          Call call,
                                          AxisEngine engine) {
      }
  }
  
  
  
  
  1.1                  xml-axis/java/src/org/apache/axis/transport/mail/MailWorker.java
  
  Index: MailWorker.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   *
   * Copyright (c) 2001 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions 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.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Axis" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.axis.transport.mail;
  
  import org.apache.axis.AxisFault;
  import org.apache.axis.Constants;
  import org.apache.axis.Message;
  import org.apache.axis.MessageContext;
  import org.apache.axis.components.logger.LogFactory;
  import org.apache.axis.message.SOAPEnvelope;
  import org.apache.axis.message.SOAPFault;
  import org.apache.axis.server.AxisServer;
  import org.apache.axis.transport.http.HTTPConstants;
  import org.apache.axis.utils.Messages;
  import org.apache.commons.logging.Log;
  import org.apache.commons.net.smtp.SMTPClient;
  import org.apache.commons.net.smtp.SMTPReply;
  
  import javax.mail.Session;
  import javax.mail.internet.InternetAddress;
  import javax.mail.internet.MimeMessage;
  import javax.mail.internet.MimePart;
  import java.io.ByteArrayOutputStream;
  import java.io.Writer;
  import java.util.Properties;
  
  
  public class MailWorker implements Runnable {
      protected static Log log =
              LogFactory.getLog(MailWorker.class.getName());
  
      // Server 
      private MailServer server;
  
      // Current message
      private MimeMessage mimeMessage;
  
      // Axis specific constants
      private static String transportName = "Mail";
  
      private Properties prop = new Properties();
      private Session session = Session.getDefaultInstance(prop, null);
  
      /**
       * Constructor for MailWorker
       * @param server
       * @param mimeMessage
       */
      public MailWorker(MailServer server, MimeMessage mimeMessage) {
          this.server = server;
          this.mimeMessage = mimeMessage;
      }
  
      /**
       * The main workhorse method.
       */
      public void run() {
          // create an Axis server
          AxisServer engine = server.getAxisServer();
  
          // create and initialize a message context
          MessageContext msgContext = new MessageContext(engine);
          Message requestMsg;
  
          // buffers for the headers we care about
          StringBuffer soapAction = new StringBuffer();
          StringBuffer fileName = new StringBuffer();
          StringBuffer contentType = new StringBuffer();
          StringBuffer contentLocation = new StringBuffer();
  
          Message responseMsg = null;
  
          // prepare request (do as much as possible while waiting for the
          // next connection).  
          try {
              msgContext.setTargetService(null);
          } catch (AxisFault fault) {
          }
          msgContext.setResponseMessage(null);
          msgContext.reset();
          msgContext.setTransportName(transportName);
  
          responseMsg = null;
  
          try {
              try {
                  // parse all headers into hashtable
                  parseHeaders(mimeMessage, contentType,
                          contentLocation, soapAction);
  
                  // Real and relative paths are the same for the
                  // MailServer
                  msgContext.setProperty(Constants.MC_REALPATH,
                          fileName.toString());
                  msgContext.setProperty(Constants.MC_RELATIVE_PATH,
                          fileName.toString());
                  msgContext.setProperty(Constants.MC_JWS_CLASSDIR,
                          "jwsClasses");
  
                  // this may be "" if either SOAPAction: "" or if no SOAPAction at 
all.
                  // for now, do not complain if no SOAPAction at all
                  String soapActionString = soapAction.toString();
                  if (soapActionString != null) {
                      msgContext.setUseSOAPAction(true);
                      msgContext.setSOAPActionURI(soapActionString);
                  }
                  requestMsg = new Message(mimeMessage.getInputStream(), false,
                          contentType.toString(), contentLocation.toString());
                  msgContext.setRequestMessage(requestMsg);
  
                  // invoke the Axis engine
                  engine.invoke(msgContext);
  
                  // Retrieve the response from Axis
                  responseMsg = msgContext.getResponseMessage();
                  if (responseMsg == null) {
                      throw new AxisFault(Messages.getMessage("nullResponse00"));
                  }
              } catch (Exception e) {
                  e.printStackTrace();
                  AxisFault af;
                  if (e instanceof AxisFault) {
                      af = (AxisFault) e;
                      log.debug(Messages.getMessage("serverFault00"), af);
                  } else {
                      af = AxisFault.makeFault(e);
                  }
  
                  // There may be headers we want to preserve in the
                  // response message - so if it's there, just add the
                  // FaultElement to it.  Otherwise, make a new one.
                  responseMsg = msgContext.getResponseMessage();
                  if (responseMsg == null) {
                      responseMsg = new Message(af);
                  } else {
                      try {
                          SOAPEnvelope env = responseMsg.getSOAPEnvelope();
                          env.clearBody();
                          env.addBodyElement(new SOAPFault((AxisFault) e));
                      } catch (AxisFault fault) {
                          // Should never reach here!
                      }
                  }
              }
  
              String replyTo = ((InternetAddress) 
mimeMessage.getReplyTo()[0]).getAddress();
              String sendFrom = ((InternetAddress) 
mimeMessage.getAllRecipients()[0]).getAddress();
              String subject = "Re: " + mimeMessage.getSubject();
              writeUsingSMTP(msgContext, server.getHost(), sendFrom, replyTo, subject, 
responseMsg);
          } catch (Exception e) {
              e.printStackTrace();
              log.debug(Messages.getMessage("exception00"), e);
          }
          if (msgContext.getProperty(msgContext.QUIT_REQUESTED) != null) {
              // why then, quit!
              try {
                  server.stop();
              } catch (Exception e) {
              }
          }
  
      }
  
      /**
       * Send the soap request message to the server
       * 
       * @param msgContext
       * @param smtpHost
       * @param sendFrom
       * @param replyTo
       * @param output
       * @throws Exception
       */
      private void writeUsingSMTP(MessageContext msgContext,
                                  String smtpHost,
                                  String sendFrom,
                                  String replyTo,
                                  String subject,
                                  Message output)
              throws Exception {
          SMTPClient client = new SMTPClient();
          client.connect(smtpHost);
          
          // After connection attempt, you should check the reply code to verify
          // success.
          System.out.print(client.getReplyString());
          int reply = client.getReplyCode();
          if (!SMTPReply.isPositiveCompletion(reply)) {
              client.disconnect();
              AxisFault fault = new AxisFault("SMTP", "( SMTP server refused 
connection )", null, null);
              throw fault;
          }
  
          client.login(smtpHost);
          System.out.print(client.getReplyString());
          reply = client.getReplyCode();
          if (!SMTPReply.isPositiveCompletion(reply)) {
              client.disconnect();
              AxisFault fault = new AxisFault("SMTP", "( SMTP server refused 
connection )", null, null);
              throw fault;
          }
  
          MimeMessage msg = new MimeMessage(session);
          msg.setFrom(new InternetAddress(sendFrom));
          msg.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(replyTo));
          msg.setDisposition(MimePart.INLINE);
          msg.setSubject(subject);
  
          ByteArrayOutputStream out = new ByteArrayOutputStream(8 * 1024);
          output.writeTo(out);
          msg.setContent(out.toString(), 
output.getContentType(msgContext.getSOAPConstants()));
  
          ByteArrayOutputStream out2 = new ByteArrayOutputStream(8 * 1024);
          msg.writeTo(out2);
  
          client.setSender(sendFrom);
          System.out.print(client.getReplyString());
          client.addRecipient(replyTo);
          System.out.print(client.getReplyString());
  
          Writer writer = client.sendMessageData();
          System.out.print(client.getReplyString());
          writer.write(out2.toString());
          writer.flush();
          writer.close();
  
          System.out.print(client.getReplyString());
          if (!client.completePendingCommand()) {
              System.out.print(client.getReplyString());
              AxisFault fault = new AxisFault("SMTP", "( Failed to send email )", 
null, null);
              throw fault;
          }
          System.out.print(client.getReplyString());
          client.logout();
          client.disconnect();
      }
  
      /**
       * Read all mime headers, returning the value of Content-Length and
       * SOAPAction.
       * @param mimeMessage         InputStream to read from
       * @param contentType The content type.
       * @param contentLocation The content location
       * @param soapAction StringBuffer to return the soapAction into
       */
      private void parseHeaders(MimeMessage mimeMessage,
                                StringBuffer contentType,
                                StringBuffer contentLocation,
                                StringBuffer soapAction)
              throws Exception {
          contentType.append(mimeMessage.getContentType());
          contentLocation.append(mimeMessage.getContentID());
          String values[] = mimeMessage.getHeader(HTTPConstants.HEADER_SOAP_ACTION);
          if (values != null)
              soapAction.append(values[0]);
      }
  }
  
  
  
  1.35      +10 -0     xml-axis/java/src/org/apache/axis/utils/Options.java
  
  Index: Options.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/Options.java,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- Options.java      18 Sep 2002 16:10:41 -0000      1.34
  +++ Options.java      13 Dec 2002 20:46:08 -0000      1.35
  @@ -308,6 +308,16 @@
           return( tmp );
       }
       
  +    public String getHost() {
  +        try {
  +            URL url = new URL(getURL());
  +            return( url.getHost() );
  +        }
  +        catch( Exception exp ) {
  +            return( "localhost" );
  +        }
  +    }
  +
       public int getPort() {
           try {
               URL url = new URL(getURL());
  
  
  
  1.34      +1 -0      xml-axis/java/xmls/properties.xml
  
  Index: properties.xml
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/xmls/properties.xml,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- properties.xml    3 Dec 2002 15:42:54 -0000       1.33
  +++ properties.xml    13 Dec 2002 20:46:08 -0000      1.34
  @@ -43,6 +43,7 @@
   <property name="commons-logging.jar" location="${lib.dir}/commons-logging.jar"/>
   <property name="commons-discovery.jar" location="${lib.dir}/commons-discovery.jar"/>
   <property name="commons-httpclient.jar" 
location="${lib.dir}/commons-httpclient.jar"/>
  +<property name="commons-net.jar" location="${lib.dir}/commons-net-1.0.0-dev.jar"/>
   <property name="log4j-core.jar" location="${lib.dir}/log4j-1.2.4.jar"/>
   <property name="junit.jar" location="${lib.dir}/junit.jar"/>
   <property name="jimi.jar" location="${lib.dir}/JimiProClasses.zip"/>
  
  
  
  1.51      +4 -0      xml-axis/java/xmls/targets.xml
  
  Index: targets.xml
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/xmls/targets.xml,v
  retrieving revision 1.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- targets.xml       6 Dec 2002 18:21:41 -0000       1.50
  +++ targets.xml       13 Dec 2002 20:46:08 -0000      1.51
  @@ -95,6 +95,10 @@
         classname="org.apache.commons.httpclient.HttpConnection"
         classpathref="classpath"/>
   
  +    <available property="commons-net.present"
  +      classname="org.apache.commons.net.smtp.SMTPClient"
  +      classpathref="classpath"/>
  +
       <available property="log4j.present"
         classname="org.apache.log4j.Category"
         classpathref="classpath"/>
  
  
  


Reply via email to