You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ch...@apache.org on 2001/05/11 11:16:02 UTC

cvs commit: jakarta-james/src/org/apache/james/dnsserver DNSServer.java DNSServer.xinfo

charlesb    01/05/11 02:16:01

  Added:       src/java/org/apache/james/core AvalonMailStore.java
                        AvalonMailStore.xinfo AvalonUsersStore.java
                        AvalonUsersStore.xinfo EnhancedMimeMessage.java
                        JamesMimeMessage.java
                        JamesMimeMessageInputStream.java MailImpl.java
                        MailetConfigImpl.java MatcherConfigImpl.java
               src/java/org/apache/james/dnsserver DNSServer.java
                        DNSServer.xinfo
  Removed:     src/org/apache/james/core AvalonMailStore.java
                        AvalonMailStore.xinfo AvalonUsersStore.java
                        AvalonUsersStore.xinfo EnhancedMimeMessage.java
                        JamesMimeMessage.java
                        JamesMimeMessageInputStream.java MailImpl.java
                        MailetConfigImpl.java MatcherConfigImpl.java
               src/org/apache/james/dnsserver DNSServer.java
                        DNSServer.xinfo
  Log:
  Moving from src/org to src/java/org
  
  Revision  Changes    Path
  1.1                  jakarta-james/src/java/org/apache/james/core/AvalonMailStore.java
  
  Index: AvalonMailStore.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE file.
   */
  package org.apache.james.core;
  
  import java.util.HashMap;
  import java.util.Iterator;
  import org.apache.avalon.framework.activity.Initializable;
  import org.apache.avalon.framework.component.Component;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.logger.Loggable;
  import org.apache.avalon.framework.logger.AbstractLoggable;
  import org.apache.james.services.MailRepository;
  import org.apache.james.services.MailStore;
  import org.apache.log.LogKit;
  import org.apache.log.Logger;
  import org.apache.avalon.phoenix.Block;
  
  /**
   *
   * @author <a href="mailto:fede@apache.org">Federico Barbieri</a>
   *
   * Provides Registry of mail repositories. A mail repository is uniquely identified 
   * by destinationURL, type and model.
   */
  public class AvalonMailStore
      extends AbstractLoggable
      implements Block, Composable, Configurable, MailStore, Initializable {
  
      private static final String REPOSITORY_NAME = "Repository";
      private static long id;
      // map of [destinationURL + type]->Repository
      private HashMap repositories;
      // map of [destinationURL + type]->model
      private HashMap models;
      // map of [protocol(destinationURL) + type + model]->classname of repository;
      private HashMap classes;
      protected Configuration          configuration;
      protected ComponentManager       componentManager;
  
      public void compose( final ComponentManager componentManager )
          throws ComponentException
      {
          this.componentManager = componentManager;
      }
  
      public void configure( final Configuration configuration )
          throws ConfigurationException
      {
          this.configuration = configuration;
      }
  
      public void initialize()
          throws Exception {
  
          getLogger().info("JamesMailStore init...");
          repositories = new HashMap();
          models = new HashMap();
          classes = new HashMap();
          Configuration[] registeredClasses
              = configuration.getChild("repositories").getChildren("repository");
          for ( int i = 0; i < registeredClasses.length; i++ )
          {
              registerRepository((Configuration) registeredClasses[i]);
          }
          getLogger().info("James MailStore ...init");
      }
  
      public synchronized void registerRepository(Configuration repConf)
          throws ConfigurationException {
          String className = repConf.getAttribute("class");
          getLogger().info("Registering Repository " + className);
          Configuration[] protocols
              = repConf.getChild("protocols").getChildren("protocol");
          Configuration[] types = repConf.getChild("types").getChildren("type");
          Configuration[] models
              = repConf.getChild("models").getChildren("model");
          for ( int i = 0; i < protocols.length; i++ )
          {
              String protocol = protocols[i].getValue();
  
              for ( int j = 0; j < types.length; j++ )
              {
                  String type = types[j].getValue();
  
                  for ( int k = 0; k < models.length; k++ )
                  {
                      String model = models[k].getValue();
                      String key = protocol + type + model;
                      classes.put(key, className);
                      getLogger().info("Registered class: " + key+"->"+className);
                  }
              }
          }
      }
  
      public void release(Component component)
      {
      }
  
      public synchronized Component select(Object hint) throws ComponentException
      {
  
          Configuration repConf = null;
          try {
              repConf = (Configuration) hint;
          } catch (ClassCastException cce) {
              throw new ComponentException("hint is of the wrong type. Must be a Configuration", cce);
          }
          String destination = null;
          String protocol = null;
          try {
              destination = repConf.getAttribute("destinationURL");
              int idx = destination.indexOf(':');
              if ( idx == -1 )
                  throw new ComponentException
                      ("destination is malformed. Must be a valid URL: "+destination);
              protocol = destination.substring(0,idx);
          } catch (ConfigurationException ce) {
              throw new ComponentException("Malformed configuration has no destinationURL attribute", ce);
          }
  
          try
          {
              String type = repConf.getAttribute("type");
              String repID = destination + type;
              MailRepository reply = (MailRepository) repositories.get(repID);
              String model = (String) repConf.getAttribute("model");
              if (reply != null) {
                  if (models.get(repID).equals(model)) {
                      getLogger().debug("obtained repository: "+repID+","+reply.getClass());
                      return (Component)reply;
                  } else {
                      throw new ComponentException("There is already another repository with the same destination and type but with different model");
                  }
              } else {
                  String repClass = (String) classes.get( protocol + type + model );
  
                  getLogger().debug( "Need instance of " + repClass +
                                     " to handle: " + protocol + "," + type + "," +model );
  
                  try {
                      reply = (MailRepository) Class.forName(repClass).newInstance();
                     if (reply instanceof Loggable) {
  		       setupLogger(reply);
                      }
                      if (reply instanceof Configurable) {
                          ((Configurable) reply).configure(repConf);
                      }
                      if (reply instanceof Composable) {
                          ((Composable) reply).compose( componentManager );
                      }
  /*                if (reply instanceof Contextualizable) {
                    ((Contextualizable) reply).contextualize(context);
                    }*/
                      if (reply instanceof Initializable) {
                          ((Initializable) reply).initialize();
                      }
                      repositories.put(repID, reply);
                      models.put(repID, model);
                      getLogger().info("added repository: "+repID+"->"+repClass);
  		    /*                    getLogger().info( "New instance of " + repClass +
  		     *		  " created for " + destination );
                       */
                      return (Component)reply;
                  } catch (Exception e) {
                      getLogger().warn( "Exception while creating repository:" +
                                        e.getMessage(), e );
  
                      throw new
                          ComponentException( "Cannot find or init repository", e );
                  }
              }
          } catch( final ConfigurationException ce ) {
              throw new ComponentException( "Malformed configuration", ce );
          }
      }
  
      public static final String getName() {
          return REPOSITORY_NAME + id++;
      }
  }
  
  
  
  1.1                  jakarta-james/src/java/org/apache/james/core/AvalonMailStore.xinfo
  
  Index: AvalonMailStore.xinfo
  ===================================================================
  <?xml version="1.0"?>
  
  <blockinfo>
  
    <meta>
  
      <contributors>
        <author name="Federico Barbier" email="fede@apache.org"/>
        <author name="Charles Benett" email="charle@benett1.demon.co.uk"/>
      </contributors>
  
    </meta>
  
    <!-- services that are offered by this block -->
    <services>
      <service name="org.apache.james.services.MailStore" version="1.0" />
    </services>
  
    <dependencies>
      <dependency>
        <role>org.apache.avalon.cornerstone.services.store.Store</role>
        <service name="org.apache.avalon.cornerstone.services.store.Store" version="1.0"/>
      </dependency>
    </dependencies>
  
  </blockinfo>
  
  
  
  
  
  1.1                  jakarta-james/src/java/org/apache/james/core/AvalonUsersStore.java
  
  Index: AvalonUsersStore.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE file.
   */
  package org.apache.james.core;
  
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.util.HashMap;
  import java.util.Iterator;
  import org.apache.avalon.framework.activity.Initializable;
  import org.apache.avalon.framework.component.Component;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.logger.AbstractLoggable;
  import org.apache.james.services.UsersRepository;
  import org.apache.james.services.UsersStore;
  import org.apache.avalon.phoenix.Block;
  
  /**
   *
   * @author <a href="mailto:fede@apache.org">Federico Barbieri</a>
   */
  public class AvalonUsersStore
      extends AbstractLoggable
      implements Block, Composable, Configurable, UsersStore, Initializable {
  
      private HashMap repositories;
      protected Configuration          configuration;
      protected ComponentManager       componentManager;
  
      public void configure( final Configuration configuration )
          throws ConfigurationException {
          this.configuration = configuration;
      }
  
      public void compose( final ComponentManager componentManager )
          throws ComponentException {
          this.componentManager = componentManager;
      }
  
      public void initialize()
          throws Exception {
  
          getLogger().info("AvalonUsersStore init...");
          repositories = new HashMap();
  
          Configuration[] repConfs = configuration.getChildren("repository");
          for ( int i = 0; i < repConfs.length; i++ )
          {
              Configuration repConf = repConfs[i];
              String repName = repConf.getAttribute("name");
              String repClass = repConf.getAttribute("class");
  
              UsersRepository rep = (UsersRepository) Class.forName(repClass).newInstance();
  
              setupLogger((Component)rep);
  
              if (rep instanceof Composable) {
                  ((Composable) rep).compose( componentManager );
              }
  
              if (rep instanceof Configurable) {
                  ((Configurable) rep).configure(repConf);
              }
              /*
                if (rep instanceof Contextualizable) {
                ((Contextualizable) rep).contextualize(context);
                }
              */
              if (rep instanceof Initializable) {
                  ((Initializable) rep).initialize();
              }
              repositories.put(repName, rep);
              getLogger().info("UsersRepository " + repName + " started.");
          }
          getLogger().info("AvalonUsersStore ...init");
      }
  
  
      public UsersRepository getRepository(String request) {
          UsersRepository response = (UsersRepository) repositories.get(request);
          if (response == null) {
              getLogger().warn("No users repository called: " + request);
          }
          return response;
      }
  }
  
  
  
  1.1                  jakarta-james/src/java/org/apache/james/core/AvalonUsersStore.xinfo
  
  Index: AvalonUsersStore.xinfo
  ===================================================================
  <?xml version="1.0"?>
  
  <blockinfo>
  
    <meta>
  
      <contributors>
        <author name="Charles Benett" email="charles@benett1.demon.co.uk"/>
      </contributors>
  
    </meta>
  
    <!-- services that are offered by this block -->
    <services>
      <service name="org.apache.james.services.UsersStore" version="1.0" />
    </services>
  
    <dependencies>
      <dependency>
        <role>org.apache.avalon.cornerstone.services.store.Store</role>
        <service name="org.apache.avalon.cornerstone.services.store.Store" version="1.0"/>
      </dependency>
    </dependencies>
  
  </blockinfo>
  
  
  
  1.1                  jakarta-james/src/java/org/apache/james/core/EnhancedMimeMessage.java
  
  Index: EnhancedMimeMessage.java
  ===================================================================
  package org.apache.james.core;
  
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.util.Enumeration;
  import javax.mail.*;
  import javax.mail.internet.*;
  
  /**
   * EnhancedMimeMessage is a direct subclass of MimeMessage that overrides the
   * getLineCount method of javax.mail.internet.MimeMessage with one that works
   * (kind of) and adds additional methods writeContentTo and getMessageSize.
   *
   * @author <a href="mailto:charles@benett1.demon.co.uk">Charles Benett</a>
   * @version 0.1  on 14 Dec 2000
   */
  public class EnhancedMimeMessage 
      extends MimeMessage {
  
      public EnhancedMimeMessage(Session session, InputStream in)
          throws MessagingException {
          super(session, in);
      }
  
      public  EnhancedMimeMessage(MimeMessage message)
          throws MessagingException {
          super(message);
      }
  
  
      /**
       * Corrects JavaMail 1.1 version which always returns -1.
       * Only corrected for content less than 5000 bytes,
       * to avoid memory hogging.
       */
      public int getLineCount() throws MessagingException {
          if (content == null) {
              return -1;
          }
          int size = content.length; // size of byte array
          int lineCount = 0;
          if (size < 5000) {
              for (int i=0; i < size -2; i++) {
                  if (content[i] == '\r' && content[i+1] == '\n') {
                      lineCount++;
                  }
              }
              if (content[size -2] != '\r' || content[size-1] != '\n') {
                  //message has a non-empty final line.
                  lineCount++;
              }
          } else {
              lineCount = -1;
          }
          return lineCount;
      }
  
  
      /**
       * Writes content only, ie not headers, to the specified outputstream.
       */
      public void writeContentTo(OutputStream outs)
          throws java.io.IOException, MessagingException {
          int size = content.length; // size of byte array
          int chunk = 1000; //arbitrary choice - ideas welcome
          int pointer = 0;
          while (pointer < size) {
              if ((size - pointer) > chunk) {
                  outs.write(content, pointer, chunk);
              } else {
                  outs.write(content, pointer, size-pointer);
              }
              pointer += chunk;
          }
      }
  
      /**
       * Returns size of message, ie headers and content. Current implementation
       * actually returns number of characters in headers plus number of bytes
       * in the internal content byte array.
       */
      public int getMessageSize() throws MessagingException {
          int contentSize = content.length;
          int headerSize = 0;
          Enumeration e = getAllHeaderLines();
          while (e.hasMoreElements()) {
              headerSize += ((String)e.nextElement()).length();
          }
          return headerSize + contentSize;
      }
  }
  
  
  
  1.1                  jakarta-james/src/java/org/apache/james/core/JamesMimeMessage.java
  
  Index: JamesMimeMessage.java
  ===================================================================
  package org.apache.james.core;
  
  import java.io.*;
  import java.util.*;
  import javax.activation.*;
  import javax.mail.*;
  import javax.mail.internet.*;
  
  public class JamesMimeMessage extends MimeMessage {
      MimeMessage message = null;
  
      InputStream in = null;
      boolean modified = false;
  
      public JamesMimeMessage(Session session, InputStream in) {
          super(session);
          this.in = in;
      }
  
      /**
       * Internal implementations
       */
      private synchronized void loadMessage() throws MessagingException {
          if (message != null) {
              //Another thread has already loaded this message
              return;
          }
          message = new MimeMessage(session, in);
          try {
              in.close();
          } catch (IOException ioe) {
              throw new MessagingException("Unable to parse stream: " + ioe.getMessage());
          }
      }
  
      /**
       * Special methods you can call
       */
      public boolean isModified() {
          return modified;
      }
  
      public InputStream getSourceStream() {
          return in;
      }
  
  
      /**
       * Methods that should be rewritten for optimization purposes
       */
      public void writeTo(OutputStream os) throws IOException, MessagingException {
          if (message == null) {
              loadMessage();
          }
          message.writeTo(os);
      }
  
      public void writeTo(OutputStream os, String[] ignoreList) throws IOException, MessagingException {
          if (message == null) {
              loadMessage();
          }
          message.writeTo(os, ignoreList);
      }
  
  
      /**
       * Various reader methods
       */
  
      public Address[] getFrom() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getFrom();
      }
  
      public Address[] getRecipients(Message.RecipientType type) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getRecipients(type);
      }
  
      public Address[] getAllRecipients() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getAllRecipients();
      }
  
      public Address[] getReplyTo() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getReplyTo();
      }
  
      public String getSubject() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getSubject();
      }
  
      public Date getSentDate() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getSentDate();
      }
  
      public Date getReceivedDate() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getReceivedDate();
      }
  
      public int getSize() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getSize();
      }
  
      /**
       * Corrects JavaMail 1.1 version which always returns -1.
       * Only corrected for content less than 5000 bytes,
       * to avoid memory hogging.
       */
      public int getLineCount() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
  	int size = content.length; // size of byte array
  	int lineCount = 0;
  	if (size < 5000) {
  	    for (int i=0; i < size -1; i++) {
  		if (content[i] == '\r' && content[i+1] == '\n') {
  		    lineCount++;
  		}
  	    }
  	} else {
  	    lineCount = -1;
  	}
          return lineCount;
      }
  
      public String getContentType() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getContentType();
      }
  
      public boolean isMimeType(String mimeType) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.isMimeType(mimeType);
      }
  
      public String getDisposition() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getDisposition();
      }
  
      public String getEncoding() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getEncoding();
      }
  
      public String getContentID() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getContentID();
      }
  
      public String getContentMD5() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getContentMD5();
      }
  
      public String getDescription() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getDescription();
      }
  
      public String[] getContentLanguage() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getContentLanguage();
      }
  
      public String getMessageID() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getMessageID();
      }
  
      public String getFileName() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getFileName();
      }
  
      public InputStream getInputStream() throws IOException, MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getInputStream();
      }
  
      public DataHandler getDataHandler() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getDataHandler();
      }
  
      public Object getContent() throws IOException, MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getContent();
      }
  
      public String[] getHeader(String name) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getHeader(name);
      }
  
      public String getHeader(String name, String delimiter) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getHeader(name, delimiter);
      }
  
      public Enumeration getAllHeaders() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getAllHeaders();
      }
  
      public Enumeration getMatchingHeaders(String[] names) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getMatchingHeaders(names);
      }
  
      public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getNonMatchingHeaders(names);
      }
  
      public Enumeration getAllHeaderLines() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getAllHeaderLines();
      }
  
      public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getMatchingHeaderLines(names);
      }
  
      public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getNonMatchingHeaderLines(names);
      }
  
      public Flags getFlags() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.getFlags();
      }
  
      public boolean isSet(Flags.Flag flag) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          return message.isSet(flag);
      }
  
  
  
  
  
  
  
  
  
  
  
  
  
      /**
       * Various writer methods
       */
      public void setFrom(Address address) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setFrom(address);
      }
  
      public void setFrom() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setFrom();
      }
  
      public void addFrom(Address[] addresses) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.addFrom(addresses);
      }
  
      public void setRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setRecipients(type, addresses);
      }
  
      public void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.addRecipients(type, addresses);
      }
  
      public void setReplyTo(Address[] addresses) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setReplyTo(addresses);
      }
  
      public void setSubject(String subject) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setSubject(subject);
      }
  
      public void setSubject(String subject, String charset) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setSubject(subject, charset);
      }
  
      public void setSentDate(Date d) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setSentDate(d);
      }
  
      public void setDisposition(String disposition) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setDisposition(disposition);
      }
  
      public void setContentID(String cid) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setContentID(cid);
      }
  
      public void setContentMD5(String md5) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setContentMD5(md5);
      }
  
      public void setDescription(String description) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setDescription(description);
      }
  
      public void setDescription(String description, String charset) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setDescription(description, charset);
      }
  
      public void setContentLanguage(String[] languages) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setContentLanguage(languages);
      }
  
      public void setFileName(String filename) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setFileName(filename);
      }
  
      public void setDataHandler(DataHandler dh) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setDataHandler(dh);
      }
  
      public void setContent(Object o, String type) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setContent(o, type);
      }
  
      public void setText(String text) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setText(text);
      }
  
      public void setText(String text, String charset) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setText(text, charset);
      }
  
      public void setContent(Multipart mp) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setContent(mp);
      }
  
      public Message reply(boolean replyToAll) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          return message.reply(replyToAll);
      }
  
      public void setHeader(String name, String value) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setHeader(name, value);
      }
  
      public void addHeader(String name, String value) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.addHeader(name, value);
      }
  
      public void removeHeader(String name) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.removeHeader(name);
      }
  
      public void addHeaderLine(String line) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          message.addHeaderLine(line);
      }
  
      public void setFlags(Flags flag, boolean set) throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.setFlags(flag, set);
      }
  
      public void saveChanges() throws MessagingException {
          if (message == null) {
              loadMessage();
          }
          modified = true;
          message.saveChanges();
      }
  
  }
  
  
  
  1.1                  jakarta-james/src/java/org/apache/james/core/JamesMimeMessageInputStream.java
  
  Index: JamesMimeMessageInputStream.java
  ===================================================================
  package org.apache.james.core;
  
  import java.io.*;
  
  public abstract class JamesMimeMessageInputStream extends InputStream {
      InputStream stream = null;
  
      //Loads the underlying input stream...
      protected abstract InputStream openStream() throws IOException;
  
      public int available() throws IOException {
          if (stream == null) {
              return 0;
          } else {
              return stream.available();
          }
      }
  
      public int read() throws IOException {
          if (stream == null) {
              synchronized (this) {
                  if (stream == null) {
                      stream = openStream();
                  } else {
                      //Another thread has already opened this stream
                  }
              }
          }
          return stream.read();
      }
  
      public synchronized void close() throws IOException {
          if (stream != null) {
              stream.close();
          }
          stream = null;
      }
  
      public synchronized void reset() throws IOException {
          close();
      }
  }
  
  
  1.1                  jakarta-james/src/java/org/apache/james/core/MailImpl.java
  
  Index: MailImpl.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.james.core;
  
  import java.io.*;
  import java.net.*;
  import java.util.*;
  import javax.mail.*;
  import javax.mail.internet.*;
  import org.apache.mailet.*;
  
  /**
   * Wrap a MimeMessage adding routing informations (from SMTP) and same simple API.
   * @author Federico Barbieri <sc...@systemy.it>
   * @author Serge Knystautas <se...@lokitech.com>
   * @version 0.9
   */
  public class MailImpl implements Mail {
      //We hardcode the serialVersionUID so that from James 1.2 on,
      //  MailImpl will be deserializable (so your mail doesn't get lost)
      public static final long serialVersionUID = -4289663364703986260L;
  
      private String errorMessage;
      private String state;
      private MimeMessage message;
      private MailAddress sender;
      private Collection recipients;
      private String name;
      private String remoteHost = "localhost";
      private String remoteAddr = "127.0.0.1";
      private Date lastUpdated = new Date();
  
      public MailImpl() {
          setState(Mail.DEFAULT);
      }
  
      public MailImpl(String name, MailAddress sender, Collection recipients) {
          this();
          this.name = name;
          this.sender = sender;
          this.recipients = recipients;
      }
  
      public MailImpl(String name, MailAddress sender, Collection recipients, InputStream messageIn)
      throws MessagingException {
          this(name, sender, recipients);
          this.setMessage(messageIn);
      }
  
      public MailImpl(String name, MailAddress sender, Collection recipients, MimeMessage message) {
          this(name, sender, recipients);
          this.setMessage(message);
      }
  
      public void clean() {
          message = null;
      }
  
      public Mail duplicate() {
          try {
              return new MailImpl(name, sender, recipients, getMessage());
          } catch (MessagingException me) {
          }
          return (Mail) null;
      }
  
      public Mail duplicate(String newName) {
          try {
              return new MailImpl(newName, sender, recipients, getMessage());
          } catch (MessagingException me) {
          }
          return (Mail) null;
      }
  
      public String getErrorMessage() {
          return errorMessage;
      }
  
      public MimeMessage getMessage() throws MessagingException {
          return message;
      }
  
      public void setName(String name) {
          this.name = name;
      }
  
      public String getName() {
          return name;
      }
  
      public Collection getRecipients() {
          return recipients;
      }
  
      public MailAddress getSender() {
          return sender;
      }
  
      public String getState() {
          return state;
      }
  
      public String getRemoteHost() {
          return remoteHost;
      }
  
      public String getRemoteAddr() {
          return remoteAddr;
      }
  
      public Date getLastUpdated() {
          return lastUpdated;
      }
  
      private void parse(InputStream messageIn) throws MessagingException {
          if (messageIn != null) {
              message = new EnhancedMimeMessage(Session.getDefaultInstance(System.getProperties(), null), messageIn);
          } else {
  	    throw new MessagingException("Attempt to parse null input stream.");
  	}
      }
  
      /**
       * <p>Return the size of the message including its headers.
       * MimeMessage.getSize() method only returns the size of the
       * message body.</p>
       *
       * <p>Note: this size is not guaranteed to be accurate - see Sun's
       * documentation of MimeMessage.getSize().</p>
       *
       * @return approximate size of full message including headers.
       *
       * @author Stuart Roebuck <st...@adolos.co.uk>
       */
      public int getSize() throws MessagingException {
          //SK: Should probably eventually store this as a locally
          //  maintained value (so we don't have to load and reparse
          //  messages each time).
          int size = message.getSize();
          Enumeration e = message.getAllHeaders();
          while (e.hasMoreElements()) {
              size += ((Header)e.nextElement()).toString().length();
           }
          return size;
       }
  
      private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
          try {
              sender = new MailAddress((String) in.readObject());
          } catch (ParseException pe) {
              throw new IOException("Error parsing sender address: " + pe.getMessage());
          }
          recipients = (Collection) in.readObject();
          state = (String) in.readObject();
          errorMessage = (String) in.readObject();
          name = (String) in.readObject();
          remoteHost = (String) in.readObject();
          remoteAddr = (String) in.readObject();
          lastUpdated = (Date) in.readObject();
      }
  
      public void setErrorMessage(String msg) {
          this.errorMessage = msg;
      }
  
      public void setMessage(InputStream in) throws MessagingException {
          this.message = new JamesMimeMessage(Session.getDefaultInstance(System.getProperties(), null), in);
      }
  
      public void setMessage(MimeMessage message) {
          this.message = message;
      }
  
      public void setRecipients(Collection recipients) {
          this.recipients = recipients;
      }
  
      public void setSender(MailAddress sender) {
          this.sender = sender;
      }
  
      public void setState(String state) {
          this.state = state;
      }
  
      public void setRemoteHost(String remoteHost) {
          this.remoteHost = remoteHost;
      }
  
      public void setRemoteAddr(String remoteAddr) {
          this.remoteAddr = remoteAddr;
      }
  
      public void setLastUpdated(Date lastUpdated) {
          this.lastUpdated = lastUpdated;
      }
  
      public void writeMessageTo(OutputStream out) throws IOException, MessagingException {
          if (message != null) {
              message.writeTo(out);
          } else {
  	    throw new MessagingException("No message set for this MailImpl.");
  	}
      }
  
      private void writeObject(java.io.ObjectOutputStream out) throws IOException {
          //System.err.println("saving object");
          lastUpdated = new Date();
          out.writeObject(sender.toString());
          out.writeObject(recipients);
          out.writeObject(state);
          out.writeObject(errorMessage);
          out.writeObject(name);
          out.writeObject(remoteHost);
          out.writeObject(remoteAddr);
          out.writeObject(lastUpdated);
      }
  
      public Mail bounce(String message) throws MessagingException {
  
          //This sends a message to the james component that is a bounce of the sent message
          MimeMessage original = getMessage();
          MimeMessage reply = (MimeMessage) original.reply(false);
          reply.setSubject("Re: " + original.getSubject());
          Collection recipients = new HashSet();
          recipients.add(getSender());
          InternetAddress addr[] = {new InternetAddress(getSender().toString())};
          reply.setRecipients(Message.RecipientType.TO, addr);
          reply.setFrom(new InternetAddress(getRecipients().iterator().next().toString()));
          reply.setText(message);
          reply.setHeader("Message-Id", "replyTo-" + getName());
  
          return new MailImpl("replyTo-" + getName(), new MailAddress(getRecipients().iterator().next().toString()), recipients, reply);
      }
  
      public void writeContentTo(OutputStream out, int lines)
             throws IOException, MessagingException {
          String line;
          BufferedReader br;
          if(message != null) {
              br = new BufferedReader(new InputStreamReader(message.getInputStream()));
              while(lines-- > 0) {
                  if((line = br.readLine()) == null)  break;
                  line += "\r\n";
                  out.write(line.getBytes());
              }
          } else {
  	    throw new MessagingException("No message set for this MailImpl.");
  	}
      }
  }
  
  
  
  1.1                  jakarta-james/src/java/org/apache/james/core/MailetConfigImpl.java
  
  Index: MailetConfigImpl.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.james.core;
  
  import java.io.*;
  import java.net.*;
  import java.util.*;
  import javax.mail.*;
  import javax.mail.internet.*;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.mailet.*;
  
  /**
   *
   * @author Serge Knystautas <se...@lokitech.com>
   */
  public class MailetConfigImpl implements MailetConfig {
      private MailetContext mailetContext;
      private String name;
      //This would probably be better.
      //Properties params = new Properties();
      //Instead, we're tied to the Configuration object
      private Configuration configuration;
  
      public MailetConfigImpl() {
  
      }
  
      public String getInitParameter(String name) {
          try {
              String result = null;
  
              final Configuration[] values = configuration.getChildren( name );
              for ( int i = 0; i < values.length; i++ )
              {
                  if (result == null) {
                      result = "";
                  } else {
                      result += ",";
                  }
                  Configuration conf = values[i];
                  result += conf.getValue();
              }
              return result;
              //return params.getProperty(name);
          } catch (ConfigurationException ce) {
              throw new RuntimeException("Embedded configuration exception was: " + ce.getMessage());
          }
  
      }
  
      public Iterator getInitParameterNames() {
          throw new RuntimeException("Not yet implemented");
          //return params.keySet().iterator();
      }
  
      public MailetContext getMailetContext() {
          return mailetContext;
      }
  
      public void setMailetContext(MailetContext newContext) {
          mailetContext = newContext;
      }
  
      public void setConfiguration(Configuration newConfiguration) {
          configuration = newConfiguration;
      }
  
      public String getMailetName() {
          return name;
      }
  
      public void setMailetName(String newName) {
          name = newName;
      }
  }
  
  
  
  1.1                  jakarta-james/src/java/org/apache/james/core/MatcherConfigImpl.java
  
  Index: MatcherConfigImpl.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.james.core;
  
  import java.io.*;
  import java.net.*;
  import java.util.*;
  import javax.mail.*;
  import javax.mail.internet.*;
  import org.apache.mailet.*;
  
  /**
   *
   * @author Serge Knystautas <se...@lokitech.com>
   */
  public class MatcherConfigImpl implements MatcherConfig {
      private String condition;
      private String name;
      private MailetContext context;
  
      public String getCondition() {
          return condition;
      }
  
      public void setCondition(String newCondition) {
          condition = newCondition;
      }
  
      public String getMatcherName() {
          return name;
      }
  
      public void setMatcherName(String newName) {
          name = newName;
      }
  
      public MailetContext getMailetContext() {
          return context;
      }
  
      public void setMailetContext(MailetContext newContext) {
          context = newContext;
      }
  }
  
  
  
  1.1                  jakarta-james/src/java/org/apache/james/dnsserver/DNSServer.java
  
  Index: DNSServer.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE file.
   */
  package org.apache.james.dnsserver;
  
  import java.net.InetAddress;
  import java.net.UnknownHostException;
  import java.util.Arrays;
  import java.util.Collection;
  import java.util.Comparator;
  import java.util.Enumeration;
  import java.util.Iterator;
  import java.util.Vector;
  import org.apache.avalon.framework.activity.Initializable;
  import org.apache.avalon.framework.component.Component;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.logger.AbstractLoggable;
  import org.apache.james.transport.Resources;
  import org.apache.avalon.phoenix.Block;
  import org.xbill.DNS.*;
  
  /**
   * @version 1.0.0, 18/06/2000
   * @author  Serge Knystautas <se...@lokitech.com>
   */
  public class DNSServer
      extends AbstractLoggable
      implements Block, Configurable, Initializable, 
      org.apache.james.services.DNSServer {
  
      private Resolver resolver;
      private Cache cache;
      private byte dnsCredibility;
      private Collection servers = new Vector();
  
      public void configure( final Configuration configuration )
          throws ConfigurationException {
  
          // Get this servers that this block will use for lookups
          final Configuration serversConfiguration = configuration.getChild( "servers" );
          final Configuration[] serverConfigurations =
              serversConfiguration.getChildren( "server" );
  
          for ( int i = 0; i < serverConfigurations.length; i++ )
          {
              servers.add( serverConfigurations[ i ].getValue() );
          }
  
          final boolean authoritative =
              configuration.getChild( "authoritative" ).getValueAsBoolean( false );
          dnsCredibility = authoritative ? Credibility.AUTH_ANSWER : Credibility.NONAUTH_ANSWER;
      }
  
      public void initialize()
          throws Exception {
  
          getLogger().info("DNSServer init...");
  
          if (servers.isEmpty()) {
              try {
                  servers.add( InetAddress.getLocalHost().getHostName() );
              } catch ( UnknownHostException ue ) {
                  servers.add( "127.0.0.1" );
              }
          }
  
          for (Iterator i = servers.iterator(); i.hasNext(); ) {
              getLogger().info("DNS Servers is: " + i.next());
          }
  
          //Create the extended resolver...
          final String serversArray[] = (String[])servers.toArray(new String[0]);
          resolver = new ExtendedResolver( serversArray );
  
          cache = new Cache ();
  
          getLogger().info("DNSServer ...init end");
      }
  
      public Collection findMXRecords(String hostname) {
          Record answers[] = rawDNSLookup(hostname, false, Type.MX);
  
          Collection servers = new Vector ();
          try {
              if (answers == null) {
                  return servers;
              }
  
              MXRecord mxAnswers[] = new MXRecord[answers.length];
              for (int i = 0; i < answers.length; i++) {
                  mxAnswers[i] = (MXRecord)answers[i];
              }
  
              Comparator prioritySort = new Comparator () {
                      public int compare (Object a, Object b) {
                          MXRecord ma = (MXRecord)a;
                          MXRecord mb = (MXRecord)b;
                          return ma.getPriority () - mb.getPriority ();
                      }
                  };
  
              Arrays.sort(mxAnswers, prioritySort);
  
              for (int i = 0; i < mxAnswers.length; i++) {
                  servers.add(mxAnswers[i].getTarget ().toString ());
              }
              return servers;
          } finally {
              //If we found no results, we'll add the original domain name if
              //it's a valid DNS entry
              if (servers.size () == 0) {
                  try {
                      InetAddress.getByName(hostname);
                      servers.add(hostname);
                  } catch (UnknownHostException uhe) {
                  }
              }
          }
      }
  
      private Record[] rawDNSLookup(String namestr, boolean querysent, short type) {
          Name name = new Name(namestr);
          short dclass = DClass.IN;
  
          Record [] answers;
          int answerCount = 0, n = 0;
          Enumeration e;
  
          SetResponse cached = cache.lookupRecords(name, type, dclass, dnsCredibility);
          if (cached.isSuccessful()) {
              RRset [] rrsets = cached.answers();
              answerCount = 0;
              for (int i = 0; i < rrsets.length; i++) {
                  answerCount += rrsets[i].size();
              }
  
              answers = new Record[answerCount];
  
              for (int i = 0; i < rrsets.length; i++) {
                  e = rrsets[i].rrs();
                  while (e.hasMoreElements()) {
                      Record r = (Record)e.nextElement();
                      answers[n++] = r;
                  }
              }
          }
          else if (cached.isNegative()) {
              return null;
          }
          else if (querysent) {
              return null;
          }
          else {
              Record question = Record.newRecord(name, type, dclass);
              org.xbill.DNS.Message query = org.xbill.DNS.Message.newQuery(question);
              org.xbill.DNS.Message response;
  
              try {
                  response = resolver.send(query);
              }
              catch (Exception ex) {
                  return null;
              }
  
              short rcode = response.getHeader().getRcode();
              if (rcode == Rcode.NOERROR || rcode == Rcode.NXDOMAIN) {
                  cache.addMessage(response);
              }
  
              if (rcode != Rcode.NOERROR) {
                  return null;
              }
  
              return rawDNSLookup(namestr, true, Type.MX);
          }
  
          return answers;
      }
  }
  
  
  
  1.1                  jakarta-james/src/java/org/apache/james/dnsserver/DNSServer.xinfo
  
  Index: DNSServer.xinfo
  ===================================================================
  <?xml version="1.0"?>
  
  <blockinfo>
    <services>
      <service name="org.apache.james.services.DNSServer" version="1.0"/>
    </services>
  
    <dependencies>
    </dependencies>  
  </blockinfo>
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: james-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: james-dev-help@jakarta.apache.org