Create 1.1 release of the 1.4 artifacts. 



git-svn-id: https://svn.apache.org/repos/asf/geronimo/javamail/trunk@546469 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/geronimo-javamail_1.4/LICENSE.txt b/geronimo-javamail_1.4/LICENSE.txt
deleted file mode 100644
index 6b0b127..0000000
--- a/geronimo-javamail_1.4/LICENSE.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
diff --git a/geronimo-javamail_1.4/NOTICE.txt b/geronimo-javamail_1.4/NOTICE.txt
deleted file mode 100644
index 9d2d74b..0000000
--- a/geronimo-javamail_1.4/NOTICE.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Apache Geronimo
-Copyright 2006 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
diff --git a/geronimo-javamail_1.4/README.txt b/geronimo-javamail_1.4/README.txt
deleted file mode 100644
index c39bd24..0000000
--- a/geronimo-javamail_1.4/README.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Building
-========
-
-To build you will need:
-
- * J2SE SDK 1.4.2+ (http://java.sun.com/j2se/1.4.2)
- * Maven 2.0.4+ (http://maven.apache.org)
-
-NOTE: If you use JDK 1.5 you may run into unexpected errors, so stick to 1.4.
-
-To build all changes incrementally:
-
-    mvn install
-
-To perform clean builds, which are sometimes needed after some changes to the 
-source tree:
-
-    mvn clean install
-
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/LICENSE.txt b/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/LICENSE.txt
deleted file mode 100644
index 6b0b127..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/LICENSE.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/NOTICE.txt b/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/NOTICE.txt
deleted file mode 100644
index 439eb83..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/NOTICE.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This product includes software developed by
-The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/pom.xml b/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/pom.xml
deleted file mode 100644
index 4f78543..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/pom.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!-- $Rev$ $Date$ -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.geronimo.javamail</groupId>
-        <artifactId>javamail-1.4</artifactId>
-        <version>1.1-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>geronimo-javamail_1.4_mail</artifactId>
-    <name>Geronimo JavaMail :: 1.4 Mail</name>
-    <packaging>pom</packaging>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>org.apache.geronimo.javamail</groupId>
-            <artifactId>geronimo-javamail_1.4_provider</artifactId>
-            <version>${pom.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-javamail_1.4_spec</artifactId>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>attached</goal>
-                        </goals>
-                        <configuration>
-                            <descriptors>
-                                <descriptor>${pom.basedir}/src/main/assembly/javamail.xml</descriptor>
-                            </descriptors>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/src/main/assembly/javamail.xml b/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/src/main/assembly/javamail.xml
deleted file mode 100644
index 023e8ca..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/src/main/assembly/javamail.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-    
-     http://www.apache.org/licenses/LICENSE-2.0
-    
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!-- $Rev$ $Date$ -->
-
-<assembly>
-    
-    <formats>
-        <format>jar</format>
-    </formats>
-    
-    <includeBaseDirectory>false</includeBaseDirectory>
-    
-    <dependencySets>
-        <dependencySet>
-            <outputDirectory>/</outputDirectory>
-            <unpack>true</unpack>
-            <scope>runtime</scope>
-            <excludes>
-                <exclude>org.apache.geronimo.specs:geronimo-activation_1.1_spec</exclude>
-            </excludes>
-        </dependencySet>
-    </dependencySets>
-    
-</assembly>
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/src/site/site.xml b/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/src/site/site.xml
deleted file mode 100644
index 80f99dd..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_mail/src/site/site.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-    
-     http://www.apache.org/licenses/LICENSE-2.0
-    
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!-- $Rev$ $Date$ -->
-
-<project name="${project.name}">
-    
-    <body>
-        
-        ${parentProject}
-        
-        ${modules}
-        
-        ${reports}
-        
-    </body>
-
-</project>
-
-
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/LICENSE.txt b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/LICENSE.txt
deleted file mode 100644
index 6b0b127..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/LICENSE.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/NOTICE.txt b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/NOTICE.txt
deleted file mode 100644
index 439eb83..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/NOTICE.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This product includes software developed by
-The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/pom.xml b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/pom.xml
deleted file mode 100644
index 91501a9..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/pom.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!-- $Rev$ $Date$ -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.geronimo.javamail</groupId>
-        <artifactId>javamail-1.4</artifactId>
-        <version>1.1-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>geronimo-javamail_1.4_provider</artifactId>
-    <name>Geronimo JavaMail :: 1.4 Provider</name>
-
-    <dependencies>
-
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-activation_1.1_spec</artifactId>
-            <version>1.0-M1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-javamail_1.4_spec</artifactId>
-            <version>1.0-M1</version>
-        </dependency>
-
-    </dependencies>
-
-</project>
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/ClientAuthenticator.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/ClientAuthenticator.java
deleted file mode 100644
index 0404d36..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/ClientAuthenticator.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.authentication;
-
-import javax.mail.MessagingException;
-
-/**
- * Simplified version of the Java 5 SaslClient interface. This is used to
- * implement a javamail authentication framework that mimics the Sasl framework
- * on a 1.4.2 JVM. Only the methods required by the Javamail code are
- * implemented here, but it should be a simple migration to the fuller SASL
- * interface.
- */
-public interface ClientAuthenticator {
-    /**
-     * Evaluate a challenge and return a response that can be sent back to the
-     * server. Bot the challenge information and the response information are
-     * "raw data", minus any special encodings used by the transport. For
-     * example, SMTP DIGEST-MD5 authentication protocol passes information as
-     * Base64 encoded strings. That encoding must be removed before calling
-     * evaluateChallenge() and the resulting respose must be Base64 encoced
-     * before transmission to the server.
-     * 
-     * It is the authenticator's responsibility to keep track of the state of
-     * the evaluations. That is, if the authentication process requires multiple
-     * challenge/response cycles, then the authenticator needs to keep track of
-     * context of the challenges.
-     * 
-     * @param challenge
-     *            The challenge data.
-     * 
-     * @return An appropriate response for the challenge data.
-     */
-
-    public byte[] evaluateChallenge(byte[] challenge) throws MessagingException;
-
-    /**
-     * Indicates that the authenticator has data that should be sent when the
-     * authentication process is initiated. For example, the SMTP PLAIN
-     * authentication sends userid/password without waiting for a challenge
-     * response.
-     * 
-     * If this method returns true, then the initial response is retrieved using
-     * evaluateChallenge() passing null for the challenge information.
-     * 
-     * @return True if the challenge/response process starts with an initial
-     *         response on the client side.
-     */
-    public boolean hasInitialResponse();
-
-    /**
-     * Indicates whether the client believes the challenge/response sequence is
-     * now complete.
-     * 
-     * @return true if the client has evaluated what it believes to be the last
-     *         challenge, false if there are additional stages to evaluate.
-     */
-
-    public boolean isComplete();
-
-    /**
-     * Return the mechanism name implemented by this authenticator.
-     * 
-     * @return The string name of the authentication mechanism. This name should
-     *         match the names commonly used by the mail servers (e.g., "PLAIN",
-     *         "LOGIN", "DIGEST-MD5", etc.).
-     */
-    public String getMechanismName();
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/CramMD5Authenticator.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/CramMD5Authenticator.java
deleted file mode 100644
index 17da4db..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/CramMD5Authenticator.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.authentication;
-
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-import javax.mail.MessagingException;
-
-import org.apache.geronimo.mail.util.Hex;
-
-public class CramMD5Authenticator implements ClientAuthenticator {
-
-    // the user we're authenticating
-    protected String username;
-
-    // the user's password (the "shared secret")
-    protected String password;
-
-    // indicates whether we've gone through the entire challenge process.
-    protected boolean complete = false;
-
-    /**
-     * Main constructor.
-     * 
-     * @param username
-     *            The login user name.
-     * @param password
-     *            The login password.
-     */
-    public CramMD5Authenticator(String username, String password) {
-        this.username = username;
-        this.password = password;
-    }
-
-    /**
-     * Respond to the hasInitialResponse query. This mechanism does not have an
-     * initial response.
-     * 
-     * @return Always returns false.
-     */
-    public boolean hasInitialResponse() {
-        return false;
-    }
-
-    /**
-     * Indicate whether the challenge/response process is complete.
-     * 
-     * @return True if the last challenge has been processed, false otherwise.
-     */
-    public boolean isComplete() {
-        return complete;
-    }
-
-    /**
-     * Retrieve the authenticator mechanism name.
-     * 
-     * @return Always returns the string "CRAM-MD5"
-     */
-    public String getMechanismName() {
-        return "CRAM-MD5";
-    }
-
-    /**
-     * Evaluate a CRAM-MD5 login challenge, returning the a result string that
-     * should satisfy the clallenge.
-     * 
-     * @param challenge
-     *            The decoded challenge data, as a byte array.
-     * 
-     * @return A formatted challege response, as an array of bytes.
-     * @exception MessagingException
-     */
-    public byte[] evaluateChallenge(byte[] challenge) throws MessagingException {
-        // we create the challenge from the userid and password information (the
-        // "shared secret").
-        byte[] passBytes;
-
-        try {
-            // get the password in an UTF-8 encoding to create the token
-            passBytes = password.getBytes("UTF-8");
-            // compute the password digest using the key
-            byte[] digest = computeCramDigest(passBytes, challenge);
-
-            // create a unified string using the user name and the hex encoded
-            // digest
-            String responseString = username + " " + new String(Hex.encode(digest));
-            complete = true;
-            return responseString.getBytes();
-        } catch (UnsupportedEncodingException e) {
-            // got an error, fail this
-            throw new MessagingException("Invalid character encodings");
-        }
-
-    }
-
-    /**
-     * Compute a CRAM digest using the hmac_md5 algorithm. See the description
-     * of RFC 2104 for algorithm details.
-     * 
-     * @param key
-     *            The key (K) for the calculation.
-     * @param input
-     *            The encrypted text value.
-     * 
-     * @return The computed digest, as a byte array value.
-     * @exception NoSuchAlgorithmException
-     */
-    protected byte[] computeCramDigest(byte[] key, byte[] input) throws MessagingException {
-        // CRAM digests are computed using the MD5 algorithm.
-        MessageDigest digest;
-        try {
-            digest = MessageDigest.getInstance("MD5");
-        } catch (NoSuchAlgorithmException e) {
-            throw new MessagingException("Unable to access MD5 message digest", e);
-        }
-
-        // if the key is longer than 64 bytes, then we get a digest of the key
-        // and use that instead.
-        // this is required by RFC 2104.
-        if (key.length > 64) {
-            digest.update(key);
-            key = digest.digest();
-        }
-
-        // now we create two 64 bit padding keys, initialized with the key
-        // information.
-        byte[] ipad = new byte[64];
-        byte[] opad = new byte[64];
-
-        System.arraycopy(key, 0, ipad, 0, key.length);
-        System.arraycopy(key, 0, opad, 0, key.length);
-
-        // and these versions are munged by XORing with "magic" values.
-
-        for (int i = 0; i < 64; i++) {
-            ipad[i] ^= 0x36;
-            opad[i] ^= 0x5c;
-        }
-
-        // now there are a pair of MD5 operations performed, and inner and an
-        // outer. The spec defines this as
-        // H(K XOR opad, H(K XOR ipad, text)), where H is the MD5 operation.
-
-        // inner operation
-        digest.reset();
-        digest.update(ipad);
-        digest.update(input); // this appends the text to the pad
-        byte[] md5digest = digest.digest();
-
-        // outer operation
-        digest.reset();
-        digest.update(opad);
-        digest.update(md5digest);
-        return digest.digest(); // final result
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/DigestMD5Authenticator.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/DigestMD5Authenticator.java
deleted file mode 100644
index c762f70..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/DigestMD5Authenticator.java
+++ /dev/null
@@ -1,624 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.authentication;
-
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-
-import javax.mail.AuthenticationFailedException;
-import javax.mail.MessagingException;
-
-import org.apache.geronimo.mail.util.Base64;
-import org.apache.geronimo.mail.util.Hex;
-
-/**
- * Process a DIGEST-MD5 authentication, using the challenge/response mechanisms.
- */
-public class DigestMD5Authenticator implements ClientAuthenticator {
-
-    protected static final int AUTHENTICATE_CLIENT = 0;
-
-    protected static final int AUTHENTICATE_SERVER = 1;
-
-    protected static final int AUTHENTICATION_COMPLETE = 2;
-
-    // the host server name
-    protected String host;
-
-    // the user we're authenticating
-    protected String username;
-
-    // the user's password (the "shared secret")
-    protected String password;
-
-    // the target login realm
-    protected String realm;
-
-    // our message digest for processing the challenges.
-    MessageDigest digest;
-
-    // the string we send to the server on the first challenge.
-    protected String clientResponse;
-
-    // the response back from an authentication challenge.
-    protected String authenticationResponse = null;
-
-    // our list of realms received from the server (normally just one).
-    protected ArrayList realms;
-
-    // the nonce value sent from the server
-    protected String nonce;
-
-    // indicates whether we've gone through the entire challenge process.
-    protected int stage = AUTHENTICATE_CLIENT;
-
-    /**
-     * Main constructor.
-     * 
-     * @param host
-     *            The server host name.
-     * @param username
-     *            The login user name.
-     * @param password
-     *            The login password.
-     * @param realm
-     *            The target login realm (can be null).
-     */
-    public DigestMD5Authenticator(String host, String username, String password, String realm) {
-        this.host = host;
-        this.username = username;
-        this.password = password;
-        this.realm = realm;
-    }
-
-    /**
-     * Respond to the hasInitialResponse query. This mechanism does not have an
-     * initial response.
-     * 
-     * @return Always returns false.
-     */
-    public boolean hasInitialResponse() {
-        return false;
-    }
-
-    /**
-     * Indicate whether the challenge/response process is complete.
-     * 
-     * @return True if the last challenge has been processed, false otherwise.
-     */
-    public boolean isComplete() {
-        return stage == AUTHENTICATION_COMPLETE;
-    }
-
-    /**
-     * Retrieve the authenticator mechanism name.
-     * 
-     * @return Always returns the string "DIGEST-MD5"
-     */
-    public String getMechanismName() {
-        return "DIGEST-MD5";
-    }
-
-    /**
-     * Evaluate a DIGEST-MD5 login challenge, returning the a result string that
-     * should satisfy the clallenge.
-     * 
-     * @param challenge
-     *            The decoded challenge data, as a string.
-     * 
-     * @return A formatted challege response, as an array of bytes.
-     * @exception MessagingException
-     */
-    public byte[] evaluateChallenge(byte[] challenge) throws MessagingException {
-
-        // DIGEST-MD5 authentication goes in two stages. First state involves us
-        // validating with the
-        // server, the second stage is the server validating with us, using the
-        // shared secret.
-        switch (stage) {
-        // stage one of the process.
-        case AUTHENTICATE_CLIENT: {
-            // get the response and advance the processing stage.
-            byte[] response = authenticateClient(challenge);
-            stage = AUTHENTICATE_SERVER;
-            return response;
-        }
-
-        // stage two of the process.
-        case AUTHENTICATE_SERVER: {
-            // get the response and advance the processing stage to completed.
-            byte[] response = authenticateServer(challenge);
-            stage = AUTHENTICATION_COMPLETE;
-            return response;
-        }
-
-        // should never happen.
-        default:
-            throw new MessagingException("Invalid LOGIN challenge");
-        }
-    }
-
-    /**
-     * Evaluate a DIGEST-MD5 login server authentication challenge, returning
-     * the a result string that should satisfy the clallenge.
-     * 
-     * @param challenge
-     *            The decoded challenge data, as a string.
-     * 
-     * @return A formatted challege response, as an array of bytes.
-     * @exception MessagingException
-     */
-    public byte[] authenticateServer(byte[] challenge) throws MessagingException {
-        // parse the challenge string and validate.
-        if (!parseChallenge(challenge)) {
-            return null;
-        }
-
-        try {
-            // like all of the client validation steps, the following is order
-            // critical.
-            // first add in the URI information.
-            digest.update((":smtp/" + host).getBytes("US-ASCII"));
-            // now mix in the response we sent originally
-            String responseString = clientResponse + new String(Hex.encode(digest.digest()));
-            digest.update(responseString.getBytes("US-ASCII"));
-
-            // now convert that into a hex encoded string.
-            String validationText = new String(Hex.encode(digest.digest()));
-
-            // if everything went well, this calculated value should match what
-            // we got back from the server.
-            // our response back is just a null string....
-            if (validationText.equals(authenticationResponse)) {
-                return new byte[0];
-            }
-            throw new AuthenticationFailedException("Invalid DIGEST-MD5 response from server");
-        } catch (UnsupportedEncodingException e) {
-            throw new MessagingException("Invalid character encodings");
-        }
-
-    }
-
-    /**
-     * Evaluate a DIGEST-MD5 login client authentication challenge, returning
-     * the a result string that should satisfy the clallenge.
-     * 
-     * @param challenge
-     *            The decoded challenge data, as a string.
-     * 
-     * @return A formatted challege response, as an array of bytes.
-     * @exception MessagingException
-     */
-    public byte[] authenticateClient(byte[] challenge) throws MessagingException {
-        // parse the challenge string and validate.
-        if (!parseChallenge(challenge)) {
-            return null;
-        }
-
-        SecureRandom randomGenerator;
-        // before doing anything, make sure we can get the required crypto
-        // support.
-        try {
-            randomGenerator = new SecureRandom();
-            digest = MessageDigest.getInstance("MD5");
-        } catch (NoSuchAlgorithmException e) {
-            throw new MessagingException("Unable to access cryptography libraries");
-        }
-
-        // if not configured for a realm, take the first realm from the list, if
-        // any
-        if (realm == null) {
-            // if not handed any realms, just use the host name.
-            if (realms.isEmpty()) {
-                realm = host;
-            } else {
-                // pretty arbitrary at this point, so just use the first one.
-                realm = (String) realms.get(0);
-            }
-        }
-
-        // use secure random to generate a collection of bytes. that is our
-        // cnonce value.
-        byte[] cnonceBytes = new byte[32];
-
-        randomGenerator.nextBytes(cnonceBytes);
-        // and get this as a base64 encoded string.
-        String cnonce = new String(Base64.encode(cnonceBytes));
-
-        // Now the digest computation part. This gets a bit tricky, and must be
-        // done in strict order.
-
-        try {
-            // this identifies where we're logging into.
-            String idString = username + ":" + realm + ":" + password;
-            // we get a digest for this string, then use the digest for the
-            // first stage
-            // of the next digest operation.
-            digest.update(digest.digest(idString.getBytes("US-ASCII")));
-
-            // now we add the nonce strings to the digest.
-            String nonceString = ":" + nonce + ":" + cnonce;
-            digest.update(nonceString.getBytes("US-ASCII"));
-
-            // hex encode this digest, and add on the string values
-            // NB, we only support "auth" for the quality of protection value
-            // (qop). We save this in an
-            // instance variable because we'll need this to validate the
-            // response back from the server.
-            clientResponse = new String(Hex.encode(digest.digest())) + ":" + nonce + ":00000001:" + cnonce + ":auth:";
-
-            // now we add in identification values to the hash.
-            String authString = "AUTHENTICATE:smtp/" + host;
-            digest.update(authString.getBytes("US-ASCII"));
-
-            // this gets added on to the client response
-            String responseString = clientResponse + new String(Hex.encode(digest.digest()));
-            // and this gets fed back into the digest
-            digest.update(responseString.getBytes("US-ASCII"));
-
-            // and FINALLY, the challege digest is hex encoded for sending back
-            // to the server (whew).
-            String challengeResponse = new String(Hex.encode(digest.digest()));
-
-            // now finally build the keyword/value part of the challenge
-            // response. These can be
-            // in any order.
-            StringBuffer response = new StringBuffer();
-
-            response.append("username=\"");
-            response.append(username);
-            response.append("\"");
-
-            response.append(",realm=\"");
-            response.append(realm);
-            response.append("\"");
-
-            // we only support auth qop values, and the nonce-count (nc) is
-            // always 1.
-            response.append(",qop=auth");
-            response.append(",nc=00000001");
-
-            response.append(",nonce=\"");
-            response.append(nonce);
-            response.append("\"");
-
-            response.append(",cnonce=\"");
-            response.append(cnonce);
-            response.append("\"");
-
-            response.append(",digest-uri=\"smtp/");
-            response.append(host);
-            response.append("\"");
-
-            response.append(",response=");
-            response.append(challengeResponse);
-
-            return response.toString().getBytes("US-ASCII");
-
-        } catch (UnsupportedEncodingException e) {
-            throw new MessagingException("Invalid character encodings");
-        }
-    }
-
-    /**
-     * Parse the challege string, pulling out information required for our
-     * challenge response.
-     * 
-     * @param challenge
-     *            The challenge data.
-     * 
-     * @return true if there were no errors parsing the string, false otherwise.
-     * @exception MessagingException
-     */
-    protected boolean parseChallenge(byte[] challenge) throws MessagingException {
-        realms = new ArrayList();
-
-        DigestParser parser = new DigestParser(new String(challenge));
-
-        // parse the entire string...but we ignore everything but the options we
-        // support.
-        while (parser.hasMore()) {
-            NameValuePair pair = parser.parseNameValuePair();
-
-            String name = pair.name;
-
-            // realm to add to our list?
-            if (name.equalsIgnoreCase("realm")) {
-                realms.add(pair.value);
-            }
-            // we need the nonce to evaluate the client challenge.
-            else if (name.equalsIgnoreCase("nonce")) {
-                nonce = pair.value;
-            }
-            // rspauth is the challenge replay back, which allows us to validate
-            // that server is also legit.
-            else if (name.equalsIgnoreCase("rspauth")) {
-                authenticationResponse = pair.value;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Inner class for parsing a DIGEST-MD5 challenge string, which is composed
-     * of "name=value" pairs, separated by "," characters.
-     */
-    class DigestParser {
-        // the challenge we're parsing
-        String challenge;
-
-        // length of the challenge
-        int length;
-
-        // current parsing position
-        int position;
-
-        /**
-         * Normal constructor.
-         * 
-         * @param challenge
-         *            The challenge string to be parsed.
-         */
-        public DigestParser(String challenge) {
-            this.challenge = challenge;
-            this.length = challenge.length();
-            position = 0;
-        }
-
-        /**
-         * Test if there are more values to parse.
-         * 
-         * @return true if we've not reached the end of the challenge string,
-         *         false if the challenge has been completely consumed.
-         */
-        private boolean hasMore() {
-            return position < length;
-        }
-
-        /**
-         * Return the character at the current parsing position.
-         * 
-         * @return The string character for the current parse position.
-         */
-        private char currentChar() {
-            return challenge.charAt(position);
-        }
-
-        /**
-         * step forward to the next character position.
-         */
-        private void nextChar() {
-            position++;
-        }
-
-        /**
-         * Skip over any white space characters in the challenge string.
-         */
-        private void skipSpaces() {
-            while (position < length && Character.isWhitespace(currentChar())) {
-                position++;
-            }
-        }
-
-        /**
-         * Parse a quoted string used with a name/value pair, accounting for
-         * escape characters embedded within the string.
-         * 
-         * @return The string value of the character string.
-         */
-        private String parseQuotedValue() {
-            // we're here because we found the starting double quote. Step over
-            // it and parse to the closing
-            // one.
-            nextChar();
-
-            StringBuffer value = new StringBuffer();
-
-            while (hasMore()) {
-                char ch = currentChar();
-
-                // is this an escape char?
-                if (ch == '\\') {
-                    // step past this, and grab the following character
-                    nextChar();
-                    // we have an invalid quoted string....
-                    if (!hasMore()) {
-                        return null;
-                    }
-                    value.append(currentChar());
-                }
-                // end of the string?
-                else if (ch == '"') {
-                    // step over this so the caller doesn't process it.
-                    nextChar();
-                    // return the constructed string.
-                    return value.toString();
-                } else {
-                    // step over the character and contine with the next
-                    // characteer1
-                    value.append(ch);
-                }
-                nextChar();
-            }
-            /* fell off the end without finding a closing quote! */
-            return null;
-        }
-
-        /**
-         * Parse a token value used with a name/value pair.
-         * 
-         * @return The string value of the token. Returns null if nothing is
-         *         found up to the separater.
-         */
-        private String parseTokenValue() {
-
-            StringBuffer value = new StringBuffer();
-
-            while (hasMore()) {
-                char ch = currentChar();
-                switch (ch) {
-                // process the token separators.
-                case ' ':
-                case '\t':
-                case '(':
-                case ')':
-                case '<':
-                case '>':
-                case '@':
-                case ',':
-                case ';':
-                case ':':
-                case '\\':
-                case '"':
-                case '/':
-                case '[':
-                case ']':
-                case '?':
-                case '=':
-                case '{':
-                case '}':
-                    // no token characters found? this is bad.
-                    if (value.length() == 0) {
-                        return null;
-                    }
-                    // return the accumulated characters.
-                    return value.toString();
-
-                default:
-                    // is this a control character? That's a delimiter (likely
-                    // invalid for the next step,
-                    // but it is a token terminator.
-                    if (ch < 32 || ch > 127) {
-                        // no token characters found? this is bad.
-                        if (value.length() == 0) {
-                            return null;
-                        }
-                        // return the accumulated characters.
-                        return value.toString();
-                    }
-                    value.append(ch);
-                    break;
-                }
-                // step to the next character.
-                nextChar();
-            }
-            // no token characters found? this is bad.
-            if (value.length() == 0) {
-                return null;
-            }
-            // return the accumulated characters.
-            return value.toString();
-        }
-
-        /**
-         * Parse out a name token of a name/value pair.
-         * 
-         * @return The string value of the name.
-         */
-        private String parseName() {
-            // skip to the value start
-            skipSpaces();
-
-            // the name is a token.
-            return parseTokenValue();
-        }
-
-        /**
-         * Parse out a a value of a name/value pair.
-         * 
-         * @return The string value associated with the name.
-         */
-        private String parseValue() {
-            // skip to the value start
-            skipSpaces();
-
-            // start of a quoted string?
-            if (currentChar() == '"') {
-                // parse it out as a string.
-                return parseQuotedValue();
-            }
-            // the value must be a token.
-            return parseTokenValue();
-        }
-
-        /**
-         * Parse a name/value pair in an DIGEST-MD5 string.
-         * 
-         * @return A NameValuePair object containing the two parts of the value.
-         * @exception MessagingException
-         */
-        public NameValuePair parseNameValuePair() throws MessagingException {
-            // get the name token
-            String name = parseName();
-            if (name == null) {
-                throw new MessagingException("Name syntax error");
-            }
-
-            // the name should be followed by an "=" sign
-            if (!hasMore() || currentChar() != '=') {
-                throw new MessagingException("Name/value pair syntax error");
-            }
-
-            // step over the equals
-            nextChar();
-
-            // now get the value part
-            String value = parseValue();
-            if (value == null) {
-                throw new MessagingException("Name/value pair syntax error");
-            }
-
-            // skip forward to the terminator, which should either be the end of
-            // the line or a ","
-            skipSpaces();
-            // all that work, only to have a syntax error at the end (sigh)
-            if (hasMore()) {
-                if (currentChar() != ',') {
-                    throw new MessagingException("Name/value pair syntax error");
-                }
-                // step over, and make sure we position ourselves at either the
-                // end or the first
-                // real character for parsing the next name/value pair.
-                nextChar();
-                skipSpaces();
-            }
-            return new NameValuePair(name, value);
-        }
-    }
-
-    /**
-     * Simple inner class to represent a name/value pair.
-     */
-    public class NameValuePair {
-        public String name;
-
-        public String value;
-
-        NameValuePair(String name, String value) {
-            this.name = name;
-            this.value = value;
-        }
-
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/LoginAuthenticator.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/LoginAuthenticator.java
deleted file mode 100644
index 9c52f62..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/LoginAuthenticator.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.authentication;
-
-import java.io.UnsupportedEncodingException;
-
-import javax.mail.MessagingException;
-
-public class LoginAuthenticator implements ClientAuthenticator {
-
-    // constants for the authentication stages
-    protected static final int USERNAME = 0;
-
-    protected static final int PASSWORD = 1;
-
-    protected static final int COMPLETE = 2;
-
-    // the user we're authenticating
-    protected String username;
-
-    // the user's password (the "shared secret")
-    protected String password;
-
-    // indicates whether we've gone through the entire challenge process.
-    protected int stage = USERNAME;
-
-    /**
-     * Main constructor.
-     * 
-     * @param username
-     *            The login user name.
-     * @param password
-     *            The login password.
-     */
-    public LoginAuthenticator(String username, String password) {
-        this.username = username;
-        this.password = password;
-    }
-
-    /**
-     * Respond to the hasInitialResponse query. This mechanism does not have an
-     * initial response.
-     * 
-     * @return Always returns false;
-     */
-    public boolean hasInitialResponse() {
-        return false;
-    }
-
-    /**
-     * Indicate whether the challenge/response process is complete.
-     * 
-     * @return True if the last challenge has been processed, false otherwise.
-     */
-    public boolean isComplete() {
-        return stage == COMPLETE;
-    }
-
-    /**
-     * Retrieve the authenticator mechanism name.
-     * 
-     * @return Always returns the string "LOGIN"
-     */
-    public String getMechanismName() {
-        return "LOGIN";
-    }
-
-    /**
-     * Evaluate a PLAIN login challenge, returning the a result string that
-     * should satisfy the clallenge.
-     * 
-     * @param challenge
-     *            The decoded challenge data, as a byte array
-     * 
-     * @return A formatted challege response, as an array of bytes.
-     * @exception MessagingException
-     */
-    public byte[] evaluateChallenge(byte[] challenge) throws MessagingException {
-
-        // process the correct stage for the challenge
-        switch (stage) {
-        // should never happen
-        case COMPLETE:
-            throw new MessagingException("Invalid LOGIN challenge");
-
-        case USERNAME: {
-            byte[] userBytes;
-
-            try {
-                // get the username and password in an UTF-8 encoding to create
-                // the token
-                userBytes = username.getBytes("UTF-8");
-            } catch (UnsupportedEncodingException e) {
-                // got an error, fail this (this should never happen).
-                throw new MessagingException("Invalid encoding");
-            }
-
-            // next time through we're looking for a password.
-            stage = PASSWORD;
-            // the user bytes are the entire challenge respose.
-            return userBytes;
-        }
-
-        case PASSWORD: {
-            byte[] passBytes;
-
-            try {
-                // get the username and password in an UTF-8 encoding to create
-                // the token
-                passBytes = password.getBytes("UTF-8");
-            } catch (UnsupportedEncodingException e) {
-                // got an error, fail this (this should never happen).
-                throw new MessagingException("Invalid encoding");
-            }
-            // we're finished
-            stage = COMPLETE;
-            return passBytes;
-        }
-        }
-        // should never get here.
-        throw new MessagingException("Invalid LOGIN challenge");
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/PlainAuthenticator.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/PlainAuthenticator.java
deleted file mode 100644
index 95711ed..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/authentication/PlainAuthenticator.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.authentication;
-
-import java.io.UnsupportedEncodingException;
-
-import javax.mail.MessagingException;
-
-public class PlainAuthenticator implements ClientAuthenticator {
-
-    // the user we're authenticating
-    protected String username;
-
-    // the user's password (the "shared secret")
-    protected String password;
-
-    // indicates whether we've gone through the entire challenge process.
-    protected boolean complete = false;
-
-    /**
-     * Main constructor.
-     * 
-     * @param username
-     *            The login user name.
-     * @param password
-     *            The login password.
-     */
-    public PlainAuthenticator(String username, String password) {
-        this.username = username;
-        this.password = password;
-    }
-
-    /**
-     * Respond to the hasInitialResponse query. This mechanism does have an
-     * initial response, which is the entire challenge sequence.
-     * 
-     * @return Always returns true.
-     */
-    public boolean hasInitialResponse() {
-        return true;
-    }
-
-    /**
-     * Indicate whether the challenge/response process is complete.
-     * 
-     * @return True if the last challenge has been processed, false otherwise.
-     */
-    public boolean isComplete() {
-        return complete;
-    }
-
-    /**
-     * Retrieve the authenticator mechanism name.
-     * 
-     * @return Always returns the string "PLAIN"
-     */
-    public String getMechanismName() {
-        return "PLAIN";
-    }
-
-    /**
-     * Evaluate a PLAIN login challenge, returning the a result string that
-     * should satisfy the clallenge.
-     * 
-     * @param challenge
-     *            The decoded challenge data, as byte array.
-     * 
-     * @return A formatted challege response, as an array of bytes.
-     * @exception MessagingException
-     */
-    public byte[] evaluateChallenge(byte[] challenge) throws MessagingException {
-        try {
-            // get the username and password in an UTF-8 encoding to create the
-            // token
-            byte[] userBytes = username.getBytes("UTF-8");
-            byte[] passBytes = password.getBytes("UTF-8");
-
-            // our token has two copies of the username, one copy of the
-            // password, and nulls
-            // between
-            byte[] tokenBytes = new byte[(userBytes.length * 2) + passBytes.length + 2];
-
-            System.arraycopy(userBytes, 0, tokenBytes, 0, userBytes.length);
-            System.arraycopy(userBytes, 0, tokenBytes, userBytes.length + 1, userBytes.length);
-            System.arraycopy(passBytes, 0, tokenBytes, (userBytes.length * 2) + 2, passBytes.length);
-
-            complete = true;
-            return tokenBytes;
-
-        } catch (UnsupportedEncodingException e) {
-            // got an error, fail this
-            throw new MessagingException("Invalid encoding");
-        }
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPFolder.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPFolder.java
deleted file mode 100644
index ba330e2..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPFolder.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.nntp;
-
-import javax.mail.Flags;
-import javax.mail.Folder;
-import javax.mail.IllegalWriteException;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.MethodNotSupportedException;
-import javax.mail.Session;
-import javax.mail.event.ConnectionEvent;
-
-import org.apache.geronimo.javamail.transport.nntp.NNTPConnection;
-
-/**
- * The base NNTP implementation of the javax.mail.Folder This is a base class
- * for both the Root NNTP server and each NNTP group folder.
- * 
- * @see javax.mail.Folder
- * 
- * @version $Rev$
- */
-public class NNTPFolder extends Folder {
-
-    // our active connection.
-    protected NNTPConnection connection;
-
-    // our attached session
-    protected Session session;
-
-    // the name of this folder (either the name of the server for the root or
-    // the news group name).
-    protected String name;
-
-    // the "full" name of the folder. For the root folder, this is the name
-    // returned by the connection
-    // welcome string. Otherwise, this is the same as the name.
-    protected String fullName;
-
-    // the parent folder. For the root folder, this is null. For a group folder,
-    // this is the root.
-    protected Folder parent;
-
-    // the folder open state
-    protected boolean folderOpen = false;
-
-    // the folder message count. For the root folder, this is always 0.
-    protected int messageCount = 0;
-
-    // the persistent flags we save in the store (basically just the SEEN flag).
-    protected Flags permanentFlags;
-
-    /**
-     * Super class constructor the base NNTPFolder class.
-     * 
-     * @param store
-     *            The javamail store this folder is attached to.
-     */
-    protected NNTPFolder(NNTPStore store) {
-        super(store);
-        // get the active connection from the store...all commands are sent
-        // there
-        this.connection = store.getConnection();
-        this.session = store.getSession();
-
-        // set up our permanent flags bit.
-        permanentFlags = new Flags();
-        permanentFlags.add(Flags.Flag.SEEN);
-    }
-
-    /**
-     * Retrieve the folder name.
-     * 
-     * @return The folder's name.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Retrieve the folder's full name (including hierarchy information). NNTP
-     * folders are flat, so the full name is generally the same as the name.
-     * 
-     * @return The full name value.
-     */
-    public String getFullName() {
-        return fullName;
-    }
-
-    /**
-     * Returns the parent folder for this folder. Returns null if this is the
-     * root folder.
-     */
-    public Folder getParent() throws MessagingException {
-        return parent;
-    }
-
-    /**
-     * Indicated whether the folder "exists" or not. Existance in this context
-     * indicates that the group still exists on the server.
-     * 
-     * @return
-     * @exception MessagingException
-     */
-    public boolean exists() throws MessagingException {
-        // by default, return true. This is really only the case for the root.
-        // The group folder will
-        // need to override this.
-        return true;
-    }
-
-    /**
-     * List the subfolders. For group folders, this is a meaningless so we throw
-     * a MethodNotSupportedException.
-     * 
-     * @param pattern
-     *            The folder pattern string.
-     * 
-     * @return Never returns.
-     * @exception MessagingException
-     */
-    public Folder[] list(String pattern) throws MessagingException {
-        throw new MethodNotSupportedException("NNTP group folders cannot contain sub folders");
-    }
-
-    /**
-     * Retrieve the list of subscribed folders that match the given pattern
-     * string.
-     * 
-     * @param pattern
-     *            The pattern string used for the matching
-     * 
-     * @return An array of matching folders from the subscribed list.
-     */
-    public Folder[] listSubscribed(String pattern) throws MessagingException {
-        throw new MethodNotSupportedException("NNTP group folders cannot contain sub folders");
-    }
-
-    /**
-     * No sub folders, hence there is no notion of a seperator. We return a null
-     * character (consistent with what Sun returns for POP3 folders).
-     */
-    public char getSeparator() throws MessagingException {
-        return '\0';
-    }
-
-    /**
-     * Return whether this folder can hold just messages or also subfolders.
-     * Only the root folder can hold other folders, so it will need to override.
-     * 
-     * @return Either Folder.HOLDS_MESSAGES or Folder.HOLDS_FOLDERS.
-     * @exception MessagingException
-     */
-    public int getType() throws MessagingException {
-        return HOLDS_MESSAGES;
-    }
-
-    /**
-     * Create a new folder. NNTP folders are read only, so this is a nop.
-     * 
-     * @param type
-     *            The type of folder.
-     * 
-     * @return Not support, throws an exception.
-     * @exception MessagingException
-     */
-    public boolean create(int type) throws MessagingException {
-        throw new MethodNotSupportedException("Sub folders cannot be created in NNTP");
-    }
-
-    /**
-     * Check for new messages. We always return false for the root folder. The
-     * group folders will need to override.
-     * 
-     * @return Always returns false.
-     * @exception MessagingException
-     */
-    public boolean hasNewMessages() throws MessagingException {
-        return false;
-    }
-
-    /**
-     * Get a named subfolder from this folder. This only has meaning from the
-     * root NNTP folder.
-     * 
-     * @param name
-     *            The requested name.
-     * 
-     * @return If the folder exists, returns a Folder object representing the
-     *         named folder.
-     * @exception MessagingException
-     */
-    public Folder getFolder(String name) throws MessagingException {
-        throw new MethodNotSupportedException("NNTP Group folders do not support sub folders");
-    }
-
-    /**
-     * Delete a folder. This is not supported for NNTP.
-     * 
-     * @param recurse
-     *            The recusion flag.
-     * 
-     * @return Never returns.
-     * @exception MessagingException
-     */
-    public boolean delete(boolean recurse) throws MessagingException {
-        throw new MethodNotSupportedException("Deleting of NNTP folders is not supported");
-    }
-
-    /**
-     * Rename a folder. Not supported for NNTP folders.
-     * 
-     * @param f
-     *            The new folder specifying the rename location.
-     * 
-     * @return
-     * @exception MessagingException
-     */
-    public boolean renameTo(Folder f) throws MessagingException {
-        throw new MethodNotSupportedException("Renaming of NNTP folders is not supported.");
-    }
-
-    /**
-     * @see javax.mail.Folder#open(int)
-     */
-    public void open(int mode) throws MessagingException {
-
-        // we don't support READ_WRITE mode, so don't allow opening in that
-        // mode.
-        if (mode == READ_WRITE) {
-            throw new IllegalWriteException("Newsgroup folders cannot be opened read/write");
-        }
-
-        // an only be performed on a closed folder
-        checkClosed();
-
-        this.mode = mode;
-
-        // perform folder type-specific open actions.
-        openFolder();
-
-        folderOpen = true;
-
-        notifyConnectionListeners(ConnectionEvent.OPENED);
-    }
-
-    /**
-     * Perform folder type-specific open actions. The default action is to do
-     * nothing.
-     * 
-     * @exception MessagingException
-     */
-    protected void openFolder() throws MessagingException {
-    }
-
-    /**
-     * Peform folder type-specific close actions. The default action is to do
-     * nothing.
-     * 
-     * @exception MessagingException
-     */
-    protected void closeFolder() throws MessagingException {
-    }
-
-    /**
-     * Close the folder. Cleans up resources, potentially expunges messages
-     * marked for deletion, and sends an event notification.
-     * 
-     * @param expunge
-     *            The expunge flag, which is ignored for NNTP folders.
-     * 
-     * @exception MessagingException
-     */
-    public void close(boolean expunge) throws MessagingException {
-        // Can only be performed on an open folder
-        checkOpen();
-
-        // give the subclasses an opportunity to do some cleanup
-        closeFolder();
-
-        folderOpen = false;
-        notifyConnectionListeners(ConnectionEvent.CLOSED);
-    }
-
-    /**
-     * Tests the open status of the folder.
-     * 
-     * @return true if the folder is open, false otherwise.
-     */
-    public boolean isOpen() {
-        return folderOpen;
-    }
-
-    /**
-     * Get the permanentFlags
-     * 
-     * @return The set of permanent flags we support (only SEEN).
-     */
-    public Flags getPermanentFlags() {
-        // we need a copy of our master set.
-        return new Flags(permanentFlags);
-    }
-
-    /**
-     * Get the count of messages in this folder.
-     * 
-     * @return The message count.
-     * @exception MessagingException
-     */
-    public int getMessageCount() throws MessagingException {
-        return messageCount;
-    }
-
-    /**
-     * Checks wether the message is in cache, if not will create a new message
-     * object and return it.
-     * 
-     * @see javax.mail.Folder#getMessage(int)
-     */
-    public Message getMessage(int msgNum) throws MessagingException {
-        // for the base, we just throw an exception.
-        throw new MethodNotSupportedException("Root NNTP folder does not contain messages");
-    }
-
-    /**
-     * Append messages to a folder. NNTP folders are read only, so this is not
-     * supported.
-     * 
-     * @param msgs
-     *            The list of messages to append.
-     * 
-     * @exception MessagingException
-     */
-    public void appendMessages(Message[] msgs) throws MessagingException {
-        throw new MethodNotSupportedException("Root NNTP folder does not contain messages");
-
-    }
-
-    /**
-     * Expunge messages marked for deletion and return a list of the Messages.
-     * Not supported for NNTP.
-     * 
-     * @return Never returns.
-     * @exception MessagingException
-     */
-    public Message[] expunge() throws MessagingException {
-        throw new MethodNotSupportedException("Root NNTP folder does not contain messages");
-    }
-
-    /**
-     * Below is a list of convenience methods that avoid repeated checking for a
-     * value and throwing an exception
-     */
-
-    /** Ensure the folder is open */
-    protected void checkOpen() throws IllegalStateException {
-        if (!folderOpen) {
-            throw new IllegalStateException("Folder is not Open");
-        }
-    }
-
-    /** Ensure the folder is not open */
-    protected void checkClosed() throws IllegalStateException {
-        if (folderOpen) {
-            throw new IllegalStateException("Folder is Open");
-        }
-    }
-
-    /**
-     * @see javax.mail.Folder#notifyMessageChangedListeners(int,
-     *      javax.mail.Message)
-     * 
-     * this method is protected and cannot be used outside of Folder, therefore
-     * had to explicitly expose it via a method in NNTPFolder, so that
-     * NNTPMessage has access to it
-     * 
-     * Bad design on the part of the Java Mail API.
-     */
-    public void notifyMessageChangedListeners(int type, Message m) {
-        super.notifyMessageChangedListeners(type, m);
-    }
-
-    /**
-     * Retrieve the subscribed status for a folder. This default implementation
-     * just returns false (which is true for the root folder).
-     * 
-     * @return Always returns true.
-     */
-    public boolean isSubscribed() {
-        return false;
-    }
-
-    /**
-     * Set the subscribed status for a folder.
-     * 
-     * @param flag
-     *            The new subscribed status.
-     * 
-     * @exception MessagingException
-     */
-    public void setSubscribed(boolean flag) throws MessagingException {
-        throw new MessagingException("Root NNTP folder cannot be subscribed to");
-    }
-
-    /**
-     * Test if a given article number is marked as SEEN.
-     * 
-     * @param article
-     *            The target article number.
-     * 
-     * @return The articles current seen status.
-     */
-    public boolean isSeen(int article) {
-        return false;
-    }
-
-    /**
-     * Set the SEEN status for an article.
-     * 
-     * @param article
-     *            The target article.
-     * @param flag
-     *            The new seen setting.
-     * 
-     * @exception MessagingException
-     */
-    public void setSeen(int article, boolean flag) throws MessagingException {
-        throw new MessagingException("Root NNTP folder does not contain articles");
-    }
-
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPGroupFolder.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPGroupFolder.java
deleted file mode 100644
index 19e51fd..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPGroupFolder.java
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.nntp;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import javax.mail.FetchProfile;
-import javax.mail.FolderNotFoundException;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-
-import org.apache.geronimo.javamail.store.nntp.newsrc.NNTPNewsrcGroup;
-import org.apache.geronimo.javamail.transport.nntp.NNTPReply;
-
-/**
- * The NNTP implementation of the javax.mail.Folder Note that only INBOX is
- * supported in NNTP
- * <p>
- * <url>http://www.faqs.org/rfcs/rfc1939.html</url>
- * </p>
- * 
- * @see javax.mail.Folder
- * 
- * @version $Rev$ $Date$
- */
-public class NNTPGroupFolder extends NNTPFolder {
-
-    // holders for status information returned by the GROUP command.
-    protected int firstArticle = -1;
-
-    protected int lastArticle = -1;
-
-    // retrieved articles, mapped by article number.
-    Map articles;
-
-    // information stored in the newsrc group.
-    NNTPNewsrcGroup groupInfo;
-
-    /**
-     * Construct a "real" folder representing an NNTP news group.
-     * 
-     * @param parent
-     *            The parent root folder.
-     * @param store
-     *            The Store this folder is attached to.
-     * @param name
-     *            The folder name.
-     * @param groupInfo
-     *            The newsrc group information attached to the newsrc database.
-     *            This contains subscription and article "SEEN" information.
-     */
-    protected NNTPGroupFolder(NNTPRootFolder parent, NNTPStore store, String name, NNTPNewsrcGroup groupInfo) {
-        super(store);
-        // the name and the full name are the same.
-        this.name = name;
-        this.fullName = name;
-        // set the parent appropriately.
-        this.parent = parent = parent;
-        this.groupInfo = groupInfo;
-    }
-
-    /**
-     * Ping the server and update the group count, first, and last information.
-     * 
-     * @exception MessagingException
-     */
-    private void updateGroupStats() throws MessagingException {
-        // ask the server for information about the group. This is a one-line
-        // reponse with status on
-        // the group, if it exists.
-        NNTPReply reply = connection.sendCommand("GROUP " + name);
-
-        // explicitly not there?
-        if (reply.getCode() == NNTPReply.NO_SUCH_NEWSGROUP) {
-            throw new FolderNotFoundException(this, "Folder does not exist on server: " + reply);
-        } else if (reply.getCode() != NNTPReply.GROUP_SELECTED) {
-            throw new MessagingException("Error requesting group information: " + reply);
-        }
-
-        // we've gotten back a good response, now parse out the group specifics
-        // from the
-        // status response.
-
-        StringTokenizer tokenizer = new StringTokenizer(reply.getMessage());
-
-        // we should have a least 3 tokens here, in the order "count first
-        // last".
-
-        // article count
-        if (tokenizer.hasMoreTokens()) {
-            String count = tokenizer.nextToken();
-            try {
-                messageCount = Integer.parseInt(count);
-            } catch (NumberFormatException e) {
-                // ignore
-            }
-        }
-
-        // first article number
-        if (tokenizer.hasMoreTokens()) {
-            String first = tokenizer.nextToken();
-            try {
-                firstArticle = Integer.parseInt(first);
-            } catch (NumberFormatException e) {
-                // ignore
-            }
-        }
-
-        // last article number.
-        if (tokenizer.hasMoreTokens()) {
-            String last = tokenizer.nextToken();
-            try {
-                lastArticle = Integer.parseInt(last);
-            } catch (NumberFormatException e) {
-                // ignore
-            }
-        }
-    }
-
-    /**
-     * Test to see if this folder actually exists. This pings the server for
-     * information about the GROUP and updates the article count and index
-     * information.
-     * 
-     * @return true if the newsgroup exists on the server, false otherwise.
-     * @exception MessagingException
-     */
-    public boolean exists() throws MessagingException {
-
-        try {
-            // update the group statistics. If the folder doesn't exist, we'll
-            // get an exception that we
-            // can turn into a false reply.
-            updateGroupStats();
-            // updated ok, so it must be there.
-            return true;
-        } catch (FolderNotFoundException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Ping the NNTP server to check if a newsgroup has any new messages.
-     * 
-     * @return True if the server has new articles from the last time we
-     *         checked. Also returns true if this is the first time we've
-     *         checked.
-     * @exception MessagingException
-     */
-    public boolean hasNewMessages() throws MessagingException {
-        int oldLast = lastArticle;
-        updateGroupStats();
-
-        return lastArticle > oldLast;
-    }
-
-    /**
-     * Open the folder for use. This retrieves article count information from
-     * the server.
-     * 
-     * @exception MessagingException
-     */
-    public void openFolder() throws MessagingException {
-        // update the group specifics, especially the message count.
-        updateGroupStats();
-
-        // get a cache for retrieve articles
-        articles = new HashMap();
-    }
-
-    /**
-     * Close the folder, which also clears out the article caches.
-     * 
-     * @exception MessagingException
-     */
-    public void closeFolder() throws MessagingException {
-        // get ride of any retrieve articles, and flip over the open for
-        // business sign.
-        articles = null;
-    }
-
-    /**
-     * Checks wether the message is in cache, if not will create a new message
-     * object and return it.
-     * 
-     * @see javax.mail.Folder#getMessage(int)
-     */
-    public Message getMessage(int msgNum) throws MessagingException {
-        // Can only be performed on an Open folder
-        checkOpen();
-
-        // get an object form to look up in the retrieve messages list (oh how I
-        // wish there was
-        // something like Map that could use integer keys directly!).
-        Integer key = new Integer(msgNum);
-        NNTPMessage message = (NNTPMessage) articles.get(key);
-        if (message != null) {
-            // piece of cake!
-            return message;
-        }
-
-        // we need to suck a message down from the server.
-        // but first, make sure the group is still valid.
-        updateGroupStats();
-
-        // just send a STAT command to this message. Right now, all we want is
-        // existance proof. We'll
-        // retrieve the other bits when requested.
-        NNTPReply reply = connection.sendCommand("STAT " + Integer.toString(msgNum));
-        if (reply.getCode() != NNTPReply.REQUEST_TEXT_SEPARATELY) {
-            throw new MessagingException("Error retrieving article from NNTP server: " + reply);
-        }
-
-        // we need to parse out the message id.
-        String response = reply.getMessage();
-
-        int idStart = response.indexOf('<');
-        int idEnd = response.indexOf('>');
-
-        message = new NNTPMessage(this, (NNTPStore) store, msgNum, response.substring(idStart + 1, idEnd));
-
-        // add this to the article cache.
-        articles.put(key, message);
-
-        return message;
-    }
-
-    /**
-     * Retrieve all articles in the group.
-     * 
-     * @return An array of all messages in the group.
-     */
-    public Message[] getMessages() throws MessagingException {
-        // we're going to try first with XHDR, which will allow us to retrieve
-        // everything in one shot. If that
-        // fails, we'll fall back on issing STAT commands for the entire article
-        // range.
-        NNTPReply reply = connection.sendCommand("XHDR Message-ID " + Integer.toString(firstArticle) + "-"
-                + Integer.toString(lastArticle), NNTPReply.HEAD_FOLLOWS);
-
-        List messages = new ArrayList();
-
-        if (reply.getCode() == NNTPReply.HEAD_FOLLOWS) {
-            List lines = reply.getData();
-
-            for (int i = 0; i < lines.size(); i++) {
-                String line = (String) lines.get(i);
-
-                try {
-                    int pos = line.indexOf(' ');
-                    int articleID = Integer.parseInt(line.substring(0, pos));
-                    String messageID = line.substring(pos + 1);
-                    Integer key = new Integer(articleID);
-                    // see if we have this message cached, If not, create it.
-                    Message message = (Message) articles.get(key);
-                    if (message == null) {
-                        message = new NNTPMessage(this, (NNTPStore) store, key.intValue(), messageID);
-                        articles.put(key, message);
-                    }
-
-                    messages.add(message);
-
-                } catch (NumberFormatException e) {
-                    // should never happen, but just skip this entry if it does.
-                }
-            }
-        } else {
-            // grumble, we need to stat each article id to see if it
-            // exists....lots of round trips.
-            for (int i = firstArticle; i <= lastArticle; i++) {
-                try {
-                    messages.add(getMessage(i));
-                } catch (MessagingException e) {
-                    // just assume if there is an error, it's because the
-                    // message id doesn't exist.
-                }
-            }
-        }
-
-        return (Message[]) messages.toArray(new Message[0]);
-    }
-
-    /**
-     * @see javax.mail.Folder#fetch(javax.mail.Message[],
-     *      javax.mail.FetchProfile)
-     * 
-     * The JavaMail API recommends that this method be overrident to provide a
-     * meaningfull implementation.
-     */
-    public void fetch(Message[] msgs, FetchProfile fp) throws MessagingException {
-        // Can only be performed on an Open folder
-        checkOpen();
-
-        for (int i = 0; i < msgs.length; i++) {
-            Message msg = msgs[i];
-            // we can only perform this operation for NNTPMessages.
-            if (msg == null || !(msg instanceof NNTPMessage)) {
-                // we can't fetch if it's the wrong message type
-                continue;
-            }
-
-            // fetching both the headers and body?
-            if (fp.contains(FetchProfile.Item.ENVELOPE) && fp.contains(FetchProfile.Item.CONTENT_INFO)) {
-
-                // retrive everything
-                ((NNTPMessage) msg).loadArticle();
-            }
-            // headers only?
-            else if (fp.contains(FetchProfile.Item.ENVELOPE)) {
-                ((NNTPMessage) msg).loadHeaders();
-            } else if (fp.contains(FetchProfile.Item.CONTENT_INFO)) {
-                ((NNTPMessage) msg).loadContent();
-            }
-        }
-    }
-
-    /**
-     * Return the subscription status of this folder.
-     * 
-     * @return true if the folder is marked as subscribed, false for
-     *         unsubscribed.
-     */
-    public boolean isSubscribed() {
-        return groupInfo.isSubscribed();
-    }
-
-    /**
-     * Set or clear the subscription status of a file.
-     * 
-     * @param flag
-     *            The new subscription state.
-     */
-    public void setSubscribed(boolean flag) {
-        groupInfo.setSubscribed(flag);
-    }
-
-    /**
-     * Return the "seen" state for an article in a folder.
-     * 
-     * @param article
-     *            The article number.
-     * 
-     * @return true if the article is marked as seen in the newsrc file, false
-     *         for unseen files.
-     */
-    public boolean isSeen(int article) {
-        return groupInfo.isArticleSeen(article);
-    }
-
-    /**
-     * Set the seen state for an article in a folder.
-     * 
-     * @param article
-     *            The article number.
-     * @param flag
-     *            The new seen state.
-     */
-    public void setSeen(int article, boolean flag) {
-        if (flag) {
-            groupInfo.markArticleSeen(article);
-        } else {
-            groupInfo.markArticleUnseen(article);
-        }
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPMessage.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPMessage.java
deleted file mode 100644
index e57d146..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPMessage.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.nntp;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Enumeration;
-
-import javax.mail.Flags;
-import javax.mail.IllegalWriteException;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.internet.InternetHeaders;
-import javax.mail.internet.MimeMessage;
-
-import org.apache.geronimo.javamail.transport.nntp.NNTPConnection;
-import org.apache.geronimo.javamail.transport.nntp.NNTPReply;
-import org.apache.geronimo.javamail.transport.nntp.StringListInputStream;
-
-/**
- * NNTP implementation of javax.mail.internet.MimeMessage
- * 
- * Only the most basic information is given and Message objects created here is
- * a light-weight reference to the actual Message As per the JavaMail spec items
- * from the actual message will get filled up on demand
- * 
- * If some other items are obtained from the server as a result of one call,
- * then the other details are also processed and filled in. For ex if RETR is
- * called then header information will also be processed in addition to the
- * content
- * 
- * @version $Rev$ $Date$
- */
-public class NNTPMessage extends MimeMessage {
-    // the server message identifer
-    String messageID = null;
-
-    // our attached session
-    protected Session session;
-
-    // the Store we're stored in (which manages the connection and other stuff).
-    protected NNTPStore store;
-
-    // our active connection.
-    protected NNTPConnection connection;
-
-    // used to force loading of headers
-    protected boolean headersLoaded = false;
-
-    // use to force content loading
-    protected boolean contentLoaded = false;
-
-    /**
-     * Contruct an NNTPMessage instance.
-     * 
-     * @param folder
-     *            The hosting folder for the message.
-     * @param store
-     *            The Store owning the article (and folder).
-     * @param msgnum
-     *            The article message number.
-     * @param messageID
-     *            The article messageID (as assigned by the server).
-     * 
-     * @exception MessagingException
-     */
-    NNTPMessage(NNTPFolder folder, NNTPStore store, int msgnum, String messageID) throws MessagingException {
-        super(folder, msgnum);
-        this.messageID = messageID;
-        this.store = store;
-        this.session = ((NNTPStore) store).getSession();
-        // get the active connection from the store...all commands are sent
-        // there
-        this.connection = ((NNTPStore) store).getConnection();
-
-        // get our flag set from the folder.
-        flags = folder.getPermanentFlags();
-        // now check our initial SEEN state and set the flags appropriately
-        if (folder.isSeen(msgnum)) {
-            flags.add(Flags.Flag.SEEN);
-        } else {
-            flags.remove(Flags.Flag.SEEN);
-        }
-    }
-
-    /**
-     * Retrieve the size of the message content. The content will be retrieved
-     * from the server, if necessary.
-     * 
-     * @return The size of the content.
-     * @exception MessagingException
-     */
-    public int getSize() throws MessagingException {
-        // make sure we've retrieved the message content and continue with the
-        // superclass version.
-        loadContent();
-        return super.getSize();
-    }
-
-    /**
-     * Get a line count for the NNTP message. This is potentially stored in the
-     * Lines article header. If not there, we return a default of -1.
-     * 
-     * @return The header line count estimate, or -1 if not retrieveable.
-     * @exception MessagingException
-     */
-    public int getLineCount() throws MessagingException {
-        String[] headers = getHeader("Lines");
-
-        // hopefully, there's only a single one of these. No sensible way of
-        // interpreting
-        // multiples.
-        if (headers.length == 1) {
-            try {
-                return Integer.parseInt(headers[0].trim());
-
-            } catch (NumberFormatException e) {
-                // ignore
-            }
-        }
-        // dunno...and let them know I don't know.
-        return -1;
-    }
-
-    /**
-     * @see javax.mail.internet.MimeMessage#getContentStream()
-     */
-    protected InputStream getContentStream() throws MessagingException {
-        // get the article information.
-        loadArticle();
-        return super.getContentStream();
-    }
-
-    /***************************************************************************
-     * Following is a set of methods that deal with headers These methods are
-     * just overrides on the superclass methods to allow lazy loading of the
-     * header information.
-     **************************************************************************/
-
-    public String[] getHeader(String name) throws MessagingException {
-        loadHeaders();
-        return headers.getHeader(name);
-    }
-
-    public String getHeader(String name, String delimiter) throws MessagingException {
-        loadHeaders();
-        return headers.getHeader(name, delimiter);
-    }
-
-    public Enumeration getAllHeaders() throws MessagingException {
-        loadHeaders();
-        return headers.getAllHeaders();
-    }
-
-    public Enumeration getMatchingHeaders(String[] names) throws MessagingException {
-        loadHeaders();
-        return headers.getMatchingHeaders(names);
-    }
-
-    public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException {
-        loadHeaders();
-        return headers.getNonMatchingHeaders(names);
-    }
-
-    public Enumeration getAllHeaderLines() throws MessagingException {
-        loadHeaders();
-        return headers.getAllHeaderLines();
-    }
-
-    public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException {
-        loadHeaders();
-        return headers.getMatchingHeaderLines(names);
-    }
-
-    public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException {
-        loadHeaders();
-        return headers.getNonMatchingHeaderLines(names);
-    }
-
-    // the following are overrides for header modification methods. These
-    // messages are read only,
-    // so the headers cannot be modified.
-    public void addHeader(String name, String value) throws MessagingException {
-        throw new IllegalWriteException("NNTP messages are read-only");
-    }
-
-    public void setHeader(String name, String value) throws MessagingException {
-        throw new IllegalWriteException("NNTP messages are read-only");
-    }
-
-    public void removeHeader(String name) throws MessagingException {
-        throw new IllegalWriteException("NNTP messages are read-only");
-    }
-
-    public void addHeaderLine(String line) throws MessagingException {
-        throw new IllegalWriteException("IMAP messages are read-only");
-    }
-
-    /**
-     * We cannot modify these messages
-     */
-    public void saveChanges() throws MessagingException {
-        throw new IllegalWriteException("NNTP messages are read-only");
-    }
-
-    /**
-     * Retrieve the message headers from the NNTP server.
-     * 
-     * @exception MessagingException
-     */
-    public void loadHeaders() throws MessagingException {
-        // don't retrieve if already loaded.
-        if (headersLoaded) {
-            return;
-        }
-
-        NNTPReply reply = connection.sendCommand("HEAD " + messageID, NNTPReply.HEAD_FOLLOWS);
-
-        if (reply.getCode() == NNTPReply.HEAD_FOLLOWS) {
-            try {
-                // wrap a stream around the reply data and read as headers.
-                updateHeaders(new StringListInputStream(reply.getData()));
-            } catch (IOException e) {
-                throw new MessagingException("Error retrieving article headers from server", e);
-            }
-        } else {
-            throw new MessagingException("Error retrieving article headers from server: " + reply);
-        }
-    }
-
-    /**
-     * Update the message headers from an input stream.
-     * 
-     * @param in
-     *            The InputStream source for the header information.
-     * 
-     * @exception MessagingException
-     */
-    public void updateHeaders(InputStream in) throws MessagingException {
-        // wrap a stream around the reply data and read as headers.
-        headers = new InternetHeaders(in);
-        headersLoaded = true;
-    }
-
-    /**
-     * Load just the message content from the NNTP server.
-     * 
-     * @exception MessagingException
-     */
-    public void loadContent() throws MessagingException {
-        if (contentLoaded) {
-            return;
-        }
-
-        NNTPReply reply = connection.sendCommand("BODY " + messageID, NNTPReply.BODY_FOLLOWS);
-
-        if (reply.getCode() == NNTPReply.BODY_FOLLOWS) {
-            try {
-                InputStream in = new StringListInputStream(reply.getData());
-                updateContent(in);
-            } catch (IOException e) {
-                throw new MessagingException("Error retrieving article body from server", e);
-            }
-        } else {
-            throw new MessagingException("Error retrieving article body from server: " + reply);
-        }
-    }
-
-    /**
-     * Load the entire article from the NNTP server. This updates both the
-     * headers and the content.
-     * 
-     * @exception MessagingException
-     */
-    public void loadArticle() throws MessagingException {
-        // if the headers are already loaded, retrieve the content portion.
-        if (headersLoaded) {
-            loadContent();
-            return;
-        }
-
-        // we need to retrieve everything.
-        NNTPReply reply = connection.sendCommand("ARTICLE " + messageID, NNTPReply.ARTICLE_FOLLOWS);
-
-        if (reply.getCode() == NNTPReply.ARTICLE_FOLLOWS) {
-            try {
-                InputStream in = new StringListInputStream(reply.getData());
-                // update both the headers and the content.
-                updateHeaders(in);
-                updateContent(in);
-            } catch (IOException e) {
-                throw new MessagingException("Error retrieving article from server", e);
-            }
-        } else {
-            throw new MessagingException("Error retrieving article from server: " + reply);
-        }
-    }
-
-    /**
-     * Update the article content from an input stream.
-     * 
-     * @param in
-     *            The content data source.
-     * 
-     * @exception MessagingException
-     */
-    public void updateContent(InputStream in) throws MessagingException {
-        try {
-            ByteArrayOutputStream out = new ByteArrayOutputStream();
-
-            byte[] buffer = new byte[4096];
-
-            // copy the content data from the stream into a byte buffer for the
-            // content.
-            while (true) {
-                int read = in.read(buffer);
-                if (read == -1) {
-                    break;
-                }
-                out.write(buffer, 0, read);
-            }
-
-            content = out.toByteArray();
-            contentLoaded = true;
-        } catch (IOException e) {
-            throw new MessagingException("Error retrieving message body from server", e);
-        }
-    }
-
-    /**
-     * Get the server assigned messageid for the article.
-     * 
-     * @return The server assigned message id.
-     */
-    public String getMessageId() {
-        return messageID;
-    }
-
-    /**
-     * Override of setFlags(). We need to ensure that if the SEEN flag is set or
-     * cleared, that the newsrc file correctly reflects the current state.
-     * 
-     * @param flag
-     *            The flag being set.
-     * @param newvalue
-     *            The new flag value.
-     * 
-     * @exception MessagingException
-     */
-    public void setFlags(Flags flag, boolean newvalue) throws MessagingException {
-        // if this is the SEEN flag, make sure we shadow this in the newsrc
-        // file.
-        if (flag.contains(Flags.Flag.SEEN)) {
-            ((NNTPFolder) folder).setSeen(msgnum, newvalue);
-        }
-        // have the superclass do the real flag setting.
-        super.setFlags(flag, newvalue);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPRootFolder.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPRootFolder.java
deleted file mode 100644
index 605c59e..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPRootFolder.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.nntp;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.mail.Folder;
-import javax.mail.MessagingException;
-
-import org.apache.geronimo.javamail.store.nntp.newsrc.NNTPNewsrcGroup;
-import org.apache.geronimo.javamail.transport.nntp.NNTPReply;
-import org.apache.geronimo.mail.util.SessionUtil;
-
-/**
- * The base NNTP implementation of the javax.mail.Folder This is a base class
- * for both the Root NNTP server and each NNTP group folder.
- * 
- * @see javax.mail.Folder
- * 
- * @version $Rev$
- */
-public class NNTPRootFolder extends NNTPFolder {
-    protected static final String NNTP_LISTALL = "mail.nntp.listall";
-
-    /**
-     * Construct the NNTPRootFolder.
-     * 
-     * @param store
-     *            The owning Store.
-     * @param name
-     *            The folder name (by default, this is the server host name).
-     * @param fullName
-     *            The fullName to use for this server (derived from welcome
-     *            string).
-     */
-    protected NNTPRootFolder(NNTPStore store, String name, String fullName) {
-        super(store);
-
-        this.name = name;
-        this.fullName = fullName;
-    }
-
-    /**
-     * List the subfolders. For group folders, this is a meaningless so we throw
-     * a MethodNotSupportedException.
-     * 
-     * @param pattern
-     *            The folder pattern string.
-     * 
-     * @return Never returns.
-     * @exception MessagingException
-     */
-    public synchronized Folder[] list(String pattern) throws MessagingException {
-        // the pattern specfied for javamail uses two wild card characters, "%"
-        // and "*". The "%" matches
-        // and character except hierarchy separators. Since we have a flag
-        // hierarchy, "%" and "*" are
-        // essentially the same. If we convert the "%" into "*", we can just
-        // treat this as a wildmat
-        // formatted pattern and pass this on to the server rather than having
-        // to read everything and
-        // process the strings on the client side.
-
-        pattern = pattern.replace('%', '*');
-
-        // if we're not supposed to list everything, then just filter the list
-        // of subscribed groups.
-        if (SessionUtil.getBooleanProperty(NNTP_LISTALL, false)) {
-            return filterActiveGroups(pattern);
-        } else {
-            return filterSubscribedGroups(pattern);
-        }
-    }
-
-    /**
-     * Retrieve the list of subscribed folders that match the given pattern
-     * string.
-     * 
-     * @param pattern
-     *            The pattern string used for the matching
-     * 
-     * @return An array of matching folders from the subscribed list.
-     */
-    public Folder[] listSubscribed(String pattern) throws MessagingException {
-        // the pattern specfied for javamail uses two wild card characters, "%"
-        // and "*". The "%" matches
-        // and character except hierarchy separators. Since we have a flag
-        // hierarchy, "%" and "*" are
-        // essentially the same. If we convert the "%" into "*", we can just
-        // treat this as a wildmat
-        // formatted pattern and pass this on to the server rather than having
-        // to read everything and
-        // process the strings on the client side.
-
-        pattern = pattern.replace('%', '*');
-
-        return filterSubscribedGroups(pattern);
-    }
-
-    /**
-     * Retrieve the list of matching groups from the NNTP server using the LIST
-     * ACTIVE command. The server does the wildcard matching for us.
-     * 
-     * @param pattern
-     *            The pattern string (in wildmat format) used to match.
-     * 
-     * @return An array of folders for the matching groups.
-     */
-    protected Folder[] filterActiveGroups(String pattern) throws MessagingException {
-        NNTPReply reply = connection.sendCommand("LIST ACTIVE " + pattern, NNTPReply.LIST_FOLLOWS);
-
-        // if the LIST ACTIVE command isn't supported,
-        if (reply.getCode() == NNTPReply.COMMAND_NOT_RECOGNIZED) {
-            // only way to list all is to retrieve all and filter.
-            return filterAllGroups(pattern);
-        } else if (reply.getCode() != NNTPReply.LIST_FOLLOWS) {
-            throw new MessagingException("Error retrieving group list from NNTP server: " + reply);
-        }
-
-        // get the response back from the server and process each returned group
-        // name.
-        List groups = reply.getData();
-
-        Folder[] folders = new Folder[groups.size()];
-        for (int i = 0; i < groups.size(); i++) {
-            folders[i] = getFolder(getGroupName((String) groups.get(i)));
-        }
-        return folders;
-    }
-
-    /**
-     * Retrieve a list of all groups from the server and filter on the names.
-     * Not recommended for the usenet servers, as there are over 30000 groups to
-     * process.
-     * 
-     * @param pattern
-     *            The pattern string used for the selection.
-     * 
-     * @return The Folders for the matching groups.
-     */
-    protected Folder[] filterAllGroups(String pattern) throws MessagingException {
-        NNTPReply reply = connection.sendCommand("LIST", NNTPReply.LIST_FOLLOWS);
-
-        if (reply.getCode() != NNTPReply.LIST_FOLLOWS) {
-            throw new MessagingException("Error retrieving group list from NNTP server: " + reply);
-        }
-
-        // get the response back from the server and process each returned group
-        // name.
-        List groups = reply.getData();
-
-        WildmatMatcher matcher = new WildmatMatcher(pattern);
-
-        List folders = new ArrayList();
-        for (int i = 0; i < groups.size(); i++) {
-            String name = getGroupName((String) groups.get(i));
-            // does this match our pattern? Add to the list
-            if (matcher.matches(name)) {
-                folders.add(getFolder(name));
-            }
-        }
-        return (Folder[]) folders.toArray(new Folder[0]);
-    }
-
-    /**
-     * Return the set of groups from the newsrc subscribed groups list that
-     * match a given filter.
-     * 
-     * @param pattern
-     *            The selection pattern.
-     * 
-     * @return The Folders for the matching groups.
-     */
-    protected Folder[] filterSubscribedGroups(String pattern) throws MessagingException {
-        Iterator groups = ((NNTPStore) store).getNewsrcGroups();
-
-        WildmatMatcher matcher = new WildmatMatcher(pattern);
-
-        List folders = new ArrayList();
-        while (groups.hasNext()) {
-            NNTPNewsrcGroup group = (NNTPNewsrcGroup) groups.next();
-            if (group.isSubscribed()) {
-                // does this match our pattern? Add to the list
-                if (matcher.matches(group.getName())) {
-                    folders.add(getFolder(group.getName()));
-                }
-            }
-        }
-        return (Folder[]) folders.toArray(new Folder[0]);
-    }
-
-    /**
-     * Utility method for extracting a name from a group list response.
-     * 
-     * @param response
-     *            The response string.
-     * 
-     * @return The group name.
-     */
-    protected String getGroupName(String response) {
-        int blank = response.indexOf(' ');
-        return response.substring(0, blank).trim();
-    }
-
-    /**
-     * Return whether this folder can hold just messages or also subfolders.
-     * Only the root folder can hold other folders, so it will need to override.
-     * 
-     * @return Always returns Folder.HOLDS_FOLDERS.
-     * @exception MessagingException
-     */
-    public int getType() throws MessagingException {
-        return HOLDS_FOLDERS;
-    }
-
-    /**
-     * Get a new folder from the root folder. This creates a new folder, which
-     * might not actually exist on the server. If the folder doesn't exist, an
-     * error will occur on folder open.
-     * 
-     * @param name
-     *            The name of the requested folder.
-     * 
-     * @return A new folder object for this folder.
-     * @exception MessagingException
-     */
-    public Folder getFolder(String name) throws MessagingException {
-        // create a new group folder and return
-        return new NNTPGroupFolder(this, (NNTPStore) store, name, ((NNTPStore) store).getNewsrcGroup(name));
-    }
-
-    /**
-     * Utility class to do Wildmat pattern matching on folder names.
-     */
-    class WildmatMatcher {
-        // middle match sections...because these are separated by wildcards, if
-        // they appear in
-        // sequence in the string, it is a match.
-        List matchSections = new ArrayList();
-
-        // just a "*" match, so everything is true
-        boolean matchAny = false;
-
-        // no wildcards, so this must be an exact match.
-        String exactMatch = null;
-
-        // a leading section which must be at the beginning
-        String firstSection = null;
-
-        // a trailing section which must be at the end of the string.
-        String lastSection = null;
-
-        /**
-         * Create a wildmat pattern matcher.
-         * 
-         * @param pattern
-         *            The wildmat pattern to apply to string matches.
-         */
-        public WildmatMatcher(String pattern) {
-            int section = 0;
-
-            // handle the easy cases first
-
-            // single wild card?
-            if (pattern.equals("*")) {
-                matchAny = true;
-                return;
-            }
-
-            // find the first wild card
-            int wildcard = pattern.indexOf('*');
-
-            // no wild card at all?
-            if (wildcard == -1) {
-                exactMatch = pattern;
-                return;
-            }
-
-            // pattern not begin with a wildcard? We need to pull off the
-            // leading section
-            if (!pattern.startsWith("*")) {
-                firstSection = pattern.substring(0, wildcard);
-                section = wildcard + 1;
-                // this could be "yada*", so we could be done.
-                if (section >= pattern.length()) {
-                    return;
-                }
-            }
-
-            // now parse off the middle sections, making sure to handle the end
-            // condition correctly.
-            while (section < pattern.length()) {
-                // find the next wildcard position
-                wildcard = pattern.indexOf('*', section);
-                if (wildcard == -1) {
-                    // not found, we're at the end of the pattern. We need to
-                    // match on the end.
-                    lastSection = pattern.substring(section);
-                    return;
-                }
-                // we could have a null section, which we'll just ignore.
-                else if (wildcard == section) {
-                    // step over the wild card
-                    section++;
-                } else {
-                    // pluck off the next section
-                    matchSections.add(pattern.substring(section, wildcard));
-                    // step over the wild card character and check if we've
-                    // reached the end.
-                    section = wildcard + 1;
-                }
-            }
-        }
-
-        /**
-         * Test if a name string matches to parsed wildmat pattern.
-         * 
-         * @param name
-         *            The name to test.
-         * 
-         * @return true if the string matches the pattern, false otherwise.
-         */
-        public boolean matches(String name) {
-
-            // handle the easy cases first
-
-            // full wildcard? Always matches
-            if (matchAny) {
-                return true;
-            }
-
-            // required exact matches are easy.
-            if (exactMatch != null) {
-                return exactMatch.equals(name);
-            }
-
-            int span = 0;
-
-            // must match the beginning?
-            if (firstSection != null) {
-                // if it doesn't start with that, it can't be true.
-                if (!name.startsWith(firstSection)) {
-                    return false;
-                }
-
-                // we do all additional matching activity from here.
-                span = firstSection.length();
-            }
-
-            // scan for each of the sections along the string
-            for (int i = 1; i < matchSections.size(); i++) {
-                // if a section is not found, this is false
-
-                String nextMatch = (String) matchSections.get(i);
-                int nextLocation = name.indexOf(nextMatch, span);
-                if (nextLocation == -1) {
-                    return false;
-                }
-                // step over that one
-                span = nextMatch.length() + nextLocation;
-            }
-
-            // we've matched everything up to this point, now check to see if
-            // need an end match
-            if (lastSection != null) {
-                // we need to have at least the number of characters of the end
-                // string left, else this fails.
-                if (name.length() - span < lastSection.length()) {
-                    return false;
-                }
-
-                // ok, make sure we end with this string
-                return name.endsWith(lastSection);
-            }
-
-            // no falsies, this must be the truth.
-            return true;
-        }
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPStore.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPStore.java
deleted file mode 100644
index b69bea4..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/NNTPStore.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.nntp;
-
-import java.io.File;
-import java.io.PrintStream;
-import java.util.Iterator;
-
-import javax.mail.Folder;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.Store;
-import javax.mail.URLName;
-
-import org.apache.geronimo.javamail.store.nntp.newsrc.NNTPNewsrc;
-import org.apache.geronimo.javamail.store.nntp.newsrc.NNTPNewsrcFile;
-import org.apache.geronimo.javamail.store.nntp.newsrc.NNTPNewsrcGroup;
-import org.apache.geronimo.javamail.transport.nntp.NNTPConnection;
-import org.apache.geronimo.mail.util.SessionUtil;
-
-/**
- * NNTP implementation of javax.mail.Store POP protocol spec is implemented in
- * org.apache.geronimo.javamail.store.pop3.NNTPConnection
- * 
- * @version $Rev$ $Date$
- */
-public class NNTPStore extends Store {
-
-    protected static final String NNTP_AUTH = "auth";
-
-    protected static final String NNTP_PORT = "port";
-
-    protected static final String NNTP_NEWSRC = "newsrc";
-
-    protected static final String protocol = "nntp";
-
-    protected static final int DEFAULT_NNTP_PORT = 119;
-
-    // the active connection object.
-    protected NNTPConnection connection;
-
-    // the newsrc file where we store subscriptions and seen message markers.
-    protected NNTPNewsrc newsrc;
-
-    // the root folder
-    protected NNTPRootFolder root;
-
-    // our session provided debug output stream.
-    protected PrintStream debugStream;
-
-    /**
-     * Construct an NNTPStore item. This will load the .newsrc file associated
-     * with the server.
-     * 
-     * @param session
-     *            The owning javamail Session.
-     * @param urlName
-     *            The Store urlName, which can contain server target
-     *            information.
-     */
-    public NNTPStore(Session session, URLName urlName) {
-        super(session, urlName);
-
-        // get our debug output.
-        debugStream = session.getDebugOut();
-
-    }
-
-    /**
-     * @see javax.mail.Store#getDefaultFolder()
-     * 
-     * This returns a root folder object for all of the news groups.
-     */
-    public Folder getDefaultFolder() throws MessagingException {
-        checkConnectionStatus();
-        if (root == null) {
-            return new NNTPRootFolder(this, connection.getHost(), connection.getWelcomeString());
-        }
-        return root;
-    }
-
-    /**
-     * @see javax.mail.Store#getFolder(java.lang.String)
-     */
-    public Folder getFolder(String name) throws MessagingException {
-        return getDefaultFolder().getFolder(name);
-    }
-
-    /**
-     * 
-     * @see javax.mail.Store#getFolder(javax.mail.URLName)
-     */
-    public Folder getFolder(URLName url) throws MessagingException {
-        return getDefaultFolder().getFolder(url.getFile());
-    }
-
-    /**
-     * @see javax.mail.Service#protocolConnect(java.lang.String, int,
-     *      java.lang.String, java.lang.String)
-     */
-    protected synchronized boolean protocolConnect(String host, int port, String username, String password)
-            throws MessagingException {
-        if (debug) {
-            debugOut("Connecting to server " + host + ":" + port + " for user " + username);
-        }
-
-        // first check to see if we need to authenticate. If we need this, then
-        // we must have a username and
-        // password specified. Failing this may result in a user prompt to
-        // collect the information.
-        boolean mustAuthenticate = getBooleanProperty(NNTP_AUTH, false);
-
-        // if we need to authenticate, and we don't have both a userid and
-        // password, then we fail this
-        // immediately. The Service.connect() method will try to obtain the user
-        // information and retry the
-        // connection one time.
-        if (mustAuthenticate && (username == null || password == null)) {
-            return false;
-        }
-
-        // if the port is defaulted, then see if we have something configured in
-        // the session.
-        // if not configured, we just use the default default.
-        if (port == -1) {
-            // check for a property and fall back on the default if it's not
-            // set.
-            port = getIntProperty(NNTP_PORT, DEFAULT_NNTP_PORT);
-        }
-
-        // create socket and connect to server.
-        connection = new NNTPConnection(protocol, session, host, port, username, password, debug);
-        connection.connect();
-
-        // see if we have a newsrc file location specified
-        String newsrcFile = getProperty(NNTP_NEWSRC);
-
-        File source = null;
-
-        // not given as a property? Then look for a file in user.home
-        if (newsrcFile != null) {
-            source = new File(newsrcFile);
-        } else {
-            // ok, look for a file in the user.home directory. If possible,
-            // we'll try for a file
-            // with the hostname appended.
-            String home = SessionUtil.getProperty("user.home");
-
-            // try for a host-specific file first. If not found, use (and
-            // potentially create) a generic
-            // .newsrc file.
-            newsrcFile = ".newsrc-" + host;
-            source = new File(home, newsrcFile);
-            if (!source.exists()) {
-                source = new File(home, ".newsrc");
-            }
-        }
-
-        // now create a newsrc read and load the file.
-        newsrc = new NNTPNewsrcFile(source);
-        newsrc.load();
-
-        // we're going to return success here, but in truth, the server may end
-        // up asking for our
-        // bonafides at any time, and we'll be expected to authenticate then.
-        return true;
-    }
-
-    /**
-     * @see javax.mail.Service#close()
-     */
-    public void close() throws MessagingException {
-        // This is done to ensure proper event notification.
-        super.close();
-        // persist the newsrc file, if possible
-        newsrc.close();
-        connection.close();
-        connection = null;
-    }
-
-    private void checkConnectionStatus() throws MessagingException {
-        if (!this.isConnected()) {
-            throw new MessagingException("Not connected ");
-        }
-    }
-
-    /**
-     * Internal debug output routine.
-     * 
-     * @param value
-     *            The string value to output.
-     */
-    void debugOut(String message) {
-        debugStream.println("NNTPTransport DEBUG: " + message);
-    }
-
-    /**
-     * Internal debugging routine for reporting exceptions.
-     * 
-     * @param message
-     *            A message associated with the exception context.
-     * @param e
-     *            The received exception.
-     */
-    void debugOut(String message, Throwable e) {
-        debugOut("Received exception -> " + message);
-        debugOut("Exception message -> " + e.getMessage());
-        e.printStackTrace(debugStream);
-    }
-
-    /**
-     * Retrieve the server connection created by this store.
-     * 
-     * @return The active connection object.
-     */
-    NNTPConnection getConnection() {
-        return connection;
-    }
-
-    /**
-     * Retrieve the Session object this Store is operating under.
-     * 
-     * @return The attached Session instance.
-     */
-    Session getSession() {
-        return session;
-    }
-
-    /**
-     * Retrieve all of the groups we nave persistent store information about.
-     * 
-     * @return The set of groups contained in the newsrc file.
-     */
-    Iterator getNewsrcGroups() {
-        return newsrc.getGroups();
-    }
-
-    /**
-     * Retrieve the newsrc group information for a named group. If the file does
-     * not currently include this group, an unsubscribed group will be added to
-     * the file.
-     * 
-     * @param name
-     *            The name of the target group.
-     * 
-     * @return The NNTPNewsrcGroup item corresponding to this name.
-     */
-    NNTPNewsrcGroup getNewsrcGroup(String name) {
-        return newsrc.getGroup(name);
-    }
-
-    /**
-     * Get a property associated with this mail protocol.
-     * 
-     * @param name
-     *            The name of the property.
-     * 
-     * @return The property value (returns null if the property has not been
-     *         set).
-     */
-    String getProperty(String name) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return session.getProperty(fullName);
-    }
-
-    /**
-     * Get a property associated with this mail session. Returns the provided
-     * default if it doesn't exist.
-     * 
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     * 
-     * @return The property value (returns defaultValue if the property has not
-     *         been set).
-     */
-    String getProperty(String name, String defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return SessionUtil.getProperty(session, fullName, defaultValue);
-    }
-
-    /**
-     * Get a property associated with this mail session as an integer value.
-     * Returns the default value if the property doesn't exist or it doesn't
-     * have a valid int value.
-     * 
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     * 
-     * @return The property value converted to an int.
-     */
-    int getIntProperty(String name, int defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return SessionUtil.getIntProperty(session, fullName, defaultValue);
-    }
-
-    /**
-     * Get a property associated with this mail session as an boolean value.
-     * Returns the default value if the property doesn't exist or it doesn't
-     * have a valid int value.
-     * 
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     * 
-     * @return The property value converted to a boolean
-     */
-    boolean getBooleanProperty(String name, boolean defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return SessionUtil.getBooleanProperty(session, fullName, defaultValue);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/NNTPNewsrc.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/NNTPNewsrc.java
deleted file mode 100644
index def485c..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/NNTPNewsrc.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.nntp.newsrc;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Writer;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Base class implementation of a standard news reader news rc file. This is
- * used to track newsgroup subscriptions and SEEN flags for articles. This is an
- * abstract class designed for subclasses to bridge to the physical store type
- * used for the newsgroup information.
- */
-public abstract class NNTPNewsrc {
-
-    // the group information we've read from the news rc file.
-    Map groups = new HashMap();
-
-    // flag to let us know of we need to persist the newsrc file on close.
-    boolean dirty = false;
-
-    /**
-     * Base class constructor for NNTPNewsrc items. Subclasses provide their own
-     * domain-specific intialization.
-     */
-    protected NNTPNewsrc() {
-    }
-
-    /**
-     * Load the data from the newsrc file and parse into an instore group
-     * database.
-     */
-    public void load() {
-        BufferedReader in = null;
-
-        try {
-            in = getInputReader();
-
-            String line = in.readLine();
-
-            while (line != null) {
-                // parse the line...this returns null if it's something
-                // unrecognized.
-                NNTPNewsrcGroup group = NNTPNewsrcGroup.parse(this, line);
-                // if it parsed ok, add it to the group list, and potentially to
-                // the subscribed list.
-                if (group != null) {
-                    groups.put(group.getName(), group);
-                }
-
-                line = in.readLine();
-            }
-
-            in.close();
-        } catch (IOException e) {
-            // an IOException may mean that the file just doesn't exist, which
-            // is fine. We'll ignore and
-            // proceed with the information we have.
-        } finally {
-            if (in != null) {
-                try {
-                    in.close();
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-        }
-    }
-
-    /**
-     * Save the newsrc file data back to the original source file.
-     * 
-     * @exception IOException
-     */
-    public void save() throws IOException {
-        Writer out = getOutputWriter();
-
-        Iterator i = groups.values().iterator();
-
-        while (i.hasNext()) {
-            NNTPNewsrcGroup group = (NNTPNewsrcGroup) i.next();
-            group.save(out);
-        }
-
-        out.close();
-    }
-
-    /**
-     * Abstract open method intended for sub class initialization. The subclass
-     * is responsible for creating the BufferedReaded used to read the .newsrc
-     * file.
-     * 
-     * @return A BufferedReader for reading the .newsrc file.
-     * @exception IOException
-     */
-    abstract public BufferedReader getInputReader() throws IOException;
-
-    /**
-     * Abstract open for output method intended for subclass implementation. The
-     * subclasses are reponsible for opening the output stream and creating an
-     * appropriate Writer for saving the .newsrc file.
-     * 
-     * @return A Writer target at the .newsrc file save location.
-     * @exception IOException
-     */
-    abstract public Writer getOutputWriter() throws IOException;
-
-    /**
-     * Retrieve the newsrc group information for a named group. If the file does
-     * not currently include this group, an unsubscribed group will be added to
-     * the file.
-     * 
-     * @param name
-     *            The name of the target group.
-     * 
-     * @return The NNTPNewsrcGroup item corresponding to this name.
-     */
-    public NNTPNewsrcGroup getGroup(String name) {
-        NNTPNewsrcGroup group = (NNTPNewsrcGroup) groups.get(name);
-        // if we don't know about this, create a new one and add to the list.
-        // This
-        // will be an unsubscribed one.
-        if (group == null) {
-            group = new NNTPNewsrcGroup(this, name, null, false);
-            groups.put(name, group);
-            // we've added a group, so we need to resave
-            dirty = true;
-        }
-        return group;
-    }
-
-    /**
-     * Mark this newsrc database as dirty.
-     */
-    public void setDirty() {
-        dirty = true;
-    }
-
-    /**
-     * Close the newsrc file, persisting it back to disk if the file has
-     * changed.
-     */
-    public void close() {
-        if (dirty) {
-            try {
-                save();
-            } catch (IOException e) {
-                // ignore
-            }
-        }
-    }
-
-    /**
-     * Retrieve the current set of loaded groups.
-     * 
-     * @return An iterator for traversing the group set.
-     */
-    public Iterator getGroups() {
-        return groups.values().iterator();
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/NNTPNewsrcFile.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/NNTPNewsrcFile.java
deleted file mode 100644
index 9211aca..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/NNTPNewsrcFile.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.nntp.newsrc;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-
-public class NNTPNewsrcFile extends NNTPNewsrc {
-    // source for the file data
-    File source;
-
-    /**
-     * Construct a NNTPNewsrc object that is targetted at a file-based backing
-     * store.
-     * 
-     * @param source
-     *            The source File for the .newsrc data.
-     */
-    public NNTPNewsrcFile(File source) {
-        this.source = source;
-    }
-
-    /**
-     * Retrieve an input reader for loading the newsrc file.
-     * 
-     * @return A BufferedReader object for reading from the newsrc file.
-     * @exception IOException
-     */
-    public BufferedReader getInputReader() throws IOException {
-        return new BufferedReader(new InputStreamReader(new FileInputStream(source)));
-    }
-
-    /**
-     * Obtain a writer for saving a newsrc file.
-     * 
-     * @return The output writer targetted to the newsrc file.
-     * @exception IOException
-     */
-    public Writer getOutputWriter() throws IOException {
-        // open this for overwriting
-        return new OutputStreamWriter(new FileOutputStream(source, false));
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/NNTPNewsrcGroup.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/NNTPNewsrcGroup.java
deleted file mode 100644
index b628361..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/NNTPNewsrcGroup.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.nntp.newsrc;
-
-import java.io.IOException;
-import java.io.Writer;
-
-public class NNTPNewsrcGroup {
-    // the newsrc database we're part of
-    NNTPNewsrc newsrc;
-
-    // the name of the group
-    protected String name;
-
-    // the subscription flage
-    protected boolean subscribed;
-
-    // the range of already seen articles.
-    protected RangeList ranges;
-
-    /**
-     * Construct a NNTPNewsrcGroup item associated with a given .newsrc
-     * database.
-     * 
-     * @param newsrc
-     *            The owning .newsrc database.
-     * @param line
-     *            The .newsrc range entries in .newsrc format. These ranges are
-     *            parsed to create a set of seen flags.
-     * 
-     * @return A created NNTPNewsrcGroup item.
-     */
-    public static NNTPNewsrcGroup parse(NNTPNewsrc newsrc, String line) {
-        String groupName = null;
-        String ranges = null;
-
-        // subscribed lines have a ':' marker acting as a delimiter
-        int marker = line.indexOf(':');
-
-        if (marker != -1) {
-            groupName = line.substring(0, marker);
-            ranges = line.substring(marker + 1);
-            return new NNTPNewsrcGroup(newsrc, groupName, ranges, true);
-        }
-
-        // now check for an unsubscribed group
-        marker = line.indexOf('!');
-
-        if (marker != -1) {
-            groupName = line.substring(0, marker);
-            ranges = line.substring(marker + 1);
-            return new NNTPNewsrcGroup(newsrc, groupName, ranges, false);
-        }
-
-        // must be a comment line
-        return null;
-    }
-
-    /**
-     * Construct a .newsrc group item.
-     * 
-     * @param newsrc
-     *            The owning newsrc database.
-     * @param name
-     *            The group name.
-     * @param newsrcRanges
-     *            The initial set of seen ranges for the group (may be null).
-     * @param subscribed
-     *            The initial group subscription state.
-     */
-    public NNTPNewsrcGroup(NNTPNewsrc newsrc, String name, String newsrcRanges, boolean subscribed) {
-        this.newsrc = newsrc;
-        this.name = name;
-        this.subscribed = subscribed;
-        this.ranges = new RangeList(newsrcRanges);
-    }
-
-    /**
-     * Get the group name.
-     * 
-     * @return The String name of the group.
-     */
-    public String getName() {
-        return name;
-    }
-
-    /**
-     * Get the newsrc subscribed status for an article.
-     * 
-     * @return The current subscription flag.
-     */
-    public boolean isSubscribed() {
-        return subscribed;
-    }
-
-    /**
-     * Set the subscription status for an article.
-     * 
-     * @param flag
-     *            The new subscription value.
-     */
-    public void setSubscribed(boolean flag) {
-        // we don't blindly set this to the new value since we only want to
-        // resave the newsrc file if
-        // something changes.
-        if (flag && !subscribed) {
-            subscribed = true;
-            newsrc.setDirty();
-        } else if (!flag && subscribed) {
-            subscribed = false;
-            newsrc.setDirty();
-        }
-    }
-
-    /**
-     * Test if an article has been seen yet.
-     * 
-     * @param article
-     *            The target article.
-     * 
-     * @return The seen mark for the article.
-     */
-    public boolean isArticleSeen(int article) {
-        return ranges.isMarked(article);
-    }
-
-    /**
-     * Mark an article as seen.
-     * 
-     * @param article
-     *            The target article number.
-     */
-    public void markArticleSeen(int article) {
-        ranges.setMarked(article);
-        if (ranges.isDirty()) {
-            newsrc.setDirty();
-        }
-    }
-
-    /**
-     * Mark an article as unseen.
-     * 
-     * @param article
-     *            The target article number.
-     */
-    public void markArticleUnseen(int article) {
-        ranges.setUnmarked(article);
-        if (ranges.isDirty()) {
-            newsrc.setDirty();
-        }
-    }
-
-    /**
-     * Save this group definition to a .newsrc file.
-     * 
-     * @param out
-     *            The output writer to send the information to.
-     * 
-     * @exception IOException
-     */
-    public void save(Writer out) throws IOException {
-        out.write(name);
-        out.write(subscribed ? ": " : "! ");
-        ranges.save(out);
-        // put a terminating line end
-        out.write("\r\n");
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/Range.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/Range.java
deleted file mode 100644
index 90e4707..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/Range.java
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.nntp.newsrc;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * Represent a single Range in a newsrc file. A Range can be either a single
- * number (start == end) or a span of article numbers.
- */
-public class Range {
-    // the low end of the range
-    int start;
-
-    // the high end of the range (start and end are inclusive);
-    int end;
-
-    /**
-     * Construct a Range item for a single digit range.
-     * 
-     * @param spot
-     *            The location of the singleton.
-     */
-    public Range(int spot) {
-        this(spot, spot);
-    }
-
-    /**
-     * Construct a Range item.
-     * 
-     * @param start
-     *            The starting point of the Range.
-     * @param end
-     *            The Range end point (which may be equal to the starting
-     *            point).
-     */
-    public Range(int start, int end) {
-        this.start = start;
-        this.end = end;
-    }
-
-    /**
-     * Parse a section of a .newsrc range string into a single Range item. The
-     * range is either a single number, or a pair of numbers separated by a
-     * hyphen.
-     * 
-     * @param range
-     *            The range string.
-     * 
-     * @return A constructed Range item, or null if there is a parsing error.
-     */
-    static public Range parse(String range) {
-        // a range from a newsrc file is either a single number or in the format
-        // 'nnnn-mmmm'. We need
-        // to figure out which type this is.
-        int marker = range.indexOf('-');
-
-        try {
-            if (marker != -1) {
-                String rangeStart = range.substring(0, marker).trim();
-                String rangeEnd = range.substring(marker + 1).trim();
-
-                int start = Integer.parseInt(rangeStart);
-                int end = Integer.parseInt(rangeEnd);
-
-                if (start >= 0 && end >= 0) {
-                    return new Range(start, end);
-                }
-            } else {
-                // use the entire token
-                int start = Integer.parseInt(range);
-                // and start and the end are the same
-                return new Range(start, start);
-
-            }
-        } catch (NumberFormatException e) {
-        }
-        // return null for any bad values
-        return null;
-    }
-
-    /**
-     * Get the starting point for the Range.
-     * 
-     * @return The beginning of the mark range.
-     */
-    public int getStart() {
-        return start;
-    }
-
-    /**
-     * Set the starting point for a Range.
-     * 
-     * @param start
-     *            The new start value.
-     */
-    public void setStart(int start) {
-        this.start = start;
-    }
-
-    /**
-     * Get the ending point for the Range.
-     * 
-     * @return The end of the mark range.
-     */
-    public int getEnd() {
-        return end;
-    }
-
-    /**
-     * Set the ending point for a Range.
-     * 
-     * @param end
-     *            The new end value.
-     */
-    public void setEnd(int end) {
-        this.end = end;
-    }
-
-    /**
-     * Test if a range contains a point value.
-     * 
-     * @param target
-     *            The article location to test.
-     * 
-     * @return True if the target is between the start and end values,
-     *         inclusive.
-     */
-    public boolean contains(int target) {
-        return target >= start && target <= end;
-    }
-
-    /**
-     * Test if one range is completely contained within another Range.
-     * 
-     * @param other
-     *            The other test range.
-     * 
-     * @return true if the other start and end points are contained within this
-     *         range.
-     */
-    public boolean contains(Range other) {
-        return contains(other.getStart()) && contains(other.getEnd());
-    }
-
-    /**
-     * Tests if two ranges overlap
-     * 
-     * @param other
-     *            The other test range.
-     * 
-     * @return true if the start or end points of either range are contained
-     *         within the range of the other.
-     */
-    public boolean overlaps(Range other) {
-        return other.contains(start) || other.contains(end) || contains(other.getStart()) || contains(other.getEnd());
-    }
-
-    /**
-     * Test if two ranges exactly abutt each other.
-     * 
-     * @param other
-     *            The other Range to test.
-     * 
-     * @return true if the end of one range abutts the start of the other range.
-     */
-    public boolean abutts(Range other) {
-        return other.getStart() == end + 1 || other.getEnd() == start - 1;
-    }
-
-    /**
-     * Tests if a single point abutts either the start or end of this Range.
-     * 
-     * @param article
-     *            The point to test.
-     * 
-     * @return true if test point is equal to start - 1 or end + 1.
-     */
-    public boolean abutts(int article) {
-        return article == start - 1 || article == end + 1;
-    }
-
-    /**
-     * Test if a point is below the test Range.
-     * 
-     * @param article
-     *            The point to test.
-     * 
-     * @return true if the entire range is less than the test point.
-     */
-    public boolean lessThan(int article) {
-        return end < article;
-    }
-
-    /**
-     * Test if another Range is less than this Range.
-     * 
-     * @param other
-     *            The other Range to test.
-     * 
-     * @return true if the other Range lies completely below this Range.
-     */
-    public boolean lessThan(Range other) {
-        return end < other.start;
-    }
-
-    /**
-     * Test if a point is above the test Range.
-     * 
-     * @param article
-     *            The point to test.
-     * 
-     * @return true if the entire range is greater than the test point.
-     */
-    public boolean greaterThan(int article) {
-        return start > article;
-    }
-
-    /**
-     * Test if another Range is greater than this Range.
-     * 
-     * @param other
-     *            The other Range to test.
-     * 
-     * @return true if the other Range lies completely below this Range.
-     */
-    public boolean greaterThan(Range other) {
-        return start > other.end;
-    }
-
-    /**
-     * Merge another Range into this one. Merging will increase the bounds of
-     * this Range to encompass the entire span of the two. If the Ranges do not
-     * overlap, the newly created range will include the gap between the two.
-     * 
-     * @param other
-     *            The Range to merge.
-     */
-    public void merge(Range other) {
-        if (other.start < start) {
-            start = other.start;
-        }
-
-        if (other.end > end) {
-            end = other.end;
-        }
-    }
-
-    /**
-     * Split a range at a given split point. Splitting will truncate at the
-     * split location - 1 and return a new range beginning at location + 1; This
-     * code assumes that the split location is at neither end poing.
-     * 
-     * @param location
-     *            The split location. Location must be in the range start <
-     *            location < end.
-     * 
-     * @return A new Range object for the split portion of the range.
-     */
-    public Range split(int location) {
-        int newEnd = end;
-
-        end = location - 1;
-
-        return new Range(location + 1, newEnd);
-    }
-
-    /**
-     * Save an individual range element to a newsrc file. The range is expressed
-     * either as a single number, or a hypenated pair of numbers.
-     * 
-     * @param out
-     *            The output writer used to save the data.
-     * 
-     * @exception IOException
-     */
-    public void save(Writer out) throws IOException {
-        // do we have a single data point range?
-        if (start == end) {
-            out.write(Integer.toString(start));
-        } else {
-            out.write(Integer.toString(start));
-            out.write("-");
-            out.write(Integer.toString(end));
-        }
-    }
-
-    /**
-     * Convert a Range into String form. Used mostly for debugging.
-     * 
-     * @return The String representation of the Range.
-     */
-    public String toString() {
-        if (start == end) {
-            return Integer.toString(start);
-        } else {
-            return Integer.toString(start) + "-" + Integer.toString(end);
-        }
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/RangeList.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/RangeList.java
deleted file mode 100644
index 845f54a..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/nntp/newsrc/RangeList.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.nntp.newsrc;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.StringTokenizer;
-
-/**
- * Manage a list of ranges values from a newsrc file.
- */
-public class RangeList {
-    boolean dirty = false;
-
-    ArrayList ranges = new ArrayList();
-
-    /**
-     * Create a RangeList instance from a newsrc range line. Values are saved as
-     * a comma separated set of range values. A range value is either a single
-     * number or a hypenated pair of numbers.
-     * 
-     * @param line
-     *            The newsrc range line.
-     */
-    public RangeList(String line) {
-
-        // we might be creating an first time list, so nothing to parse.
-        if (line != null) {
-            // ranges are comma delimited tokens
-            StringTokenizer tokenizer = new StringTokenizer(line, ",");
-
-            while (tokenizer.hasMoreTokens()) {
-                String rangeString = (String) tokenizer.nextToken();
-                rangeString = rangeString.trim();
-                if (rangeString.length() != 0) {
-                    Range range = Range.parse(rangeString);
-                    if (range != null) {
-                        insert(range);
-                    }
-                }
-            }
-        }
-        // make sure we start out in a clean state. Any changes from this point
-        // will flip on the dirty flat.
-        dirty = false;
-    }
-
-    /**
-     * Insert a range item into our list. If possible, the inserted range will
-     * be merged with existing ranges.
-     * 
-     * @param newRange
-     *            The new range item.
-     */
-    public void insert(Range newRange) {
-        // first find the insertion point
-        for (int i = 0; i < ranges.size(); i++) {
-            Range range = (Range) ranges.get(i);
-            // does an existing range fully contain the new range, we don't need
-            // to insert anything.
-            if (range.contains(newRange)) {
-                return;
-            }
-
-            // does the current one abutt or overlap with the inserted range?
-            if (range.abutts(newRange) || range.overlaps(newRange)) {
-                // rats, we have an overlap...and it is possible that we could
-                // overlap with
-                // the next range after this one too. Therefore, we merge these
-                // two ranges together,
-                // remove the place where we're at, and then recursively insert
-                // the larger range into
-                // the list.
-                dirty = true;
-                newRange.merge(range);
-                ranges.remove(i);
-                insert(newRange);
-                return;
-            }
-
-            // ok, we don't touch the current one at all. If it is completely
-            // above
-            // range we're adding, we can just poke this into the list here.
-            if (newRange.lessThan(range)) {
-                dirty = true;
-                ranges.add(i, newRange);
-                return;
-            }
-        }
-        dirty = true;
-        // this is easy (and fairly common)...we just tack this on to the end.
-        ranges.add(newRange);
-    }
-
-    /**
-     * Test if a given article point falls within one of the contained Ranges.
-     * 
-     * @param article
-     *            The test point.
-     * 
-     * @return true if this falls within one of our current mark Ranges, false
-     *         otherwise.
-     */
-    public boolean isMarked(int article) {
-        for (int i = 0; i < ranges.size(); i++) {
-            Range range = (Range) ranges.get(i);
-            if (range.contains(article)) {
-                return true;
-            }
-            // we've passed the point where a match is possible.
-            if (range.greaterThan(article)) {
-                return false;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Mark a target article as having been seen.
-     * 
-     * @param article
-     *            The target article number.
-     */
-    public void setMarked(int article) {
-        // go through the insertion logic.
-        insert(new Range(article, article));
-    }
-
-    /**
-     * Clear the seen mark for a target article.
-     * 
-     * @param article
-     *            The target article number.
-     */
-    public void setUnmarked(int article) {
-        for (int i = 0; i < ranges.size(); i++) {
-            Range range = (Range) ranges.get(i);
-            // does this fall within an existing range? We don't need to do
-            // anything here.
-            if (range.contains(article)) {
-                // ok, we've found where to insert, now to figure out how to
-                // insert
-                // article is at the beginning of the range. We can just
-                // increment the lower
-                // bound, or if this is a single element range, we can remove it
-                // entirely.
-                if (range.getStart() == article) {
-                    if (range.getEnd() == article) {
-                        // piece of cake!
-                        ranges.remove(i);
-                    } else {
-                        // still pretty easy.
-                        range.setStart(article + 1);
-                    }
-                } else if (range.getEnd() == article) {
-                    // pretty easy also
-                    range.setEnd(article - 1);
-                } else {
-                    // split this into two ranges and insert the trailing piece
-                    // after this.
-                    Range section = range.split(article);
-                    ranges.add(i + 1, section);
-                }
-                dirty = true;
-                return;
-            }
-            // did we find a point where any articles are greater?
-            if (range.greaterThan(article)) {
-                // nothing to do
-                return;
-            }
-        }
-        // didn't find it at all. That was easy!
-    }
-
-    /**
-     * Save this List of Ranges out to a .newsrc file. This creates a
-     * comma-separated list of range values from each of the Ranges.
-     * 
-     * @param out
-     *            The target output stream.
-     * 
-     * @exception IOException
-     */
-    public void save(Writer out) throws IOException {
-        // we have an empty list
-        if (ranges.size() == 0) {
-            return;
-        }
-
-        Range range = (Range) ranges.get(0);
-        range.save(out);
-
-        for (int i = 1; i < ranges.size(); i++) {
-            out.write(",");
-            range = (Range) ranges.get(i);
-            range.save(out);
-        }
-    }
-
-    /**
-     * Return the state of the dirty flag.
-     * 
-     * @return True if the range list information has changed, false otherwise.
-     */
-    public boolean isDirty() {
-        return dirty;
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Command.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Command.java
deleted file mode 100644
index b161994..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Command.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3;
-
-/**
- * An abstraction for POP3Commands
- * 
- * @see org.apache.geronimo.javamail.store.pop3.POP3CommandFactory
- * 
- * @version $Rev$ $Date$
- */
-public interface POP3Command {
-
-    /**
-     * This method will get the POP3 command in string format according o
-     * rfc1939
-     */
-    public String getCommand();
-
-    /**
-     * Indicates wether this command expects a multiline response or not
-     * 
-     */
-    public boolean isMultiLineResponse();
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3CommandFactory.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3CommandFactory.java
deleted file mode 100644
index a66f97f..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3CommandFactory.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3;
-
-/**
- * Provides concrete implementations of
- * org.apache.geronimo.javamail.store.pop3.POP3Command objects representing the
- * POP3 commands defined in rfc 1939
- * 
- * @link http://www.faqs.org/rfcs/rfc1939.html
- * @version $Rev$ $Date$
- */
-public final class POP3CommandFactory implements POP3Constants {
-
-    public static POP3Command getCOMMAND_USER(final String user) {
-        return new POP3Command() {
-            public String getCommand() {
-                return "USER" + SPACE + user + CRLF;
-            }
-
-            public boolean isMultiLineResponse() {
-                return false;
-            }
-        };
-    }
-
-    public static POP3Command getCOMMAND_PASS(final String passwd) {
-        return new POP3Command() {
-            public String getCommand() {
-                return "PASS" + SPACE + passwd + CRLF;
-            }
-
-            public boolean isMultiLineResponse() {
-                return false;
-            }
-        };
-    }
-
-    public static POP3Command getCOMMAND_QUIT() {
-        return new POP3Command() {
-            public String getCommand() {
-                return "QUIT" + CRLF;
-            }
-
-            public boolean isMultiLineResponse() {
-                return false;
-            }
-        };
-    }
-
-    public static POP3Command getCOMMAND_NOOP() {
-        return new POP3Command() {
-            public String getCommand() {
-                return "NOOP" + CRLF;
-            }
-
-            public boolean isMultiLineResponse() {
-                return false;
-            }
-        };
-    }
-
-    public static POP3Command getCOMMAND_STAT() {
-        return new POP3Command() {
-            public String getCommand() {
-                return "STAT" + CRLF;
-            }
-
-            public boolean isMultiLineResponse() {
-                return false;
-            }
-        };
-    }
-
-    public static POP3Command getCOMMAND_LIST() {
-        return getCOMMAND_LIST(-1);
-    }
-
-    public static POP3Command getCOMMAND_LIST(final int msgNo) {
-        return new POP3Command() {
-            public String getCommand() {
-                if (msgNo > 0) {
-                    return "LIST" + SPACE + msgNo + CRLF;
-                } else {
-                    return "LIST" + CRLF;
-                }
-            }
-
-            /**
-             * If a msg num is specified then the the message details will be on
-             * the first line for ex. +OK 3 4520
-             * 
-             * if no msgnum is specified then all the msg details are return in
-             * a multiline format for ex. +OK 2 messages 1 456 2 46456 ..... n
-             * 366
-             */
-            public boolean isMultiLineResponse() {
-                return (msgNo < 0);
-            }
-        };
-    }
-
-    public static POP3Command getCOMMAND_RETR(final int msgNo) {
-        return new POP3Command() {
-            public String getCommand() {
-                return "RETR" + SPACE + msgNo + CRLF;
-            }
-
-            public boolean isMultiLineResponse() {
-                return true;
-            }
-        };
-    }
-
-    public static POP3Command getCOMMAND_DELE(final int msgNo) {
-        return new POP3Command() {
-            public String getCommand() {
-                return "DELE" + SPACE + msgNo + CRLF;
-            }
-
-            public boolean isMultiLineResponse() {
-                return false;
-            }
-        };
-    }
-
-    public static POP3Command getCOMMAND_REST(final int msgNo) {
-        return new POP3Command() {
-            public String getCommand() {
-                return "REST" + SPACE + msgNo + CRLF;
-            }
-
-            public boolean isMultiLineResponse() {
-                return false;
-            }
-        };
-    }
-
-    public static POP3Command getCOMMAND_TOP(final int msgNo, final int numLines) {
-        return new POP3Command() {
-            public String getCommand() {
-                return "TOP" + SPACE + msgNo + SPACE + numLines + CRLF;
-            }
-
-            public boolean isMultiLineResponse() {
-                return true;
-            }
-        };
-    }
-
-    public static POP3Command getCOMMAND_UIDL() {
-        return getCOMMAND_UIDL(-1);
-    }
-
-    public static POP3Command getCOMMAND_UIDL(final int msgNo) {
-        return new POP3Command() {
-            public String getCommand() {
-                if (msgNo > 0) {
-                    return "UIDL" + SPACE + msgNo + CRLF;
-                } else {
-                    return "UIDL" + CRLF;
-                }
-            }
-
-            public boolean isMultiLineResponse() {
-                return true;
-            }
-        };
-    }
-    
-    public static POP3Command getCOMMAND_CAPA() {
-    	return new POP3Command() {
-    		public String getCommand() {
-                return "CAPA" + CRLF;
-    		}
-    		
-    		public boolean isMultiLineResponse() {
-    			return true;
-    		}
-    	};
-    }
-
-    public static POP3Command getCOMMAND_AUTH(final String protocol) {
-    	return new POP3Command() {
-    		public String getCommand() {
-    			return "AUTH " + protocol + CRLF;
-    		}
-    		
-    		public boolean isMultiLineResponse() {
-    			return false;
-    		}
-    	};
-    }
-    
-    public static POP3Command getCOMMAND_AUTH(final String protocol, final String initialResponse) {
-    	return new POP3Command() {
-    		public String getCommand() {
-    			return "AUTH " + protocol + " " + initialResponse + CRLF;
-    		}
-    		
-    		public boolean isMultiLineResponse() {
-    			return false;
-    		}
-    	};
-    }
-    
-    public static POP3Command getCOMMAND_ChallengeReply(final String command) {
-    	return new POP3Command() {
-    			public String getCommand() {
-   						return command + CRLF;
-   				}
-    			
-    			public boolean isMultiLineResponse() {
-    				return false;
-    			}	
-    		};
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Connection.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Connection.java
deleted file mode 100644
index e5ccd4f..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Connection.java
+++ /dev/null
@@ -1,564 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3;
-
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.InetAddress;
-import java.net.Socket;
-
-import javax.mail.MessagingException;
-import javax.mail.Session;
-
-/**
- * Represents a connection with the POP3 mail server. The connection is owned by
- * a pop3 store and is only associated with one user who owns the respective
- * POP3Store instance
- * 
- * @version $Rev$ $Date$
- */
-
-
-public class POP3Connection {
-
-	protected static final String MAIL_SSLFACTORY_CLASS = "mail.SSLSocketFactory.class";
-	
-    protected static final String MAIL_POP3_FACTORY_CLASS = "socketFactory.class";
-
-    protected static final String MAIL_POP3_FACTORY_FALLBACK = "socketFactory.fallback";
-
-    protected static final String MAIL_POP3_FACTORY_PORT = "socketFactory.port";
-    
-    protected static final String MAIL_POP3_LOCALADDRESS = "localAddress";
-    
-    protected static final String MAIL_POP3_LOCALPORT = "localPort";
-    
-    protected static final String MAIL_POP3_TIMEOUT = "timeout";
-	
-    private Socket socket;
-
-    private Session session;
-
-    private String host;
-
-    private int port;
-
-    private PrintWriter writer;
-
-    private BufferedReader reader;
-    
-    private String protocol;
-    
-    private boolean sslConnection;
-
-    POP3Connection(Session session, String host, int port, boolean sslConnection, String protocol) {
-
-        this.session = session;
-        this.host = host;
-        this.port = port;
-        this.sslConnection = sslConnection;
-        this.protocol = protocol;
-    }
-
-    public void open() throws Exception {
-        try {
-
-        	if (!sslConnection) {
-        		getConnectedSocket();
-        	} else {
-        		getConnectedSSLSocket();
-        	}
-
-            if (session.getDebug()) {
-                session.getDebugOut().println("Connection successful " + this.toString());
-            }
-
-            buildInputReader();
-            buildOutputWriter();
-
-            // consume the greeting
-            if (session.getDebug()) {
-                session.getDebugOut().println("Greeting from server " + reader.readLine());
-            } else {
-                reader.readLine();
-            }
-
-        } catch (IOException e) {
-            Exception ex = new Exception("Error opening connection " + this.toString(), e);
-            throw ex;
-        }
-    }
-
-    void close() throws Exception {
-        try {
-            socket.close();
-            if (session.getDebug()) {
-                session.getDebugOut().println("Connection successfuly closed " + this.toString());
-            }
-
-        } catch (IOException e) {
-            Exception ex = new Exception("Error closing connection " + this.toString(), e);
-            throw ex;
-        }
-
-    }
-
-    public synchronized POP3Response sendCommand(POP3Command cmd) throws MessagingException {
-        if (socket.isConnected()) {
-
-            // if the underlying output stream is down
-            // attempt to rebuild the writer
-            if (socket.isOutputShutdown()) {
-                buildOutputWriter();
-            }
-
-            // if the underlying inout stream is down
-            // attempt to rebuild the reader
-            if (socket.isInputShutdown()) {
-                buildInputReader();
-            }
-
-            if (session.getDebug()) {
-                session.getDebugOut().println("\nCommand sent " + cmd.getCommand());
-            }
-
-            POP3Response res = null;
-
-            // this method supresses IOException
-            // but choose bcos of ease of use
-            {
-                writer.write(cmd.getCommand());
-                writer.flush();
-                res = POP3ResponseBuilder.buildResponse(session, reader, cmd.isMultiLineResponse());
-            }
-
-            return res;
-        }
-
-        throw new MessagingException("Connection to Mail Server is lost, connection " + this.toString());
-    }
-
-    private void buildInputReader() throws MessagingException {
-        try {
-            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
-        } catch (IOException e) {
-            throw new MessagingException("Error obtaining input stream " + this.toString(), e);
-        }
-    }
-
-    private void buildOutputWriter() throws MessagingException {
-        try {
-            writer = new PrintWriter(new BufferedOutputStream(socket.getOutputStream()));
-        } catch (IOException e) {
-            throw new MessagingException("Error obtaining output stream " + this.toString(), e);
-        }
-    }
-
-    public String toString() {
-        return "POP3Connection host: " + host + " port: " + port;
-    }
-
-
-	/**
-	 * Creates a connected socket
-	 *
-	 * @exception MessagingException
-	 */
-	protected void getConnectedSocket() throws IOException {
-	
-	    // the socket factory can be specified via a session property. By
-	    // default, we just directly
-	    // instantiate a socket without using a factor.
-	    String socketFactory = getProtocolProperty(MAIL_POP3_FACTORY_CLASS);
-	
-	    // there are several protocol properties that can be set to tune the
-	    // created socket. We need to
-	    // retrieve those bits before creating the socket.
-	    int timeout = getIntProtocolProperty(MAIL_POP3_TIMEOUT, -1);
-	    InetAddress localAddress = null;
-	    // see if we have a local address override.
-	    String localAddrProp = getProtocolProperty(MAIL_POP3_LOCALADDRESS);
-	    if (localAddrProp != null) {
-	        localAddress = InetAddress.getByName(localAddrProp);
-	    }
-	
-	    // check for a local port...default is to allow socket to choose.
-	    int localPort = getIntProtocolProperty(MAIL_POP3_LOCALPORT, 0);
-	
-	    socket = null;
-	
-	    // if there is no socket factory defined (normal), we just create a
-	    // socket directly.
-	    if (socketFactory == null) {
-	        socket = new Socket(host, port, localAddress, localPort);
-	    }
-	
-	    else {
-	        try {
-	            int socketFactoryPort = getIntProtocolProperty(MAIL_POP3_FACTORY_PORT, -1);
-	
-	            // we choose the port used by the socket based on overrides.
-	            Integer portArg = new Integer(socketFactoryPort == -1 ? port : socketFactoryPort);
-	
-	            // use the current context loader to resolve this.
-	            ClassLoader loader = Thread.currentThread().getContextClassLoader();
-	            Class factoryClass = loader.loadClass(socketFactory);
-	
-	            // done indirectly, we need to invoke the method using
-	            // reflection.
-	            // This retrieves a factory instance.
-	            Method getDefault = factoryClass.getMethod("getDefault", new Class[0]);
-	            Object defFactory = getDefault.invoke(new Object(), new Object[0]);
-	
-	            // now that we have the factory, there are two different
-	            // createSocket() calls we use,
-	            // depending on whether we have a localAddress override.
-	
-	            if (localAddress != null) {
-	                // retrieve the createSocket(String, int, InetAddress, int)
-	                // method.
-	                Class[] createSocketSig = new Class[] { String.class, Integer.TYPE, InetAddress.class, Integer.TYPE };
-	                Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-	
-	                Object[] createSocketArgs = new Object[] { host, portArg, localAddress, new Integer(localPort) };
-	                socket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-	            } else {
-	                // retrieve the createSocket(String, int) method.
-	                Class[] createSocketSig = new Class[] { String.class, Integer.TYPE };
-	                Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-	
-	                Object[] createSocketArgs = new Object[] { host, portArg };
-	                socket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-	            }
-	        } catch (Throwable e) {
-	            // if a socket factory is specified, then we may need to fall
-	            // back to a default. This behavior
-	            // is controlled by (surprise) more session properties.
-	            if (isProtocolPropertyTrue(MAIL_POP3_FACTORY_FALLBACK)) {
-	                socket = new Socket(host, port, localAddress, localPort);
-	            }
-	            // we have an exception. We're going to throw an IOException,
-	            // which may require unwrapping
-	            // or rewrapping the exception.
-	            else {
-	                // we have an exception from the reflection, so unwrap the
-	                // base exception
-	                if (e instanceof InvocationTargetException) {
-	                    e = ((InvocationTargetException) e).getTargetException();
-	                }
-
-	
-	                // throw this as an IOException, with the original exception
-	                // attached.
-	                IOException ioe = new IOException("Error connecting to " + host + ", " + port);
-	                ioe.initCause(e);
-	                throw ioe;
-	            }
-	        }
-	    }
-	
-	    if (timeout >= 0) {
-	        socket.setSoTimeout(timeout);
-	    }
-	}
-
-	/**
-	 * Creates a connected SSL socket for an initial SSL connection.
-	 *
-	 * @exception MessagingException
-	 */
-	protected void getConnectedSSLSocket() throws IOException {
-
-	    if (session.getDebug()) {
-	        session.getDebugOut().println("Attempting SSL socket connection to server " + host + ":" + port);
-	    }
-	    // the socket factory can be specified via a protocol property, a
-	    // session property, and if all else
-	    // fails (which it usually does), we fall back to the standard factory
-	    // class.
-	    String socketFactory = getProtocolProperty(MAIL_POP3_FACTORY_CLASS, getSessionProperty(MAIL_SSLFACTORY_CLASS,
-	            "javax.net.ssl.SSLSocketFactory"));
-	
-	    // there are several protocol properties that can be set to tune the
-	    // created socket. We need to
-	    // retrieve those bits before creating the socket.
-	    int timeout = getIntProtocolProperty(MAIL_POP3_TIMEOUT, -1);
-	    InetAddress localAddress = null;
-	    // see if we have a local address override.
-	    String localAddrProp = getProtocolProperty(MAIL_POP3_LOCALADDRESS);
-	    if (localAddrProp != null) {
-	        localAddress = InetAddress.getByName(localAddrProp);
-	    }
-	
-	    // check for a local port...default is to allow socket to choose.
-	    int localPort = getIntProtocolProperty(MAIL_POP3_LOCALPORT, 0);
-	
-	    socket = null;
-	
-	    // if there is no socket factory defined (normal), we just create a
-	    // socket directly.
-	    if (socketFactory == null) {
-	    	System.out.println("SocketFactory was null so creating the connection using a default");
-	        socket = new Socket(host, port, localAddress, localPort);
-	    }
-	
-	    else {
-	        // we'll try this with potentially two different factories if we're
-	        // allowed to fall back.
-	        boolean fallback = isProtocolPropertyTrue(MAIL_POP3_FACTORY_FALLBACK);
-	        while(true) {
-	            try {
-	            	
-	            	
-	            	if (socket != null) {
-	            		if (socket.isConnected())
-	            		break;
-	            	}
-	            	
-	                if (session.getDebug()) {
-	                    session.getDebugOut().println("Creating SSL socket using factory " + socketFactory);
-	                }
-	                
-	                int socketFactoryPort = getIntProtocolProperty(MAIL_POP3_FACTORY_PORT, -1);
-	
-	                // we choose the port used by the socket based on overrides.
-	                Integer portArg = new Integer(socketFactoryPort == -1 ? port : socketFactoryPort);
-	
-	                // use the current context loader to resolve this.
-	                ClassLoader loader = Thread.currentThread().getContextClassLoader();
-	                Class factoryClass = loader.loadClass(socketFactory);
-	
-	                // done indirectly, we need to invoke the method using
-	                // reflection.
-	                // This retrieves a factory instance.
-	                Method getDefault = factoryClass.getMethod("getDefault", new Class[0]);
-	                Object defFactory = getDefault.invoke(new Object(), new Object[0]);
-	
-	                // now that we have the factory, there are two different
-	                // createSocket() calls we use,
-	                // depending on whether we have a localAddress override.
-	
-	                if (localAddress != null) {
-	                    // retrieve the createSocket(String, int, InetAddress,
-	                    // int) method.
-	                    Class[] createSocketSig = new Class[] { String.class, Integer.TYPE, InetAddress.class,
-	                            Integer.TYPE };
-	                    Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-	
-	                    Object[] createSocketArgs = new Object[] { host, portArg, localAddress, new Integer(localPort) };
-	                    socket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-	                } else {
-	                    // retrieve the createSocket(String, int) method.
-	                    Class[] createSocketSig = new Class[] { String.class, Integer.TYPE };
-	                    Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-	
-	                    Object[] createSocketArgs = new Object[] { host, portArg };
-	                    socket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-	                }
-	            } catch (Throwable e) {
-	                // if we're allowed to fallback, then use the default
-	                // factory and try this again. We only
-	                // allow this to happen once.
-                    if (session.getDebug()) {
-                        session.getDebugOut().println("First attempt at creating SSL socket failed, falling back to default factory");
-                    }
-	                if (fallback) {
-	                    socketFactory = "javax.net.ssl.SSLSocketFactory";
-	                    fallback = false;
-	                    continue;
-	                }
-	                // we have an exception. We're going to throw an
-	                // IOException, which may require unwrapping
-	                // or rewrapping the exception.
-	                else {
-	                    // we have an exception from the reflection, so unwrap
-	                    // the base exception
-	                    if (e instanceof InvocationTargetException) {
-	                        e = ((InvocationTargetException) e).getTargetException();
-	                    }
-	
-	                    if (session.getDebug()) {
-	                        session.getDebugOut().println("Failure creating SSL socket: " + e);
-	                    }
-	                    // throw this as an IOException, with the original
-	                    // exception attached.
-	                    IOException ioe = new IOException("Error connecting to " + host + ", " + port);
-	                    ioe.initCause(e);
-	                    throw ioe;
-	                }
-	            }
-	        }
-	    }
-	
-	    if (timeout >= 0) {
-	        socket.setSoTimeout(timeout);
-	    }
-	}
-	
-    /**
-     * Process a session property as a boolean value, returning either true or
-     * false.
-     *
-     * @return True if the property value is "true". Returns false for any other
-     *         value (including null).
-     */
-    protected boolean isProtocolPropertyTrue(String name) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol ("pop3").
-        String fullName = "mail." + protocol + "." + name;
-        return isSessionPropertyTrue(fullName);
-    }
-
-    /**
-     * Process a session property as a boolean value, returning either true or
-     * false.
-     *
-     * @return True if the property value is "true". Returns false for any other
-     *         value (including null).
-     */
-    protected boolean isSessionPropertyTrue(String name) {
-        String property = session.getProperty(name);
-        if (property != null) {
-            return property.equals("true");
-        }
-        return false;
-    }
-    
-    /**
-     * Get a property associated with this mail session as an integer value.
-     * Returns the default value if the property doesn't exist or it doesn't
-     * have a valid int value.
-     *
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     *
-     * @return The property value converted to an int.
-     */
-    protected int getIntProtocolProperty(String name, int defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (pop3).
-        String fullName = "mail." + protocol + "." + name;
-        return getIntSessionProperty(fullName, defaultValue);
-    }
-    
-    /**
-     * Get a property associated with this mail session as an integer value.
-     * Returns the default value if the property doesn't exist or it doesn't
-     * have a valid int value.
-     *
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     *
-     * @return The property value converted to an int.
-     */
-    protected int getIntSessionProperty(String name, int defaultValue) {
-        String result = getSessionProperty(name);
-        if (result != null) {
-            try {
-                // convert into an int value.
-                return Integer.parseInt(result);
-            } catch (NumberFormatException e) {
-            }
-        }
-        // return default value if it doesn't exist is isn't convertable.
-        return defaultValue;
-    }
-
-    /**
-     * Get a property associated with this mail session. Returns the provided
-     * default if it doesn't exist.
-     *
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     *
-     * @return The property value (returns defaultValue if the property has not
-     *         been set).
-     */
-    protected String getSessionProperty(String name, String defaultValue) {
-        String result = session.getProperty(name);
-        if (result == null) {
-            return defaultValue;
-        }
-        return result;
-    }
-
-    /**
-     * Get a property associated with this mail session. Returns the provided
-     * default if it doesn't exist.
-     *
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     *
-     * @return The property value (returns defaultValue if the property has not
-     *         been set).
-     */
-    protected String getProtocolProperty(String name, String defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol ("pop3").
-        String fullName = "mail." + protocol + "." + name;
-        return getSessionProperty(fullName, defaultValue);
-    }
-    
-    /**
-     * Get a property associated with this mail protocol.
-     *
-     * @param name
-     *            The name of the property.
-     *
-     * @return The property value (returns null if the property has not been
-     *         set).
-     */
-    protected String getProtocolProperty(String name) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol ("pop3").
-        String fullName = "mail." + protocol + "." + name;
-        return getSessionProperty(fullName);
-    }
-
-    /**
-     * Get a property associated with this mail session.
-     *
-     * @param name
-     *            The name of the property.
-     *
-     * @return The property value (returns null if the property has not been
-     *         set).
-     */
-    protected String getSessionProperty(String name) {
-        return session.getProperty(name);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Constants.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Constants.java
deleted file mode 100644
index 57aed7e..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Constants.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3;
-
-/**
- * Defines a few constants that are used throught the implementation.
- * 
- * @version $Rev$ $Date$
- */
-
-public interface POP3Constants {
-    public final static String SPACE = " ";
-
-    public final static String CRLF = "\r\n";
-
-    public final static int LF = '\n';
-
-    public final static int CR = '\r';
-
-    public final static int DOT = '.';
-
-    public final static int OK = 0;
-
-    public final static int ERR = 1;
-    
-    public final static int CHALLENGE = 2;
-}
\ No newline at end of file
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Folder.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Folder.java
deleted file mode 100644
index 042c170..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Folder.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3;
-
-import java.util.Vector;
-
-import javax.mail.FetchProfile;
-import javax.mail.Flags;
-import javax.mail.Folder;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.MethodNotSupportedException;
-import javax.mail.Session;
-import javax.mail.Store;
-import javax.mail.URLName;
-import javax.mail.event.ConnectionEvent;
-
-import org.apache.geronimo.javamail.store.pop3.message.POP3Message;
-import org.apache.geronimo.javamail.store.pop3.message.POP3MessageFactory;
-import org.apache.geronimo.javamail.store.pop3.response.POP3ResponseFactory;
-import org.apache.geronimo.javamail.store.pop3.response.POP3StatusResponse;
-
-/**
- * The POP3 implementation of the javax.mail.Folder Note that only INBOX is
- * supported in POP3
- * <p>
- * <url>http://www.faqs.org/rfcs/rfc1939.html</url>
- * </p>
- * 
- * @see javax.mail.Folder
- * 
- * @version $Rev$ $Date$
- */
-public class POP3Folder extends Folder {
-
-    private boolean isFolderOpen = false;
-
-    private int mode;
-
-    private POP3Connection pop3Con;
-
-    private int msgCount;
-
-    private Session session;
-
-    /**
-     * Vector is synchronized so choose over the other Collection impls This is
-     * initialized on open A chache will save the expensive operation of
-     * retrieving the message again from the server.
-     */
-    private Vector msgCache;
-
-    protected POP3Folder(Store store, URLName url) {
-        super(store);
-    }
-
-    protected POP3Folder(Store store, Session session, POP3Connection pop3Con) {
-        super(store);
-        this.pop3Con = pop3Con;
-        this.session = session;
-    }
-
-    public String getName() {
-        return "INBOX";
-    }
-
-    public String getFullName() {
-        return "INBOX";
-    }
-
-    /**
-     * Never return "this" as the parent folder. Somebody not familliar with
-     * POP3 may do something like while(getParent() != null) or something
-     * simmilar which will result in an infinte loop
-     */
-    public Folder getParent() throws MessagingException {
-        throw new MethodNotSupportedException("INBOX is the root folder");
-    }
-
-    public boolean exists() throws MessagingException {
-        // INBOX always exists at the backend
-        return true;
-    }
-
-    public Folder[] list(String pattern) throws MessagingException {
-        throw new MethodNotSupportedException("Only INBOX is supported in POP3, no sub folders");
-    }
-
-    /**
-     * No sub folders, hence there is no notion of a seperator
-     */
-    public char getSeparator() throws MessagingException {
-        throw new MethodNotSupportedException("Only INBOX is supported in POP3, no sub folders");
-    }
-
-    public int getType() throws MessagingException {
-        return HOLDS_MESSAGES;
-    }
-
-    public boolean create(int type) throws MessagingException {
-        throw new MethodNotSupportedException("Only INBOX is supported in POP3, no sub folders");
-    }
-
-    public boolean hasNewMessages() throws MessagingException {
-        throw new MethodNotSupportedException("POP3 doesn't support this operation");
-    }
-
-    public Folder getFolder(String name) throws MessagingException {
-        throw new MethodNotSupportedException("Only INBOX is supported in POP3, no sub folders");
-    }
-
-    public boolean delete(boolean recurse) throws MessagingException {
-        throw new MethodNotSupportedException("Only INBOX is supported in POP3 and INBOX cannot be deleted");
-    }
-
-    public boolean renameTo(Folder f) throws MessagingException {
-        throw new MethodNotSupportedException("Only INBOX is supported in POP3 and INBOX cannot be renamed");
-    }
-
-    /**
-     * @see javax.mail.Folder#open(int)
-     */
-    public void open(int mode) throws MessagingException {
-        // Can only be performed on a closed folder
-        checkClosed();
-
-        try {
-
-            POP3StatusResponse res = (POP3StatusResponse) POP3ResponseFactory.getStatusResponse(pop3Con
-                    .sendCommand(POP3CommandFactory.getCOMMAND_STAT()));
-
-            // I am not checking for the res == null condition as the
-            // try catch block will handle it.
-
-            this.mode = mode;
-            this.isFolderOpen = true;
-            this.msgCount = res.getNumMessages();
-            // JavaMail API has no method in Folder to expose the total
-            // size (no of bytes) of the mail drop;
-
-            // NB:  We use the actual message number to access the messages from 
-            // the cache, which is origin 1.  Vectors are origin 0, so we add one additional 
-            // element and burn the 
-            msgCache = new Vector(msgCount + 1);
-            msgCache.setSize(msgCount + 1);
-
-        } catch (Exception e) {
-            throw new MessagingException("Unable to execute STAT command", e);
-        }
-
-        notifyConnectionListeners(ConnectionEvent.OPENED);
-    }
-
-    public void close(boolean expunge) throws MessagingException {
-        // Can only be performed on an open folder
-        checkOpen();
-
-        try {
-            if (mode == READ_WRITE) {
-                // find all messages marked deleted and issue DELE commands
-                POP3Message m;
-                // NB: the first element in the cache is not used.
-                for (int i = 1; i < msgCache.size(); i++) {
-                    if ((m = (POP3Message) msgCache.elementAt(i)) != null) {
-                        if (m.isSet(Flags.Flag.DELETED)) {
-                            try {
-                                pop3Con.sendCommand(POP3CommandFactory.getCOMMAND_DELE(i + 1));
-                            } catch (Exception e) {
-                                throw new MessagingException("Exception deleting message no [" + (i + 1)
-                                        + "] during close", e);
-                            }
-                        }
-                    }
-                }
-            }
-
-            try {
-                pop3Con.sendCommand(POP3CommandFactory.getCOMMAND_QUIT());
-            } catch (Exception e) {
-                // doesn't really care about the response
-            }
-            // dosn't need a catch block here, but added incase something goes
-            // wrong
-            // so that the finnaly is garunteed to execute in such a case.
-        } finally {
-            try {
-                pop3Con.close();
-            } catch (Exception e) {
-                // doesn't really care about the response
-                // all we can do is to set the reference explicitly to null
-                pop3Con = null;
-            }
-
-            /*
-             * The message numbers depend on the mail drop if the connection is
-             * closed, then purge the cache
-             */
-            msgCache = null;
-            isFolderOpen = false;
-            notifyConnectionListeners(ConnectionEvent.CLOSED);
-        }
-    }
-
-    public boolean isOpen() {
-        return isFolderOpen;
-    }
-
-    public Flags getPermanentFlags() {
-        // unfortunately doesn't have a throws clause for this method
-        // throw new MethodNotSupportedException("POP3 doesn't support permanent
-        // flags");
-
-        // Better than returning null, save the extra condition from a user to
-        // check for null
-        // and avoids a NullPointerException for the careless.
-        return new Flags();
-    }
-
-    public int getMessageCount() throws MessagingException {
-        return msgCount;
-    }
-
-    /**
-     * Checks wether the message is in cache, if not will create a new message
-     * object and return it.
-     * 
-     * @see javax.mail.Folder#getMessage(int)
-     */
-    public Message getMessage(int msgNum) throws MessagingException {
-        // Can only be performed on an Open folder
-        checkOpen();
-        if (msgNum < 1 || msgNum > getMessageCount()) {
-            throw new MessagingException("Invalid Message number");
-        }
-
-        Message msg = null;
-        try {
-            msg = (Message) msgCache.elementAt(msgNum);
-        } catch (RuntimeException e) {
-            session.getDebugOut().println("Message not in cache");
-        }
-        if (msg == null) {
-            msg = POP3MessageFactory.createMessage(this, session, pop3Con, msgNum);
-            msgCache.setElementAt(msg, msgNum);
-        }
-
-        return msg;
-    }
-
-    public void appendMessages(Message[] msgs) throws MessagingException {
-        throw new MethodNotSupportedException("Message appending is not supported in POP3");
-
-    }
-
-    public Message[] expunge() throws MessagingException {
-        throw new MethodNotSupportedException("Expunge is not supported in POP3");
-    }
-
-    public int getMode() throws IllegalStateException {
-        // Can only be performed on an Open folder
-        checkOpen();
-        return mode;
-    }
-
-    /**
-     * @see javax.mail.Folder#fetch(javax.mail.Message[],
-     *      javax.mail.FetchProfile)
-     * 
-     * The JavaMail API recommends that this method be overrident to provide a
-     * meaningfull implementation.
-     */
-    public void fetch(Message[] msgs, FetchProfile fp) throws MessagingException {
-        // Can only be performed on an Open folder
-        checkOpen();
-        for (int i = 0; i < msgs.length; i++) {
-            Message msg = msgs[i];
-            if (msg == null) {
-                msg = POP3MessageFactory.createMessage(this, session, pop3Con, i);
-            }
-            if (fp.contains(FetchProfile.Item.ENVELOPE)) {
-                msg = POP3MessageFactory.createMessageWithEvelope((POP3Message) msg);
-            }
-
-            if (fp.contains(FetchProfile.Item.CONTENT_INFO)) {
-                msg = POP3MessageFactory.createMessageWithContentInfo((POP3Message) msg);
-            }
-
-            if (fp.contains(FetchProfile.Item.FLAGS)) {
-                msg = POP3MessageFactory.createMessageWithFlags((POP3Message) msg);
-            }
-
-            msgs[i] = msg;
-        }
-    }
-
-    /**
-     * Below is a list of covinience methods that avoid repeated checking for a
-     * value and throwing an exception
-     */
-
-    /** Ensure the folder is open */
-    private void checkOpen() throws IllegalStateException {
-        if (!isFolderOpen) {
-            throw new IllegalStateException("Folder is not Open");
-        }
-    }
-
-    /** Ensure the folder is not open */
-    private void checkClosed() throws IllegalStateException {
-        if (isFolderOpen) {
-            throw new IllegalStateException("Folder is Open");
-        }
-    }
-
-    /**
-     * @see javax.mail.Folder#notifyMessageChangedListeners(int,
-     *      javax.mail.Message)
-     * 
-     * this method is protected and cannot be used outside of Folder, therefore
-     * had to explicitly expose it via a method in POP3Folder, so that
-     * POP3Message has access to it
-     * 
-     * Bad design on the part of the Java Mail API.
-     */
-    public void notifyMessageChangedListeners(int type, Message m) {
-        super.notifyMessageChangedListeners(type, m);
-    }
-
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Response.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Response.java
deleted file mode 100644
index 197ca20..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Response.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3;
-
-import java.io.InputStream;
-
-/**
- * An abstraction for POP3 Response
- * 
- * @see org.apache.geronimo.javamail.store.pop3.response.POP3ResponseFactory
- * @see org.apache.geronimo.javamail.store.pop3.response.DefaultPOP3Response
- * @see org.apache.geronimo.javamail.store.pop3.response.POP3StatusResponse
- * 
- * @version $Rev$ $Date$
- */
-public interface POP3Response {
-
-    /**
-     * Returns the response OK, CHALLENGE or ERR
-     * <ul>
-     * <li>OK --> +OK in pop3 spec
-     * <li>CHALLENGE --> + in pop3 spec
-     * <li>ERR --> -ERR in pop3 spec
-     * </ul>
-     */
-    public int getStatus();
-
-    /**
-     * this corresponds to the line with the status however the status will be
-     * removed and the remainder is returned. Ex. "+OK 132 3023673" is the first
-     * line of response for a STAT command this method will return "132 3023673"
-     * 
-     * So any subsequent process can parse the params 132 as no of msgs and
-     * 3023674 as the size.
-     * 
-     * @see org.apache.geronimo.javamail.store.pop3.response.POP3StatusResponse
-     */
-    public String getFirstLine();
-
-    /**
-     * This way we are not restricting anybody as InputStream.class is the most
-     * basic type to represent an inputstream and ppl can decorate it anyway
-     * they want, for ex BufferedInputStream or as an InputStreamReader allowing
-     * maximum flexibility in using it.
-     */
-    public InputStream getData();
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3ResponseBuilder.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3ResponseBuilder.java
deleted file mode 100644
index 7b0ab4a..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3ResponseBuilder.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.mail.MessagingException;
-import javax.mail.Session;
-
-import org.apache.geronimo.javamail.store.pop3.response.POP3ResponseFactory;
-
-;
-
-/**
- * Builds a basic response out of the input stream received by the connection.
- * Performs only two basic functions
- * <ul>
- * <li>Extrats the status code</li>
- * <li>If multi-line response then extract the data as an input stream</li>
- * </ul>
- * 
- * @version $Rev$ $Date$
- */
-
-public final class POP3ResponseBuilder implements POP3Constants {
-
-    public static POP3Response buildResponse(Session session, BufferedReader reader, boolean isMultiLineResponse)
-            throws MessagingException {
-
-        int status = ERR;
-        InputStream data = null;
-
-        String line;
-        try {
-            line = reader.readLine();
-        } catch (IOException e) {
-            throw new MessagingException("Error in receving response");
-        }
-        if (line == null || line.trim().equals("")) {
-            if (session.getDebug()) {
-                session.getDebugOut().println("Empty Response");
-            }
-            throw new MessagingException("Empty Response");
-        }
-        if (session.getDebug()) {
-            session.getDebugOut().println("Response From Server " + line);
-        }
-
-        if (line.startsWith("+OK")) {
-            status = OK;
-            line = removeStatusField(line);
-            if (isMultiLineResponse) {
-                data = getMultiLineResponse(session, reader);
-            }
-        } else if (line.startsWith("-ERR")) {
-            status = ERR;
-            line = removeStatusField(line);
-        }else if (line.startsWith("+")) {
-        	status = CHALLENGE;
-        	line = removeStatusField(line);
-        	if (isMultiLineResponse) {
-        		data = getMultiLineResponse(session, reader);
-        	}
-        } else {
-            throw new MessagingException("Unexpected response: " + line);
-        }
-
-        return POP3ResponseFactory.getDefaultResponse(status, line, data);
-    }
-
-    private static String removeStatusField(String line) {
-        return line.substring(line.indexOf(SPACE) + 1);
-    }
-
-    /**
-     * This could be a multiline response
-     */
-    private static InputStream getMultiLineResponse(Session session, BufferedReader reader) throws MessagingException {
-
-        int byteRead = -1;
-        int lastByteRead = LF;
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        try {
-            while ((byteRead = reader.read()) >= 0) {
-                // We are checking for the end of a multiline response
-                // the format is .CRLF
-
-                // checking for the DOT and CR
-                if (lastByteRead == DOT && byteRead == CR) {
-                    byteRead = reader.read();
-                    // now checking for the LF of the second CRLF
-                    if (byteRead == LF) {
-                        // end of response
-                        break;
-                    }
-                }
-
-                out.write(byteRead);
-                lastByteRead = byteRead;
-            }
-
-            if (session.getDebug()) {
-                session.getDebugOut().println("\n============================ Response Content==================\n");
-                session.getDebugOut().write(out.toByteArray());
-                session.getDebugOut().println("\n==============================================================\n");
-            }
-
-        } catch (IOException e) {
-            throw new MessagingException("Error processing a multi-line response", e);
-        }
-
-        return new ByteArrayInputStream(out.toByteArray());
-    }
-
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Store.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Store.java
deleted file mode 100644
index 5caed89..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/POP3Store.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3;
-
-import javax.mail.AuthenticationFailedException;
-import javax.mail.Folder;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.Store;
-import javax.mail.URLName;
-
-/**
- * POP3 implementation of javax.mail.Store POP protocol spec is implemented in
- * org.apache.geronimo.javamail.store.pop3.POP3Connection
- * 
- * @version $Rev$ $Date$
- */
-
-public class POP3Store extends Store {
-
-    private POP3Connection pop3Con;
-
-    protected static final int DEFAULT_MAIL_POP3_PORT = 110;
-    private boolean sslConnection;
-    private int defaultPort;
-    
-    private String protocol;
-    public POP3Store(Session session, URLName name) {
-        this(session, name, "pop3", DEFAULT_MAIL_POP3_PORT, false);
-    }
-
-    /**
-     * Common constructor used by the POP3Store and POP3SSLStore classes
-     * to do common initialization of defaults.
-     *
-     * @param session
-     *            The host session instance.
-     * @param name
-     *            The URLName of the target.
-     * @param protocol
-     *            The protocol type ("pop3"). This helps us in
-     *            retrieving protocol-specific session properties.
-     * @param defaultPort
-     *            The default port used by this protocol. For pop3, this will
-     *            be 110. The default for pop3 with ssl is 995.
-     * @param sslConnection
-     *            Indicates whether an SSL connection should be used to initial
-     *            contact the server. This is different from the STARTTLS
-     *            support, which switches the connection to SSL after the
-     *            initial startup.
-     */
-    protected POP3Store(Session session, URLName name, String protocol, int defaultPort, boolean sslConnection) {
-        super(session, name);
-        this.protocol = protocol;
-
-        // these are defaults based on what the superclass specifies.
-        this.sslConnection = sslConnection;
-        this.defaultPort = defaultPort;
-
-    }
-    /**
-     * @see javax.mail.Store#getDefaultFolder()
-     * 
-     * There is only INBOX supported in POP3 so the default folder is inbox
-     */
-    public Folder getDefaultFolder() throws MessagingException {
-        return getFolder("INBOX");
-    }
-
-    /**
-     * @see javax.mail.Store#getFolder(java.lang.String)
-     */
-    public Folder getFolder(String name) throws MessagingException {
-
-        checkConnectionStatus();
-
-        if (!"INBOX".equalsIgnoreCase(name)) {
-            throw new MessagingException("Only INBOX is supported in POP3");
-        }
-        return new POP3Folder(this, session, pop3Con);
-    }
-
-    /**
-     * @see javax.mail.Store#getFolder(javax.mail.URLName)
-     */
-    public Folder getFolder(URLName url) throws MessagingException {
-        return getFolder(url.getFile());
-    }
-
-    /**
-     * @see javax.mail.Service#protocolConnect(java.lang.String, int,
-     *      java.lang.String, java.lang.String)
-     */
-    protected synchronized boolean protocolConnect(String host, int portNum, String user, String passwd)
-            throws MessagingException {
-
-        // Never store the user, passwd for security reasons
-
-        // if these values are null, no connection attempt should be made
-        if (host == null || passwd == null || user == null) {
-            return false;
-        }
-
-        // validate port num
-        if (portNum < 1) {
-            String portstring = session.getProperty("mail.pop3.port");
-            if (portstring != null) {
-                try {
-                    portNum = Integer.parseInt(portstring);
-                } catch (NumberFormatException e) {
-                    portNum = defaultPort;
-                }
-            }
-        }
-
-        /*
-         * Obtaining a connection to the server.
-         * 
-         */
-        pop3Con = new POP3Connection(this.session, host, portNum, sslConnection, protocol);
-        try {
-            pop3Con.open();
-        } catch (Exception e) {
-            throw new MessagingException("Connection failed", e);
-        }
-
-        /*
-         * Sending the USER command with username
-         * 
-         */
-        POP3Response resUser = null;
-        try {
-            resUser = pop3Con.sendCommand(POP3CommandFactory.getCOMMAND_USER(user));
-        } catch (Exception e) {
-            throw new MessagingException("Connection failed", e);
-        }
-
-        if (POP3Constants.ERR == resUser.getStatus()) {
-
-            /*
-             * Authentication failed so sending QUIT
-             * 
-             */
-            try {
-                pop3Con.sendCommand(POP3CommandFactory.getCOMMAND_QUIT());
-            } catch (Exception e) {
-                // We don't care about the response or if any error happens
-                // just trying to comply with the spec.
-                // Most likely the server would have terminated the connection
-                // by now.
-            }
-
-            throw new AuthenticationFailedException(resUser.getFirstLine());
-        }
-
-        /*
-         * Sending the PASS command with password
-         * 
-         */
-        POP3Response resPwd = null;
-        try {
-            resPwd = pop3Con.sendCommand(POP3CommandFactory.getCOMMAND_PASS(passwd));
-        } catch (Exception e) {
-            throw new MessagingException("Connection failed", e);
-        }
-
-        if (POP3Constants.ERR == resPwd.getStatus()) {
-
-            /*
-             * Authentication failed so sending QUIT
-             * 
-             */
-            try {
-                pop3Con.sendCommand(POP3CommandFactory.getCOMMAND_QUIT());
-            } catch (Exception e) {
-                // We don't care about the response or if any error happens
-                // just trying to comply with the spec.
-                // Most likely the server would have terminated the connection
-                // by now.
-            }
-
-            throw new AuthenticationFailedException(resPwd.getFirstLine());
-        }
-
-        return true;
-    }
-
-    /**
-     * @see javax.mail.Service#isConnected()
-     */
-    public boolean isConnected() {
-        POP3Response res = null;
-        try {
-            res = pop3Con.sendCommand(POP3CommandFactory.getCOMMAND_NOOP());
-        } catch (Exception e) {
-            return false;
-        }
-
-        return (POP3Constants.OK == res.getStatus());
-    }
-
-    /**
-     * @see javax.mail.Service#close()
-     */
-    public void close() throws MessagingException {
-        // This is done to ensure proper event notification.
-        super.close();
-        try {
-            pop3Con.close();
-        } catch (Exception e) {
-            // A message is already set at the connection level
-            // unfortuantely there is no constructor that takes only
-            // the root exception
-            new MessagingException("", e);
-        }
-    }
-
-    private void checkConnectionStatus() throws MessagingException {
-        if (!this.isConnected()) {
-            throw new MessagingException("Not connected ");
-        }
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3Message.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3Message.java
deleted file mode 100644
index c8183ec..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3Message.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3.message;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Enumeration;
-
-import javax.mail.Flags;
-import javax.mail.Folder;
-import javax.mail.IllegalWriteException;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.event.MessageChangedEvent;
-import javax.mail.internet.InternetHeaders;
-import javax.mail.internet.MimeMessage;
-
-import org.apache.geronimo.javamail.store.pop3.POP3CommandFactory;
-import org.apache.geronimo.javamail.store.pop3.POP3Connection;
-import org.apache.geronimo.javamail.store.pop3.POP3Folder;
-import org.apache.geronimo.javamail.store.pop3.POP3Response;
-import org.apache.geronimo.javamail.store.pop3.response.POP3ListResponse;
-import org.apache.geronimo.javamail.store.pop3.response.POP3ResponseFactory;
-
-/**
- * POP3 implementation of javax.mail.internet.MimeMessage
- * 
- * Only the most basic information is given and Message objects created here is
- * a light-weight reference to the actual Message As per the JavaMail spec items
- * from the actual message will get filled up on demand
- * 
- * If some other items are obtained from the server as a result of one call,
- * then the other details are also processed and filled in. For ex if RETR is
- * called then header information will also be processed in addition to the
- * content
- * 
- * @version $Rev$ $Date$
- */
-public class POP3Message extends MimeMessage {
-
-    private POP3Connection pop3Con;
-
-    private int msgSize = -1;
-
-    private int headerSize = -1;
-
-    // We can't use header bcos it's already initialize to
-    // to an empty InternetHeader
-    private InputStream rawHeaders;
-
-    // used to force loading of headers again
-    private boolean loadHeaders = true;
-
-    // to get accessed to the debug setting and log
-    private Session session;
-
-    protected POP3Message(Folder folder, int msgnum, Session session, POP3Connection pop3Con) {
-        super(folder, msgnum);
-        this.pop3Con = pop3Con;
-        this.session = session;
-    }
-
-    /**
-     * @see javax.mail.internet.MimeMessage#getContentStream()
-     */
-    protected InputStream getContentStream() throws MessagingException {
-        POP3Response msgResponse = null;
-        try {
-            msgResponse = pop3Con.sendCommand(POP3CommandFactory.getCOMMAND_RETR(msgnum));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        loadHeaders = true;
-        loadHeaders(msgResponse.getData());
-        loadContent(msgResponse.getData());
-
-        return contentStream;
-    }
-
-    public void setFlags(Flags newFlags, boolean set) throws MessagingException {
-        Flags oldFlags = (Flags) flags.clone();
-        super.setFlags(newFlags, set);
-
-        if (!flags.equals(oldFlags)) {
-            ((POP3Folder) folder).notifyMessageChangedListeners(MessageChangedEvent.FLAGS_CHANGED, this);
-        }
-    }
-
-    protected void loadHeaders(InputStream in) throws MessagingException {
-        if (loadHeaders || rawHeaders == null) {
-            rawHeaders = in;
-            headers = new InternetHeaders(rawHeaders);
-            loadHeaders = false;
-        }
-    }
-
-    protected void loadContent(InputStream stream) throws MessagingException {
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        try {
-            int byteRead = stream.read();
-            int lastByte = -1;
-            for (; byteRead > 0;) {
-                if (byteRead == ' ' && lastByte == '\n') {
-                    break;
-                }
-                lastByte = byteRead;
-                byteRead = stream.read();
-            }
-
-            for (; stream.available() > 0;) {
-                out.write(stream.read());
-            }
-
-            contentStream = new ByteArrayInputStream(out.toByteArray());
-            msgSize = contentStream.available();
-
-        } catch (IOException e) {
-
-            throw new MessagingException("Error loading content info", e);
-        }
-    }
-
-    public int getSize() throws MessagingException {
-        if (msgSize >= 0) {
-            return msgSize;
-        }
-        try {
-
-            if (msgSize < 0) {
-                if (rawHeaders == null) {
-                    loadHeaders();
-                }
-                POP3ListResponse res = (POP3ListResponse) POP3ResponseFactory.getListResponse(pop3Con
-                        .sendCommand(POP3CommandFactory.getCOMMAND_LIST(msgnum)));
-                msgSize = res.getSize() - headerSize;
-            }
-            return msgSize;
-        } catch (MessagingException ex) {
-            throw new MessagingException("error getting size", ex);
-        }
-    }
-
-    /**
-     * notice that we pass zero as the no of lines from the message,as it
-     * doesn't serv any purpose to get only a certain number of lines.
-     * 
-     * However this maybe important if a mail client only shows 3 or 4 lines of
-     * the message in the list and then when the user clicks they would load the
-     * message on demand.
-     * 
-     */
-    protected void loadHeaders() throws MessagingException {
-        POP3Response msgResponse = null;
-        try {
-
-            msgResponse = pop3Con.sendCommand(POP3CommandFactory.getCOMMAND_TOP(msgnum, 0));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        loadHeaders(msgResponse.getData());
-    }
-
-    /***************************************************************************
-     * Following is a set of methods that deal with headers I have tried to use
-     * the bare minimum
-     * 
-     * Used sun's POP3 impl & JavaMail API as a guide in decided which methods
-     * are important.
-     **************************************************************************/
-
-    public String[] getHeader(String name) throws MessagingException {
-        if (rawHeaders == null)
-            loadHeaders();
-        return headers.getHeader(name);
-    }
-
-    public String getHeader(String name, String delimiter) throws MessagingException {
-        if (headers == null)
-            loadHeaders();
-        return headers.getHeader(name, delimiter);
-    }
-
-    public Enumeration getAllHeaders() throws MessagingException {
-        if (headers == null)
-            loadHeaders();
-        return headers.getAllHeaders();
-    }
-
-    public Enumeration getMatchingHeaders(String[] names) throws MessagingException {
-        if (headers == null)
-            loadHeaders();
-        return headers.getMatchingHeaders(names);
-    }
-
-    public Enumeration getNonMatchingHeaders(String[] names) throws MessagingException {
-        if (headers == null)
-            loadHeaders();
-        return headers.getNonMatchingHeaders(names);
-    }
-
-    public Enumeration getAllHeaderLines() throws MessagingException {
-        if (headers == null)
-            loadHeaders();
-        return headers.getAllHeaderLines();
-    }
-
-    public Enumeration getMatchingHeaderLines(String[] names) throws MessagingException {
-        if (headers == null)
-            loadHeaders();
-        return headers.getMatchingHeaderLines(names);
-    }
-
-    public Enumeration getNonMatchingHeaderLines(String[] names) throws MessagingException {
-        if (headers == null)
-            loadHeaders();
-        return headers.getNonMatchingHeaderLines(names);
-    }
-
-    // the following are overrides for header modification methods. These
-    // messages are read only,
-    // so the headers cannot be modified.
-    public void addHeader(String name, String value) throws MessagingException {
-        throw new IllegalWriteException("POP3 messages are read-only");
-    }
-
-    public void setHeader(String name, String value) throws MessagingException {
-        throw new IllegalWriteException("POP3 messages are read-only");
-    }
-
-    public void removeHeader(String name) throws MessagingException {
-        throw new IllegalWriteException("POP3 messages are read-only");
-    }
-
-    public void addHeaderLine(String line) throws MessagingException {
-        throw new IllegalWriteException("POP3 messages are read-only");
-    }
-
-    /**
-     * We cannot modify these messages
-     */
-    public void saveChanges() throws MessagingException {
-        throw new IllegalWriteException("POP3 messages are read-only");
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageFactory.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageFactory.java
deleted file mode 100644
index 7c8d493..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageFactory.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3.message;
-
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.internet.MimeMessage.RecipientType;
-
-import org.apache.geronimo.javamail.store.pop3.POP3Connection;
-import org.apache.geronimo.javamail.store.pop3.POP3Folder;
-
-/**
- * Fctory class to create POP3Messages based on the fetch profile
- * 
- * @version $Rev$ $Date$
- */
-public final class POP3MessageFactory {
-
-    /**
-     * Creates a basic method with no items, the items will be loaded on demand
-     * 
-     * @param folder
-     * @param session
-     * @param pop3Con
-     * @param msgNum
-     * @return
-     */
-    public static Message createMessage(POP3Folder folder, Session session, POP3Connection pop3Con, int msgNum) {
-        return new POP3Message(folder, msgNum, session, pop3Con);
-    }
-
-    /**
-     * Created in response to <cpde>FetchProfile.ENVELOPE</code>
-     */
-    public static Message createMessageWithEvelope(POP3Message msg) throws MessagingException {
-        msg.getAllHeaders();
-        msg.getSender();
-        msg.getSentDate();
-        msg.getSubject();
-        msg.getReplyTo();
-        msg.getReceivedDate();
-        msg.getRecipients(RecipientType.TO);
-
-        return msg;
-    }
-
-    /**
-     * Created in response to <code>FetchProfile.CONTENT_INFO</code>
-     */
-    public static Message createMessageWithContentInfo(POP3Message msg) throws MessagingException {
-        msg.getContentType();
-        msg.getDisposition();
-        msg.getDescription();
-        msg.getSize();
-        msg.getLineCount();
-
-        return msg;
-    }
-
-    /**
-     * Created in response to <code>FetchProfile.FLAGS</code>
-     */
-    public static Message createMessageWithFlags(POP3Message msg) throws MessagingException {
-        msg.getFlags();
-        return msg;
-    }
-
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageWithContentInfo.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageWithContentInfo.java
deleted file mode 100644
index 17ca20d..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageWithContentInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3.message;
-
-import javax.mail.Folder;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-
-import org.apache.geronimo.javamail.store.pop3.POP3Connection;
-
-/**
- * light-weight Message object will be created in response to
- * FetchProfile.CONTENT_INFO other details will be filled on demand *
- * 
- * @version $Rev$ $Date$
- * 
- */
-
-public class POP3MessageWithContentInfo extends POP3Message {
-
-    public POP3MessageWithContentInfo(Folder folder, int msgnum, Session session, POP3Connection pop3Con)
-            throws MessagingException {
-        super(folder, msgnum, null, pop3Con);
-        this.getContentType();
-        this.getDisposition();
-        this.getDescription();
-        this.getSize();
-        this.getLineCount();
-    }
-
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageWithEnvelope.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageWithEnvelope.java
deleted file mode 100644
index bc05d39..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageWithEnvelope.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3.message;
-
-import javax.mail.Folder;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-
-import org.apache.geronimo.javamail.store.pop3.POP3Connection;
-
-/**
- * light-weight Message object will be created in response to
- * FetchProfile.ENVELOPE other details will be filled on demand *
- * 
- * @version $Rev$ $Date$
- */
-
-public class POP3MessageWithEnvelope extends POP3Message {
-
-    protected POP3MessageWithEnvelope(Folder folder, int msgnum, Session session, POP3Connection pop3Con)
-            throws MessagingException {
-        super(folder, msgnum, session, pop3Con);
-        this.getAllHeaders();
-        this.getSender();
-        this.getSentDate();
-        this.getSubject();
-        this.getReplyTo();
-        this.getReceivedDate();
-        this.getRecipients(RecipientType.TO);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageWithFlags.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageWithFlags.java
deleted file mode 100644
index 2c6ac64..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/message/POP3MessageWithFlags.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3.message;
-
-import javax.mail.Folder;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-
-import org.apache.geronimo.javamail.store.pop3.POP3Connection;
-
-/**
- * light-weight Message object will be created in response to FetchProfile.FLAGS
- * other details will be filled on demand *
- * 
- * @version $Rev$ $Date$
- */
-
-public class POP3MessageWithFlags extends POP3Message {
-
-    protected POP3MessageWithFlags(Folder folder, int msgnum, Session session, POP3Connection pop3Con)
-            throws MessagingException {
-        super(folder, msgnum, session, pop3Con);
-        this.getFlags();
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/DefaultPOP3Response.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/DefaultPOP3Response.java
deleted file mode 100644
index 43e33ed..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/DefaultPOP3Response.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3.response;
-
-import java.io.InputStream;
-
-import org.apache.geronimo.javamail.store.pop3.POP3Constants;
-import org.apache.geronimo.javamail.store.pop3.POP3Response;
-
-/**
- * This class provides the basic implementation for the POP3Response.
- * 
- * @see org.apache.geronimo.javamail.store.pop3.POP3Response
- * @version $Rev$ $Date$
- */
-
-public class DefaultPOP3Response implements POP3Response, POP3Constants {
-
-    private int status = ERR;
-
-    private String firstLine;
-
-    private InputStream data;
-
-    DefaultPOP3Response(int status, String firstLine, InputStream data) {
-        this.status = status;
-        this.firstLine = firstLine;
-        this.data = data;
-    }
-
-    public int getStatus() {
-        return status;
-    }
-
-    public InputStream getData() {
-        return data;
-    }
-
-    public String getFirstLine() {
-        return firstLine;
-    }
-
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/POP3ListResponse.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/POP3ListResponse.java
deleted file mode 100644
index 448322a..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/POP3ListResponse.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3.response;
-
-import java.util.Vector;
-
-import javax.mail.MessagingException;
-
-import org.apache.geronimo.javamail.store.pop3.POP3Response;
-
-/**
- * This class adds functionality to the basic response by parsing the reply for
- * LIST command and obtaining specific information about the msgnum and the
- * size. It could be for one or more msgs depending on wether a msg number was
- * passed or not into the LIST command
- * 
- * @see org.apache.geronimo.javamail.store.pop3.POP3Response
- * @see org.apache.geronimo.javamail.store.pop3.response.DefaultPOP3Response
- * 
- * @version $Rev$ $Date$
- */
-
-public class POP3ListResponse extends DefaultPOP3Response {
-
-    private int msgnum = 0;
-
-    private int size = 0;
-
-    private Vector multipleMsgs = null;
-
-    POP3ListResponse(POP3Response baseRes) throws MessagingException {
-        super(baseRes.getStatus(), baseRes.getFirstLine(), baseRes.getData());
-
-        // if ERR not worth proceeding any further
-        if (OK == getStatus()) {
-
-            // if data == null, then it mean it's a single line response
-            if (baseRes.getData() == null) {
-                String[] args = getFirstLine().split(SPACE);
-                try {
-                    msgnum = Integer.parseInt(args[0]);
-                } catch (NumberFormatException e) {
-                    throw new MessagingException("Invalid response for STAT command", e);
-                }
-                try {
-                    size = Integer.parseInt(args[1]);
-                } catch (NumberFormatException e) {
-                    throw new MessagingException("Invalid response for STAT command", e);
-                }
-            } else {
-                int totalMsgs = 0;
-                String[] args = getFirstLine().split(SPACE);
-                try {
-                    totalMsgs = Integer.parseInt(args[0]);
-                } catch (NumberFormatException e) {
-                    throw new MessagingException("Invalid response for STAT command", e);
-                }
-                multipleMsgs = new Vector(totalMsgs);
-                multipleMsgs.setSize(totalMsgs);
-                // Todo : multi-line response parsing
-            }
-
-        }
-    }
-
-    public int getMessageNumber() {
-        return msgnum;
-    }
-
-    public int getSize() {
-        return size;
-    }
-
-    /**
-     * Messages can be accessed by multipleMsgs.getElementAt(msgnum)
-     * 
-     */
-    public Vector getMultipleMessageDetails() {
-        return multipleMsgs;
-    }
-
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/POP3ResponseFactory.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/POP3ResponseFactory.java
deleted file mode 100644
index 5412746..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/POP3ResponseFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3.response;
-
-import java.io.InputStream;
-
-import javax.mail.MessagingException;
-
-import org.apache.geronimo.javamail.store.pop3.POP3Constants;
-import org.apache.geronimo.javamail.store.pop3.POP3Response;
-
-/**
- * This factory provides a uniform way of handling the creation of response
- * objects.
- * 
- * @version $Rev$ $Date$
- */
-
-public final class POP3ResponseFactory implements POP3Constants {
-
-    public static POP3Response getDefaultResponse(int status, String line, InputStream data) {
-        return new DefaultPOP3Response(status, line, data);
-    }
-
-    public static POP3Response getStatusResponse(POP3Response baseRes) throws MessagingException {
-        return new POP3StatusResponse(baseRes);
-    }
-
-    public static POP3Response getListResponse(POP3Response baseRes) throws MessagingException {
-        return new POP3StatusResponse(baseRes);
-    }
-
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/POP3StatusResponse.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/POP3StatusResponse.java
deleted file mode 100644
index 4fceb84..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/store/pop3/response/POP3StatusResponse.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.store.pop3.response;
-
-import javax.mail.MessagingException;
-
-import org.apache.geronimo.javamail.store.pop3.POP3Response;
-
-/**
- * This class adds functionality to the basic response by parsing the status
- * line and obtaining specific information about num of msgs and the size
- * 
- * @see org.apache.geronimo.javamail.store.pop3.POP3Response
- * @see org.apache.geronimo.javamail.store.pop3.response.DefaultPOP3Response
- * 
- * @version $Rev$ $Date$
- */
-
-public class POP3StatusResponse extends DefaultPOP3Response {
-
-    private int numMessages = 0;
-
-    private int size = 0;
-
-    POP3StatusResponse(POP3Response baseRes) throws MessagingException {
-        super(baseRes.getStatus(), baseRes.getFirstLine(), baseRes.getData());
-
-        // if ERR not worth proceeding any further
-        if (OK == getStatus()) {
-            String[] args = getFirstLine().split(SPACE);
-            try {
-                numMessages = Integer.parseInt(args[0]);
-            } catch (NumberFormatException e) {
-                throw new MessagingException("Invalid response for STAT command", e);
-            }
-            try {
-                size = Integer.parseInt(args[1]);
-            } catch (NumberFormatException e) {
-                throw new MessagingException("Invalid response for STAT command", e);
-            }
-        }
-    }
-
-    public int getNumMessages() {
-        return numMessages;
-    }
-
-    public int getSize() {
-        return size;
-    }
-
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/NNTPConnection.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/NNTPConnection.java
deleted file mode 100644
index a8ca219..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/NNTPConnection.java
+++ /dev/null
@@ -1,1081 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.nntp;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-
-import org.apache.geronimo.javamail.authentication.ClientAuthenticator;
-import org.apache.geronimo.javamail.authentication.CramMD5Authenticator;
-import org.apache.geronimo.javamail.authentication.DigestMD5Authenticator;
-import org.apache.geronimo.javamail.authentication.LoginAuthenticator;
-import org.apache.geronimo.javamail.authentication.PlainAuthenticator;
-import org.apache.geronimo.javamail.util.MIMEOutputStream;
-import org.apache.geronimo.javamail.util.TraceInputStream;
-import org.apache.geronimo.javamail.util.TraceOutputStream;
-import org.apache.geronimo.mail.util.Base64;
-import org.apache.geronimo.mail.util.SessionUtil;
-
-/**
- * Simple implementation of NNTP transport. Just does plain RFC977-ish delivery.
- * <p/> There is no way to indicate failure for a given recipient (it's possible
- * to have a recipient address rejected). The sun impl throws exceptions even if
- * others successful), but maybe we do a different way... <p/>
- * 
- * @version $Rev$ $Date$
- */
-public class NNTPConnection {
-
-    /**
-     * constants for EOL termination
-     */
-    protected static final char CR = '\r';
-
-    protected static final char LF = '\n';
-
-    /**
-     * property keys for protocol properties.
-     */
-    protected static final String MAIL_NNTP_AUTH = "auth";
-
-    protected static final String MAIL_NNTP_PORT = "port";
-
-    protected static final String MAIL_NNTP_TIMEOUT = "timeout";
-
-    protected static final String MAIL_NNTP_SASL_REALM = "sasl.realm";
-
-    protected static final String MAIL_NNTP_FACTORY_CLASS = "socketFactory.class";
-
-    protected static final String MAIL_NNTP_FACTORY_FALLBACK = "fallback";
-
-    protected static final String MAIL_NNTP_LOCALADDRESS = "localaddress";
-
-    protected static final String MAIL_NNTP_LOCALPORT = "localport";
-
-    protected static final String MAIL_NNTP_QUITWAIT = "quitwait";
-
-    protected static final String MAIL_NNTP_FACTORY_PORT = "socketFactory.port";
-
-    protected static final String MAIL_NNTP_ENCODE_TRACE = "encodetrace";
-
-    protected static final int MIN_MILLIS = 1000 * 60;
-
-    protected static final int TIMEOUT = MIN_MILLIS * 5;
-
-    protected static final String DEFAULT_MAIL_HOST = "localhost";
-
-    protected static final int DEFAULT_NNTP_PORT = 119;
-
-    protected static final String AUTHENTICATION_PLAIN = "PLAIN";
-
-    protected static final String AUTHENTICATION_LOGIN = "LOGIN";
-
-    protected static final String AUTHENTICATION_CRAMMD5 = "CRAM-MD5";
-
-    protected static final String AUTHENTICATION_DIGESTMD5 = "DIGEST-MD5";
-
-    // the protocol in use (either nntp or nntp-post).
-    String protocol;
-
-    // the target host
-    protected String host;
-
-    // the target server port.
-    protected int port;
-
-    // the connection socket...can be a plain socket or SSLSocket, if TLS is
-    // being used.
-    protected Socket socket;
-
-    // input stream used to read data. If Sasl is in use, this might be other
-    // than the
-    // direct access to the socket input stream.
-    protected InputStream inputStream;
-
-    // the test reader wrapped around the input stream.
-    protected BufferedReader in;
-
-    // the other end of the connection pipeline.
-    protected OutputStream outputStream;
-
-    // does the server support posting?
-    protected boolean postingAllowed = true;
-
-    // the username we connect with
-    protected String username;
-
-    // the authentication password.
-    protected String password;
-
-    // the target SASL realm (normally null unless explicitly set or we have an
-    // authentication mechanism that
-    // requires it.
-    protected String realm;
-
-    // the last response line received from the server.
-    protected NNTPReply lastServerResponse = null;
-
-    // our attached session
-    protected Session session;
-
-    // our session provided debug output stream.
-    protected PrintStream debugStream;
-
-    // our debug flag (passed from the hosting transport)
-    protected boolean debug;
-
-    // list of authentication mechanisms supported by the server
-    protected HashMap serverAuthenticationMechanisms;
-
-    // map of server extension arguments
-    protected HashMap serverExtensionArgs;
-
-    // the welcome string from the server.
-    protected String welcomeString = null;
-
-    /**
-     * Normal constructor for an NNTPConnection() object.
-     * 
-     * @param session
-     *            The attached session.
-     * @param host
-     *            The target host name of the NNTP server.
-     * @param port
-     *            The target listening port of the server. Defaults to 119 if
-     *            the port is specified as -1.
-     * @param username
-     *            The login user name (can be null unless authentication is
-     *            required).
-     * @param password
-     *            Password associated with the userid account. Can be null if
-     *            authentication is not required.
-     * @param debug
-     *            The session debug flag.
-     */
-    public NNTPConnection(String protocol, Session session, String host, int port, String username, String password,
-            boolean debug) {
-        this.protocol = protocol;
-        this.session = session;
-        this.host = host;
-        this.port = port;
-        this.username = username;
-        this.password = password;
-        this.debug = debug;
-
-        // get our debug output.
-        debugStream = session.getDebugOut();
-    }
-
-    /**
-     * Connect to the server and do the initial handshaking.
-     * 
-     * @exception MessagingException
-     */
-    public void connect() throws MessagingException {
-        try {
-
-            // create socket and connect to server.
-            getConnection();
-
-            // receive welcoming message
-            getWelcome();
-
-        } catch (IOException e) {
-            if (debug) {
-                debugOut("I/O exception establishing connection", e);
-            }
-            throw new MessagingException("Connection error", e);
-        }
-    }
-
-    /**
-     * Close the connection. On completion, we'll be disconnected from the
-     * server and unable to send more data.
-     * 
-     * @exception MessagingException
-     */
-    public void close() throws MessagingException {
-        // if we're already closed, get outta here.
-        if (socket == null) {
-            return;
-        }
-        try {
-            // say goodbye
-            sendQuit();
-        } finally {
-            // and close up the connection. We do this in a finally block to
-            // make sure the connection
-            // is shut down even if quit gets an error.
-            closeServerConnection();
-        }
-    }
-
-    /**
-     * Create a transport connection object and connect it to the target server.
-     * 
-     * @exception MessagingException
-     */
-    protected void getConnection() throws IOException {
-        // We might have been passed a socket to connect with...if not, we need
-        // to create one of the correct type.
-        if (socket == null) {
-            getConnectedSocket();
-        }
-        // if we already have a socket, get some information from it and
-        // override what we've been passed.
-        else {
-            port = socket.getPort();
-            host = socket.getInetAddress().getHostName();
-        }
-
-        // now set up the input/output streams.
-        inputStream = new TraceInputStream(socket.getInputStream(), debugStream, debug, getBooleanProperty(
-                MAIL_NNTP_ENCODE_TRACE, false));
-        ;
-        outputStream = new TraceOutputStream(socket.getOutputStream(), debugStream, debug, getBooleanProperty(
-                MAIL_NNTP_ENCODE_TRACE, false));
-
-        // get a reader to read the input as lines
-        in = new BufferedReader(new InputStreamReader(inputStream));
-    }
-
-    /**
-     * Close the server connection at termination.
-     */
-    public void closeServerConnection() {
-        try {
-            socket.close();
-        } catch (IOException ignored) {
-        }
-
-        socket = null;
-        inputStream = null;
-        outputStream = null;
-        in = null;
-    }
-
-    /**
-     * Creates a connected socket
-     * 
-     * @exception MessagingException
-     */
-    public void getConnectedSocket() throws IOException {
-        if (debug) {
-            debugOut("Attempting plain socket connection to server " + host + ":" + port);
-        }
-
-        // the socket factory can be specified via a session property. By
-        // default, we just directly
-        // instantiate a socket without using a factor.
-        String socketFactory = getProperty(MAIL_NNTP_FACTORY_CLASS);
-
-        // there are several protocol properties that can be set to tune the
-        // created socket. We need to
-        // retrieve those bits before creating the socket.
-        int timeout = getIntProperty(MAIL_NNTP_TIMEOUT, -1);
-        InetAddress localAddress = null;
-        // see if we have a local address override.
-        String localAddrProp = getProperty(MAIL_NNTP_LOCALADDRESS);
-        if (localAddrProp != null) {
-            localAddress = InetAddress.getByName(localAddrProp);
-        }
-
-        // check for a local port...default is to allow socket to choose.
-        int localPort = getIntProperty(MAIL_NNTP_LOCALPORT, 0);
-
-        socket = null;
-
-        // if there is no socket factory defined (normal), we just create a
-        // socket directly.
-        if (socketFactory == null) {
-            socket = new Socket(host, port, localAddress, localPort);
-        }
-
-        else {
-            try {
-                int socketFactoryPort = getIntProperty(MAIL_NNTP_FACTORY_PORT, -1);
-
-                // we choose the port used by the socket based on overrides.
-                Integer portArg = new Integer(socketFactoryPort == -1 ? port : socketFactoryPort);
-
-                // use the current context loader to resolve this.
-                ClassLoader loader = Thread.currentThread().getContextClassLoader();
-                Class factoryClass = loader.loadClass(socketFactory);
-
-                // done indirectly, we need to invoke the method using
-                // reflection.
-                // This retrieves a factory instance.
-                Method getDefault = factoryClass.getMethod("getDefault", new Class[0]);
-                Object defFactory = getDefault.invoke(new Object(), new Object[0]);
-
-                // now that we have the factory, there are two different
-                // createSocket() calls we use,
-                // depending on whether we have a localAddress override.
-
-                if (localAddress != null) {
-                    // retrieve the createSocket(String, int, InetAddress, int)
-                    // method.
-                    Class[] createSocketSig = new Class[] { String.class, Integer.TYPE, InetAddress.class, Integer.TYPE };
-                    Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-
-                    Object[] createSocketArgs = new Object[] { host, portArg, localAddress, new Integer(localPort) };
-                    socket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-                } else {
-                    // retrieve the createSocket(String, int) method.
-                    Class[] createSocketSig = new Class[] { String.class, Integer.TYPE };
-                    Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-
-                    Object[] createSocketArgs = new Object[] { host, portArg };
-                    socket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-                }
-            } catch (Throwable e) {
-                // if a socket factor is specified, then we may need to fall
-                // back to a default. This behavior
-                // is controlled by (surprise) more session properties.
-                if (getBooleanProperty(MAIL_NNTP_FACTORY_FALLBACK, false)) {
-                    if (debug) {
-                        debugOut("First plain socket attempt faile, falling back to default factory", e);
-                    }
-                    socket = new Socket(host, port, localAddress, localPort);
-                }
-                // we have an exception. We're going to throw an IOException,
-                // which may require unwrapping
-                // or rewrapping the exception.
-                else {
-                    // we have an exception from the reflection, so unwrap the
-                    // base exception
-                    if (e instanceof InvocationTargetException) {
-                        e = ((InvocationTargetException) e).getTargetException();
-                    }
-
-                    if (debug) {
-                        debugOut("Plain socket creation failure", e);
-                    }
-
-                    // throw this as an IOException, with the original exception
-                    // attached.
-                    IOException ioe = new IOException("Error connecting to " + host + ", " + port);
-                    ioe.initCause(e);
-                    throw ioe;
-                }
-            }
-        }
-
-        if (timeout >= 0) {
-            socket.setSoTimeout(timeout);
-        }
-    }
-
-    /**
-     * Get the servers welcome blob from the wire....
-     */
-    public void getWelcome() throws MessagingException {
-        NNTPReply line = getReply();
-
-        //
-        if (line.isError()) {
-            throw new MessagingException("Error connecting to news server: " + line.getMessage());
-        }
-
-        // remember we can post.
-        if (line.getCode() == NNTPReply.POSTING_ALLOWED) {
-            postingAllowed = true;
-        } else {
-            postingAllowed = false;
-        }
-
-        // the NNTP store will want to use the welcome string, so save it.
-        welcomeString = line.getMessage();
-
-        // find out what extensions this server supports.
-        getExtensions();
-    }
-
-    /**
-     * Sends the QUIT message and receieves the response
-     */
-    public void sendQuit() throws MessagingException {
-        // there's yet another property that controls whether we should wait for
-        // a
-        // reply for a QUIT command. If on, just send the command and get outta
-        // here.
-        if (getBooleanProperty(MAIL_NNTP_QUITWAIT, false)) {
-            sendLine("QUIT");
-        } else {
-            // handle as a real command...we're going to ignore the response.
-            sendCommand("QUIT");
-        }
-    }
-
-    /**
-     * Tell the server to switch to a named group.
-     * 
-     * @param name
-     *            The name of the target group.
-     * 
-     * @return The server response to the GROUP command.
-     */
-    public NNTPReply selectGroup(String name) throws MessagingException {
-        // send the GROUP command
-        return sendCommand("GROUP " + name);
-    }
-
-    /**
-     * Ask the server what extensions it supports.
-     * 
-     * @return True if the command was accepted ok, false for any errors.
-     * @exception MessagingException
-     */
-    protected void getExtensions() throws MessagingException {
-        NNTPReply reply = sendCommand("LIST EXTENSIONS", NNTPReply.EXTENSIONS_SUPPORTED);
-
-        // we get a 202 code back. The first line is just a greeting, and
-        // extensions are deliverd as data
-        // lines terminated with a "." line.
-        if (reply.getCode() != NNTPReply.EXTENSIONS_SUPPORTED) {
-            return;
-        }
-
-        // get a fresh extension mapping table.
-        serverExtensionArgs = new HashMap();
-        serverAuthenticationMechanisms = new HashMap();
-
-        // get the extension data lines.
-        List extensions = reply.getData();
-
-        // process all of the continuation lines
-        for (int i = 0; i < extensions.size(); i++) {
-            // go process the extention
-            processExtension((String) extensions.get(i));
-        }
-    }
-
-    /**
-     * Process an extension string passed back as the EHLP response.
-     * 
-     * @param extension
-     *            The string value of the extension (which will be of the form
-     *            "NAME arguments").
-     */
-    protected void processExtension(String extension) {
-        String extensionName = extension.toUpperCase();
-        String argument = "";
-
-        int delimiter = extension.indexOf(' ');
-        // if we have a keyword with arguments, parse them out and add to the
-        // argument map.
-        if (delimiter != -1) {
-            extensionName = extension.substring(0, delimiter).toUpperCase();
-            argument = extension.substring(delimiter + 1);
-        }
-
-        // add this to the map so it can be tested later.
-        serverExtensionArgs.put(extensionName, argument);
-
-        // process a few special ones that don't require extra parsing.
-        // AUTHINFO is entered in as a auth mechanism.
-        if (extensionName.equals("AUTHINFO")) {
-            serverAuthenticationMechanisms.put("AUTHINFO", "AUTHINFO");
-        }
-        // special case for some older servers.
-        else if (extensionName.equals("SASL")) {
-            // The security mechanisms are blank delimited tokens.
-            StringTokenizer tokenizer = new StringTokenizer(argument);
-
-            while (tokenizer.hasMoreTokens()) {
-                String mechanism = tokenizer.nextToken().toUpperCase();
-                serverAuthenticationMechanisms.put(mechanism, mechanism);
-            }
-        }
-    }
-
-    /**
-     * Retrieve any argument information associated with a extension reported
-     * back by the server on the EHLO command.
-     * 
-     * @param name
-     *            The name of the target server extension.
-     * 
-     * @return Any argument passed on a server extension. Returns null if the
-     *         extension did not include an argument or the extension was not
-     *         supported.
-     */
-    public String extensionParameter(String name) {
-        if (serverExtensionArgs != null) {
-            return (String) serverExtensionArgs.get(name);
-        }
-        return null;
-    }
-
-    /**
-     * Tests whether the target server supports a named extension.
-     * 
-     * @param name
-     *            The target extension name.
-     * 
-     * @return true if the target server reported on the EHLO command that is
-     *         supports the targer server, false if the extension was not
-     *         supported.
-     */
-    public boolean supportsExtension(String name) {
-        // this only returns null if we don't have this extension
-        return extensionParameter(name) != null;
-    }
-
-    /**
-     * Determine if the target server supports a given authentication mechanism.
-     * 
-     * @param mechanism
-     *            The mechanism name.
-     * 
-     * @return true if the server EHLO response indicates it supports the
-     *         mechanism, false otherwise.
-     */
-    protected boolean supportsAuthentication(String mechanism) {
-        return serverAuthenticationMechanisms.get(mechanism) != null;
-    }
-
-    /**
-     * Sends the data in the message down the socket. This presumes the server
-     * is in the right place and ready for getting the DATA message and the data
-     * right place in the sequence
-     */
-    public synchronized void sendPost(Message msg) throws MessagingException {
-
-        // send the POST command
-        NNTPReply line = sendCommand("POST");
-
-        if (line.getCode() != NNTPReply.SEND_ARTICLE) {
-            throw new MessagingException("Server rejected POST command: " + line);
-        }
-
-        // we've received permission to send the data, so ask the message to
-        // write itself out.
-        try {
-            // the data content has two requirements we need to meet by
-            // filtering the
-            // output stream. Requirement 1 is to conicalize any line breaks.
-            // All line
-            // breaks will be transformed into properly formed CRLF sequences.
-            //
-            // Requirement 2 is to perform byte-stuff for any line that begins
-            // with a "."
-            // so that data is not confused with the end-of-data marker (a
-            // "\r\n.\r\n" sequence.
-            //
-            // The MIME output stream performs those two functions on behalf of
-            // the content
-            // writer.
-            OutputStream mimeOut = new MIMEOutputStream(outputStream);
-
-            msg.writeTo(mimeOut);
-            mimeOut.flush();
-        } catch (IOException e) {
-            throw new MessagingException("I/O error posting message", e);
-        } catch (MessagingException e) {
-            throw new MessagingException("Exception posting message", e);
-        }
-
-        // now to finish, we send a CRLF sequence, followed by a ".".
-        sendLine("");
-        sendLine(".");
-
-        // use a longer time out here to give the server time to process the
-        // data.
-        line = new NNTPReply(receiveLine());
-
-        if (line.getCode() != NNTPReply.POSTED_OK) {
-            throw new MessagingException("Server rejected POST command: " + line);
-        }
-    }
-
-    /**
-     * Issue a command and retrieve the response. If the given success indicator
-     * is received, the command is returning a longer response, terminated by a
-     * "crlf.crlf" sequence. These lines are attached to the reply.
-     * 
-     * @param command
-     *            The command to issue.
-     * @param success
-     *            The command reply that indicates additional data should be
-     *            retrieved.
-     * 
-     * @return The command reply.
-     */
-    public synchronized NNTPReply sendCommand(String command, int success) throws MessagingException {
-        NNTPReply reply = sendCommand(command);
-        if (reply.getCode() == success) {
-            reply.retrieveData(in);
-        }
-        return reply;
-    }
-
-    /**
-     * Send a command to the server, returning the first response line back as a
-     * reply.
-     * 
-     * @param data
-     *            The data to send.
-     * 
-     * @return A reply object with the reply line.
-     * @exception MessagingException
-     */
-    public NNTPReply sendCommand(String data) throws MessagingException {
-        sendLine(data);
-        NNTPReply reply = getReply();
-        // did the server just inform us we need to authenticate? The spec
-        // allows this
-        // response to be sent at any time, so we need to try to authenticate
-        // and then retry the command.
-        if (reply.getCode() == NNTPReply.AUTHINFO_REQUIRED || reply.getCode() == NNTPReply.AUTHINFO_SIMPLE_REQUIRED) {
-            if (debug) {
-                debugOut("Authentication required received from server.");
-            }
-            // authenticate with the server, if necessary
-            processAuthentication(reply.getCode());
-            // if we've safely authenticated, we can reissue the command and
-            // process the response.
-            sendLine(data);
-            reply = getReply();
-        }
-        return reply;
-    }
-
-    /**
-     * Send a command to the server, returning the first response line back as a
-     * reply.
-     * 
-     * @param data
-     *            The data to send.
-     * 
-     * @return A reply object with the reply line.
-     * @exception MessagingException
-     */
-    public NNTPReply sendAuthCommand(String data) throws MessagingException {
-        sendLine(data);
-        return getReply();
-    }
-
-    /**
-     * Sends a message down the socket and terminates with the appropriate CRLF
-     */
-    public void sendLine(String data) throws MessagingException {
-        if (socket == null || !socket.isConnected()) {
-            throw new MessagingException("no connection");
-        }
-        try {
-            outputStream.write(data.getBytes());
-            outputStream.write(CR);
-            outputStream.write(LF);
-            outputStream.flush();
-        } catch (IOException e) {
-            throw new MessagingException(e.toString());
-        }
-    }
-
-    /**
-     * Get a reply line for an NNTP command.
-     * 
-     * @return An NNTP reply object from the stream.
-     */
-    public NNTPReply getReply() throws MessagingException {
-        lastServerResponse = new NNTPReply(receiveLine());
-        return lastServerResponse;
-    }
-
-    /**
-     * Retrieve the last response received from the NNTP server.
-     * 
-     * @return The raw response string (including the error code) returned from
-     *         the NNTP server.
-     */
-    public String getLastServerResponse() {
-        if (lastServerResponse == null) {
-            return "";
-        }
-        return lastServerResponse.getReply();
-    }
-
-    /**
-     * Receives one line from the server. A line is a sequence of bytes
-     * terminated by a CRLF
-     * 
-     * @return the line from the server as String
-     */
-    public String receiveLine() throws MessagingException {
-        if (socket == null || !socket.isConnected()) {
-            throw new MessagingException("no connection");
-        }
-
-        try {
-            String line = in.readLine();
-            if (line == null) {
-                throw new MessagingException("Unexpected end of stream");
-            }
-            return line;
-        } catch (IOException e) {
-            throw new MessagingException("Error reading from server", e);
-        }
-    }
-
-    /**
-     * Retrieve the SASL realm used for DIGEST-MD5 authentication. This will
-     * either be explicitly set, or retrieved using the mail.nntp.sasl.realm
-     * session property.
-     * 
-     * @return The current realm information (which can be null).
-     */
-    public String getSASLRealm() {
-        // if the realm is null, retrieve it using the realm session property.
-        if (realm == null) {
-            realm = getProperty(MAIL_NNTP_SASL_REALM);
-        }
-        return realm;
-    }
-
-    /**
-     * Explicitly set the SASL realm used for DIGEST-MD5 authenticaiton.
-     * 
-     * @param name
-     *            The new realm name.
-     */
-    public void setSASLRealm(String name) {
-        realm = name;
-    }
-
-    /**
-     * Authenticate with the server, if necessary (or possible).
-     */
-    protected void processAuthentication(int request) throws MessagingException {
-        // we need to authenticate, but we don't have userid/password
-        // information...fail this
-        // immediately.
-        if (username == null || password == null) {
-            throw new MessagingException("Server requires user authentication");
-        }
-
-        if (request == NNTPReply.AUTHINFO_SIMPLE_REQUIRED) {
-            processAuthinfoSimple();
-        } else {
-            if (!processAuthinfoSasl()) {
-                processAuthinfoUser();
-            }
-        }
-    }
-
-    /**
-     * Process an AUTHINFO SIMPLE command. Not widely used, but if the server
-     * asks for it, we can respond.
-     * 
-     * @exception MessagingException
-     */
-    protected void processAuthinfoSimple() throws MessagingException {
-        NNTPReply reply = sendAuthCommand("AUTHINFO SIMPLE");
-        if (reply.getCode() != NNTPReply.AUTHINFO_CONTINUE) {
-            throw new MessagingException("Error authenticating with server using AUTHINFO SIMPLE");
-        }
-        reply = sendAuthCommand(username + " " + password);
-        if (reply.getCode() != NNTPReply.AUTHINFO_ACCEPTED) {
-            throw new MessagingException("Error authenticating with server using AUTHINFO SIMPLE");
-        }
-    }
-
-    /**
-     * Process AUTHINFO GENERIC. Right now, this appears not to be widely used
-     * and information on how the conversations are handled for different auth
-     * types is lacking, so right now, this just returns false to force the
-     * userid/password form to be used.
-     * 
-     * @return Always returns false.
-     * @exception MessagingException
-     */
-    protected boolean processAuthinfoGeneric() throws MessagingException {
-        return false;
-    }
-
-    /**
-     * Process AUTHINFO SASL.
-     * 
-     * @return Returns true if the server support a SASL authentication
-     *         mechanism and accepted reponse challenges.
-     * @exception MessagingException
-     */
-    protected boolean processAuthinfoSasl() throws MessagingException {
-        ClientAuthenticator authenticator = null;
-
-        // now go through the progression of mechanisms we support, from the
-        // most secure to the
-        // least secure.
-
-        if (supportsAuthentication(AUTHENTICATION_DIGESTMD5)) {
-            authenticator = new DigestMD5Authenticator(host, username, password, getSASLRealm());
-        } else if (supportsAuthentication(AUTHENTICATION_CRAMMD5)) {
-            authenticator = new CramMD5Authenticator(username, password);
-        } else if (supportsAuthentication(AUTHENTICATION_LOGIN)) {
-            authenticator = new LoginAuthenticator(username, password);
-        } else if (supportsAuthentication(AUTHENTICATION_PLAIN)) {
-            authenticator = new PlainAuthenticator(username, password);
-        } else {
-            // can't find a mechanism we support in common
-            return false;
-        }
-
-        if (debug) {
-            debugOut("Authenticating for user: " + username + " using " + authenticator.getMechanismName());
-        }
-
-        // if the authenticator has some initial data, we compose a command
-        // containing the initial data.
-        if (authenticator.hasInitialResponse()) {
-            StringBuffer command = new StringBuffer();
-            // the auth command initiates the handshaking.
-            command.append("AUTHINFO SASL ");
-            // and tell the server which mechanism we're using.
-            command.append(authenticator.getMechanismName());
-            command.append(" ");
-            // and append the response data
-            command.append(new String(Base64.encode(authenticator.evaluateChallenge(null))));
-            // send the command now
-            sendLine(command.toString());
-        }
-        // we just send an auth command with the command type.
-        else {
-            StringBuffer command = new StringBuffer();
-            // the auth command initiates the handshaking.
-            command.append("AUTHINFO SASL");
-            // and tell the server which mechanism we're using.
-            command.append(authenticator.getMechanismName());
-            // send the command now
-            sendLine(command.toString());
-        }
-
-        // now process the challenge sequence. We get a 235 response back when
-        // the server accepts the
-        // authentication, and a 334 indicates we have an additional challenge.
-        while (true) {
-            // get the next line, and if it is an error response, return now.
-            NNTPReply line = getReply();
-
-            // if we get a completion return, we've passed muster, so give an
-            // authentication response.
-            if (line.getCode() == NNTPReply.AUTHINFO_ACCEPTED || line.getCode() == NNTPReply.AUTHINFO_ACCEPTED_FINAL) {
-                if (debug) {
-                    debugOut("Successful SMTP authentication");
-                }
-                return true;
-            }
-            // we have an additional challenge to process.
-            else if (line.getCode() == NNTPReply.AUTHINFO_CHALLENGE) {
-                // Does the authenticator think it is finished? We can't answer
-                // an additional challenge,
-                // so fail this.
-                if (authenticator.isComplete()) {
-                    if (debug) {
-                        debugOut("Extra authentication challenge " + line);
-                    }
-                    return false;
-                }
-
-                // we're passed back a challenge value, Base64 encoded.
-                byte[] challenge = Base64.decode(line.getMessage().getBytes());
-
-                // have the authenticator evaluate and send back the encoded
-                // response.
-                sendLine(new String(Base64.encode(authenticator.evaluateChallenge(challenge))));
-            }
-            // completion or challenge are the only responses we know how to
-            // handle. Anything else must
-            // be a failure.
-            else {
-                if (debug) {
-                    debugOut("Authentication failure " + line);
-                }
-                return false;
-            }
-        }
-    }
-
-    /**
-     * Process an AUTHINFO USER command. Most common form of NNTP
-     * authentication.
-     * 
-     * @exception MessagingException
-     */
-    protected void processAuthinfoUser() throws MessagingException {
-        NNTPReply reply = sendAuthCommand("AUTHINFO USER " + username);
-        // accepted without a password (uncommon, but allowed), we're done
-        if (reply.getCode() == NNTPReply.AUTHINFO_ACCEPTED) {
-            return;
-        }
-        // the only other non-error response is continue.
-        if (reply.getCode() != NNTPReply.AUTHINFO_CONTINUE) {
-            throw new MessagingException("Error authenticating with server using AUTHINFO USER: " + reply);
-        }
-        // now send the password. We expect an accepted response.
-        reply = sendAuthCommand("AUTHINFO PASS " + password);
-        if (reply.getCode() != NNTPReply.AUTHINFO_ACCEPTED) {
-            throw new MessagingException("Error authenticating with server using AUTHINFO SIMPLE");
-        }
-    }
-
-    /**
-     * Internal debug output routine.
-     * 
-     * @param value
-     *            The string value to output.
-     */
-    protected void debugOut(String message) {
-        debugStream.println("NNTPTransport DEBUG: " + message);
-    }
-
-    /**
-     * Internal debugging routine for reporting exceptions.
-     * 
-     * @param message
-     *            A message associated with the exception context.
-     * @param e
-     *            The received exception.
-     */
-    protected void debugOut(String message, Throwable e) {
-        debugOut("Received exception -> " + message);
-        debugOut("Exception message -> " + e.getMessage());
-        e.printStackTrace(debugStream);
-    }
-
-    /**
-     * Indicate whether posting is allowed for a given server.
-     * 
-     * @return True if the server allows posting, false if the server is
-     *         read-only.
-     */
-    public boolean isPostingAllowed() {
-        return postingAllowed;
-    }
-
-    /**
-     * Retrieve the welcome string sent back from the server.
-     * 
-     * @return The server provided welcome string.
-     */
-    public String getWelcomeString() {
-        return welcomeString;
-    }
-
-    /**
-     * Return the server host for this connection.
-     * 
-     * @return The String name of the server host.
-     */
-    public String getHost() {
-        return host;
-    }
-
-    /**
-     * Get a property associated with this mail protocol.
-     * 
-     * @param name
-     *            The name of the property.
-     * 
-     * @return The property value (returns null if the property has not been
-     *         set).
-     */
-    String getProperty(String name) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return session.getProperty(fullName);
-    }
-
-    /**
-     * Get a property associated with this mail session. Returns the provided
-     * default if it doesn't exist.
-     * 
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     * 
-     * @return The property value (returns defaultValue if the property has not
-     *         been set).
-     */
-    String getProperty(String name, String defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return SessionUtil.getProperty(session, fullName, defaultValue);
-    }
-
-    /**
-     * Get a property associated with this mail session as an integer value.
-     * Returns the default value if the property doesn't exist or it doesn't
-     * have a valid int value.
-     * 
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     * 
-     * @return The property value converted to an int.
-     */
-    int getIntProperty(String name, int defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return SessionUtil.getIntProperty(session, fullName, defaultValue);
-    }
-
-    /**
-     * Get a property associated with this mail session as an boolean value.
-     * Returns the default value if the property doesn't exist or it doesn't
-     * have a valid int value.
-     * 
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     * 
-     * @return The property value converted to a boolean
-     */
-    boolean getBooleanProperty(String name, boolean defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return SessionUtil.getBooleanProperty(session, fullName, defaultValue);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/NNTPReply.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/NNTPReply.java
deleted file mode 100644
index 6328b92..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/NNTPReply.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.nntp;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.mail.MessagingException;
-
-/**
- * Util class to represent a reply from a NNTP server
- * 
- * @version $Rev$ $Date$
- */
-public class NNTPReply {
-    // general server responses
-    public static final int POSTING_ALLOWED = 200;
-
-    public static final int NO_POSTING_ALLOWED = 201;
-
-    public static final int EXTENSIONS_SUPPORTED = 202;
-
-    public static final int SERVICE_DISCONTINUED = 400;
-
-    public static final int COMMAND_NOT_RECOGNIZED = 500;
-
-    public static final int COMMAND_SYNTAX_ERROR = 501;
-
-    public static final int PERMISSION_DENIED = 502;
-
-    public static final int PROGRAM_FAULT = 503;
-
-    // article responses
-    public static final int ARTICLE_FOLLOWS = 220;
-
-    public static final int HEAD_FOLLOWS = 221;
-
-    public static final int BODY_FOLLOWS = 222;
-
-    public static final int REQUEST_TEXT_SEPARATELY = 223;
-
-    public static final int OVERVIEW_FOLLOWS = 224;
-
-    public static final int NEW_ARTICLES_FOLLOWS = 230;
-
-    public static final int NEW_GROUPS_FOLLOWS = 231;
-
-    public static final int ARTICLE_TRANSFERRED = 235;
-
-    public static final int NO_NEWSGROUP_SELECTED = 412;
-
-    public static final int NO_ARTICLE_SELECTED = 420;
-
-    public static final int NO_ARTICLE_NUMBER = 423;
-
-    public static final int NO_ARTICLE_FOUND = 430;
-
-    // group responses
-    public static final int GROUP_SELECTED = 211;
-
-    public static final int NO_SUCH_NEWSGROUP = 411;
-
-    // post responses
-    public static final int POSTED_OK = 240;
-
-    public static final int SEND_ARTICLE = 340;
-
-    public static final int POSTING_NOT_ALLOWED = 440;
-
-    public static final int POSTING_FAILED = 441;
-
-    // quit responses
-    public static final int CLOSING_CONNECTION = 205;
-
-    // authentication responses
-    public static final int AUTHINFO_ACCEPTED = 250;
-
-    public static final int AUTHINFO_ACCEPTED_FINAL = 251;
-
-    public static final int AUTHINFO_CONTINUE = 350;
-
-    public static final int AUTHINFO_CHALLENGE = 350;
-
-    public static final int AUTHINFO_SIMPLE_REJECTED = 402;
-
-    public static final int AUTHENTICATION_ACCEPTED = 281;
-
-    public static final int MORE_AUTHENTICATION_REQUIRED = 381;
-
-    public static final int AUTHINFO_REQUIRED = 480;
-
-    public static final int AUTHINFO_SIMPLE_REQUIRED = 450;
-
-    public static final int AUTHENTICATION_REJECTED = 482;
-
-    // list active reponses
-    public static final int LIST_FOLLOWS = 215;
-
-    // The original reply string
-    private final String reply;
-
-    // returned message code
-    private final int code;
-
-    // the returned message text
-    private final String message;
-
-    // data associated with a long response command.
-    private ArrayList data;
-
-    NNTPReply(String s) throws MessagingException {
-        // save the reply
-        reply = s;
-
-        // In a normal response, the first 3 must be the return code. However,
-        // the response back from a QUIT command is frequently a null string.
-        // Therefore, if the result is
-        // too short, just default the code to -1 and use the entire text for
-        // the message.
-        if (s == null || s.length() < 3) {
-            code = -1;
-            message = s;
-            return;
-        }
-
-        try {
-            code = Integer.parseInt(s.substring(0, 3));
-
-            // message should be separated by a space OR a continuation
-            // character if this is a
-            // multi-line response.
-            if (s.length() > 4) {
-                message = s.substring(4);
-            } else {
-                message = "";
-            }
-        } catch (NumberFormatException e) {
-            throw new MessagingException("error in parsing reply code", e);
-        }
-    }
-
-    /**
-     * Retrieve data associated with a multi-line reponse from a server stream.
-     * 
-     * @param in
-     *            The reader that's the source of the additional lines.
-     * 
-     * @exception IOException
-     */
-    public void retrieveData(BufferedReader in) throws MessagingException {
-        try {
-            data = new ArrayList();
-
-            String line = in.readLine();
-            // read until the end of file or until we see the end of data
-            // marker.
-            while (line != null && !line.equals(".")) {
-                // this line is not the terminator, but it may have been byte
-                // stuffed. If it starts with
-                // '.', throw away the leading one.
-                if (line.startsWith(".")) {
-                    line = line.substring(1);
-                }
-
-                // just add the line to the list
-                data.add(line);
-                line = in.readLine();
-            }
-        } catch (IOException e) {
-            throw new MessagingException("Error reading message reply", e);
-        }
-    }
-
-    /**
-     * Retrieve the long-command data from this response.
-     * 
-     * @return The data list. Returns null if there is no associated data.
-     */
-    public List getData() {
-        return data;
-    }
-
-    /**
-     * Return the code value associated with the reply.
-     * 
-     * @return The integer code associated with the reply.
-     */
-    public int getCode() {
-        return this.code;
-    }
-
-    /**
-     * Get the message text associated with the reply.
-     * 
-     * @return The string value of the message from the reply.
-     */
-    public String getMessage() {
-        return this.message;
-    }
-
-    /**
-     * Retrieve the raw reply string for the reponse.
-     * 
-     * @return The original reply string from the server.
-     */
-    public String getReply() {
-        return reply;
-    }
-
-    /**
-     * Indicates if reply is an error condition
-     */
-    boolean isError() {
-        // error codes are all above 400
-        return code >= 400;
-    }
-
-    public String toString() {
-        return "CODE = " + getCode() + " : MSG = " + getMessage();
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/NNTPTransport.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/NNTPTransport.java
deleted file mode 100644
index 9e953eb..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/NNTPTransport.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.nntp;
-
-import java.io.PrintStream;
-import java.util.ArrayList;
-
-import javax.mail.Address;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.URLName;
-import javax.mail.event.TransportEvent;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
-import javax.mail.internet.NewsAddress;
-
-import org.apache.geronimo.mail.util.SessionUtil;
-
-/**
- * Simple implementation of NNTP transport. Just does plain RFC977-ish delivery.
- * <p/> There is no way to indicate failure for a given recipient (it's possible
- * to have a recipient address rejected). The sun impl throws exceptions even if
- * others successful), but maybe we do a different way... <p/>
- * 
- * @version $Rev$ $Date$
- */
-public class NNTPTransport extends Transport {
-
-    /**
-     * property keys for protocol properties.
-     */
-    protected static final String NNTP_AUTH = "auth";
-
-    protected static final String NNTP_PORT = "port";
-
-    protected static final String NNTP_FROM = "from";
-
-    protected static final String protocol = "nntp-post";
-
-    protected static final int DEFAULT_NNTP_PORT = 119;
-
-    // our active connection object (shared code with the NNTPStore).
-    protected NNTPConnection connection;
-
-    // our session provided debug output stream.
-    protected PrintStream debugStream;
-
-    /**
-     * Normal constructor for an NNTPTransport() object. This constructor is
-     * used to build a transport instance for the "smtp" protocol.
-     * 
-     * @param session
-     *            The attached session.
-     * @param name
-     *            An optional URLName object containing target information.
-     */
-    public NNTPTransport(Session session, URLName name) {
-        super(session, name);
-
-        // get our debug output.
-        debugStream = session.getDebugOut();
-    }
-
-    /**
-     * Do the protocol connection for an NNTP transport. This handles server
-     * authentication, if possible. Returns false if unable to connect to the
-     * server.
-     * 
-     * @param host
-     *            The target host name.
-     * @param port
-     *            The server port number.
-     * @param user
-     *            The authentication user (if any).
-     * @param password
-     *            The server password. Might not be sent directly if more
-     *            sophisticated authentication is used.
-     * 
-     * @return true if we were able to connect to the server properly, false for
-     *         any failures.
-     * @exception MessagingException
-     */
-    protected boolean protocolConnect(String host, int port, String username, String password)
-            throws MessagingException {
-        if (debug) {
-            debugOut("Connecting to server " + host + ":" + port + " for user " + username);
-        }
-
-        // first check to see if we need to authenticate. If we need this, then
-        // we must have a username and
-        // password specified. Failing this may result in a user prompt to
-        // collect the information.
-        boolean mustAuthenticate = SessionUtil.getBooleanProperty(session, NNTP_AUTH, false);
-
-        // if we need to authenticate, and we don't have both a userid and
-        // password, then we fail this
-        // immediately. The Service.connect() method will try to obtain the user
-        // information and retry the
-        // connection one time.
-        if (mustAuthenticate && (username == null || password == null)) {
-            return false;
-        }
-
-        // if the port is defaulted, then see if we have something configured in
-        // the session.
-        // if not configured, we just use the default default.
-        if (port == -1) {
-            // check for a property and fall back on the default if it's not
-            // set.
-            port = SessionUtil.getIntProperty(session, NNTP_PORT, DEFAULT_NNTP_PORT);
-        }
-
-        // create socket and connect to server.
-        connection = new NNTPConnection(protocol, session, host, port, username, password, debug);
-        connection.connect();
-
-        // we're going to return success here, but in truth, the server may end
-        // up asking for our
-        // bonafides at any time, and we'll be expected to authenticate then.
-        return true;
-    }
-
-    /**
-     * Send a message to multiple addressees.
-     * 
-     * @param message
-     *            The message we're sending.
-     * @param addresses
-     *            An array of addresses to send to.
-     * 
-     * @exception MessagingException
-     */
-    public void sendMessage(Message message, Address[] addresses) throws MessagingException {
-        if (!isConnected()) {
-            throw new IllegalStateException("Not connected");
-        }
-
-        if (!connection.isPostingAllowed()) {
-            throw new MessagingException("Posting disabled for host server");
-        }
-        // don't bother me w/ null messages or no addreses
-        if (message == null) {
-            throw new MessagingException("Null message");
-        }
-
-        // NNTP only handles instances of MimeMessage, not the more general
-        // message case.
-        if (!(message instanceof MimeMessage)) {
-            throw new MessagingException("NNTP can only send MimeMessages");
-        }
-
-        // need to sort the from value out from a variety of sources.
-        InternetAddress from = null;
-
-        Address[] fromAddresses = message.getFrom();
-
-        // If the message has a From address set, we just use that. Otherwise,
-        // we set a From using
-        // the property version, if available.
-        if (fromAddresses == null || fromAddresses.length == 0) {
-            // the from value can be set explicitly as a property
-            String defaultFrom = session.getProperty(NNTP_FROM);
-            if (defaultFrom == null) {
-                message.setFrom(new InternetAddress(defaultFrom));
-            }
-        }
-
-        // we must have a message list.
-        if (addresses == null || addresses.length == 0) {
-            throw new MessagingException("Null or empty address array");
-        }
-
-        boolean haveGroup = false;
-
-        // enforce the requirement that all of the targets are NewsAddress
-        // instances.
-        for (int i = 0; i < addresses.length; i++) {
-            if (!(addresses[i] instanceof NewsAddress)) {
-                System.out.println("Illegal address is of class " + addresses[i].getClass());
-                throw new MessagingException("Illegal NewsAddress " + addresses[i]);
-            }
-        }
-
-        // event notifcation requires we send lists of successes and failures
-        // broken down by category.
-        // The categories are:
-        //
-        // 1) addresses successfully processed.
-        // 2) addresses deemed valid, but had a processing failure that
-        // prevented sending.
-        // 3) addressed deemed invalid (basically all other processing
-        // failures).
-        ArrayList sentAddresses = new ArrayList();
-        ArrayList unsentAddresses = new ArrayList();
-        ArrayList invalidAddresses = new ArrayList();
-
-        boolean sendFailure = false;
-
-        // now try to post this message to the different news groups.
-        for (int i = 0; i < addresses.length; i++) {
-            try {
-                // select the target news group
-                NNTPReply reply = connection.selectGroup(((NewsAddress) addresses[i]).getNewsgroup());
-
-                if (reply.getCode() != NNTPReply.GROUP_SELECTED) {
-                    invalidAddresses.add(addresses[i]);
-                    sendFailure = true;
-                } else {
-                    // send data
-                    connection.sendPost(message);
-                    sentAddresses.add(addresses[i]);
-                }
-            } catch (MessagingException e) {
-                unsentAddresses.add(addresses[i]);
-                sendFailure = true;
-            }
-        }
-
-        // create our lists for notification and exception reporting from this
-        // point on.
-        Address[] sent = (Address[]) sentAddresses.toArray(new Address[0]);
-        Address[] unsent = (Address[]) unsentAddresses.toArray(new Address[0]);
-        Address[] invalid = (Address[]) invalidAddresses.toArray(new Address[0]);
-
-        if (sendFailure) {
-            // did we deliver anything at all?
-            if (sent.length == 0) {
-                // notify of the error.
-                notifyTransportListeners(TransportEvent.MESSAGE_NOT_DELIVERED, sent, unsent, invalid, message);
-            } else {
-                // notify that we delivered at least part of this
-                notifyTransportListeners(TransportEvent.MESSAGE_PARTIALLY_DELIVERED, sent, unsent, invalid, message);
-            }
-
-            throw new MessagingException("Error posting NNTP message");
-        }
-
-        // notify our listeners of successful delivery.
-        notifyTransportListeners(TransportEvent.MESSAGE_DELIVERED, sent, unsent, invalid, message);
-    }
-
-    /**
-     * Close the connection. On completion, we'll be disconnected from the
-     * server and unable to send more data.
-     * 
-     * @exception MessagingException
-     */
-    public void close() throws MessagingException {
-        // This is done to ensure proper event notification.
-        super.close();
-        connection.close();
-        connection = null;
-    }
-
-    /**
-     * Internal debug output routine.
-     * 
-     * @param value
-     *            The string value to output.
-     */
-    protected void debugOut(String message) {
-        debugStream.println("NNTPTransport DEBUG: " + message);
-    }
-
-    /**
-     * Internal debugging routine for reporting exceptions.
-     * 
-     * @param message
-     *            A message associated with the exception context.
-     * @param e
-     *            The received exception.
-     */
-    protected void debugOut(String message, Throwable e) {
-        debugOut("Received exception -> " + message);
-        debugOut("Exception message -> " + e.getMessage());
-        e.printStackTrace(debugStream);
-    }
-
-    /**
-     * Get a property associated with this mail protocol.
-     * 
-     * @param name
-     *            The name of the property.
-     * 
-     * @return The property value (returns null if the property has not been
-     *         set).
-     */
-    String getProperty(String name) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return session.getProperty(fullName);
-    }
-
-    /**
-     * Get a property associated with this mail session. Returns the provided
-     * default if it doesn't exist.
-     * 
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     * 
-     * @return The property value (returns defaultValue if the property has not
-     *         been set).
-     */
-    String getProperty(String name, String defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return SessionUtil.getProperty(session, fullName, defaultValue);
-    }
-
-    /**
-     * Get a property associated with this mail session as an integer value.
-     * Returns the default value if the property doesn't exist or it doesn't
-     * have a valid int value.
-     * 
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     * 
-     * @return The property value converted to an int.
-     */
-    int getIntProperty(String name, int defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return SessionUtil.getIntProperty(session, fullName, defaultValue);
-    }
-
-    /**
-     * Get a property associated with this mail session as an boolean value.
-     * Returns the default value if the property doesn't exist or it doesn't
-     * have a valid int value.
-     * 
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     * 
-     * @return The property value converted to a boolean
-     */
-    boolean getBooleanProperty(String name, boolean defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "nntp" or "nntp-post").
-        String fullName = "mail." + protocol + "." + name;
-        return SessionUtil.getBooleanProperty(session, fullName, defaultValue);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/StringListInputStream.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/StringListInputStream.java
deleted file mode 100644
index 62dab16..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/nntp/StringListInputStream.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.nntp;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.List;
-
-/**
- * @version $Rev$ $Date$
- */
-public class StringListInputStream extends InputStream {
-    // the list of lines we're reading from
-    protected List lines;
-
-    // the next line to process.
-    protected int nextLine = 0;
-
-    // current buffer of bytes to read from
-    byte[] buffer;
-
-    // current offset within the buffer;
-    int offset;
-
-    // indicator that we've left off at a split between the CR and LF of a line
-    // break.
-    boolean atLineBreak = false;
-
-    public StringListInputStream(List lines) throws IOException {
-        this.lines = lines;
-        nextLine = 0;
-        buffer = null;
-        offset = 0;
-        atLineBreak = false;
-
-        // if we have at least one line in the list, get the bytes now.
-        if (lines.size() > 0) {
-            nextBuffer();
-        }
-    }
-
-    /**
-     * Just override the single byte read version, which handles all of the
-     * lineend markers correctly.
-     * 
-     * @return The next byte from the stream or -1 if we've hit the EOF.
-     */
-    public int read() throws IOException {
-        // leave off at the split between a line?
-        if (atLineBreak) {
-            // flip this off and return the second line end character. Also step
-            // to the next line.
-            atLineBreak = false;
-            nextBuffer();
-            return '\n';
-        }
-        // gone past the end? Got an EOF
-        if (buffer == null) {
-            return -1;
-        }
-
-        // reach the end of the line?
-        if (offset >= buffer.length) {
-            // we're now working on a virtual linebreak
-            atLineBreak = true;
-            return '\r';
-        }
-        // just return the next byte
-        return buffer[offset++];
-
-    }
-
-    /**
-     * Step to the next buffer of string data.
-     * 
-     * @exception IOException
-     */
-    protected void nextBuffer() throws IOException {
-        // give an eof check.
-        if (nextLine >= lines.size()) {
-            buffer = null;
-        } else {
-            try {
-                String next = (String) lines.get(nextLine++);
-                buffer = next.getBytes("US-ASCII");
-
-            } catch (UnsupportedEncodingException e) {
-                throw new IOException("Invalid string encoding");
-            }
-        }
-
-        offset = 0;
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/MalformedSMTPReplyException.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/MalformedSMTPReplyException.java
deleted file mode 100644
index ad1b7fa..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/MalformedSMTPReplyException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.smtp;
-
-/**
- * Exception for when a SMTP reply string has a problem
- * 
- * @version $Rev$ $Date$
- */
-class MalformedSMTPReplyException extends Exception {
-    MalformedSMTPReplyException() {
-        super();
-    }
-
-    MalformedSMTPReplyException(String msg) {
-        super(msg);
-    }
-
-    MalformedSMTPReplyException(String msg, Exception t) {
-        super(msg, t);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPAddressFailedException.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPAddressFailedException.java
deleted file mode 100644
index bfd2699..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPAddressFailedException.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.smtp;
-
-import javax.mail.MessagingException;
-import javax.mail.internet.InternetAddress;
-
-public class SMTPAddressFailedException extends MessagingException {
-    // the failing address
-    InternetAddress addr;
-
-    // the failing command
-    protected String cmd;
-
-    // the error code for the failure
-    protected int rc;
-
-    /**
-     * Constructor for an SMTPAddressFailingException.
-     * 
-     * @param addr
-     *            The failing address.
-     * @param cmd
-     *            The failing command string.
-     * @param rc
-     *            The error code for the command.
-     * @param err
-     *            An error message for the exception.
-     */
-    SMTPAddressFailedException(InternetAddress addr, java.lang.String cmd, int rc, java.lang.String err) {
-        super(err);
-        this.cmd = cmd;
-        this.rc = rc;
-        this.addr = addr;
-    }
-
-    /**
-     * Get the failing command string for the exception.
-     * 
-     * @return The string value of the failing command.
-     */
-    public String getCommand() {
-        return cmd;
-    }
-
-    /**
-     * The failing command return code.
-     * 
-     * @return The failure return code.
-     */
-    public int getReturnCode() {
-        return rc;
-    }
-
-    /**
-     * Retrieve the internet address associated with this exception.
-     * 
-     * @return The provided InternetAddress object.
-     */
-    public InternetAddress getAddress() {
-        return addr;
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPAddressSucceededException.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPAddressSucceededException.java
deleted file mode 100644
index 990d656..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPAddressSucceededException.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.smtp;
-
-import javax.mail.MessagingException;
-import javax.mail.internet.InternetAddress;
-
-public class SMTPAddressSucceededException extends MessagingException {
-    // the succeeding address
-    InternetAddress addr;
-
-    // the failing command
-    protected String cmd;
-
-    // the error code for the failure
-    protected int rc;
-
-    /**
-     * Constructor for an SMTPAddressSucceededException.
-     * 
-     * @param addr
-     *            The succeeding address.
-     * @param cmd
-     *            The succeeding command string.
-     * @param rc
-     *            The error code for the command.
-     * @param err
-     *            An error message for the exception.
-     */
-    SMTPAddressSucceededException(InternetAddress addr, java.lang.String cmd, int rc, java.lang.String err) {
-        super(err);
-        this.cmd = cmd;
-        this.rc = rc;
-        this.addr = addr;
-    }
-
-    /**
-     * Get the failing command string for the exception.
-     * 
-     * @return The string value of the failing command.
-     */
-    public String getCommand() {
-        return cmd;
-    }
-
-    /**
-     * The failing command return code.
-     * 
-     * @return The failure return code.
-     */
-    public int getReturnCode() {
-        return rc;
-    }
-
-    /**
-     * Retrieve the internet address associated with this exception.
-     * 
-     * @return The provided InternetAddress object.
-     */
-    public InternetAddress getAddress() {
-        return addr;
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPMessage.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPMessage.java
deleted file mode 100644
index 91d8c95..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPMessage.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.smtp;
-
-import java.io.InputStream;
-
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.internet.MimeMessage;
-
-public class SMTPMessage extends MimeMessage {
-
-    // never notify
-    public static final int NOTIFY_NEVER = -1;
-
-    // notify of successful deliveries.
-    public static final int NOTIFY_SUCCESS = 1;
-
-    // notify of delivery failures.
-    public static final int NOTIFY_FAILURE = 2;
-
-    // notify of delivery delays
-    public static final int NOTIFY_DELAY = 4;
-
-    // return full message with status notifications
-    public static final int RETURN_FULL = 1;
-
-    // return only message headers with status notifications
-    public static final int RETURN_HDRS = 2;
-
-    // support 8BitMime encodings
-    protected boolean allow8bitMIME = false;
-
-    // a from address specified in the message envelope. Overrides other from
-    // sources.
-    protected String envelopeFrom = null;
-
-    // an option string to append to the MAIL command on sending.
-    protected String mailExtension = null;
-
-    // SMTP mail notification options if DSN is supported.
-    protected int notifyOptions = 0;
-
-    // DSN return option notification values.
-    protected int returnOption = 0;
-
-    // allow sending if some addresses give errors.
-    protected boolean sendPartial = false;
-
-    // an RFC 2554 AUTH= value.
-    protected String submitter = null;
-
-    /**
-     * Default (and normal) constructor for an SMTPMessage.
-     * 
-     * @param session
-     *            The hosting Javamail Session.
-     */
-    public SMTPMessage(Session session) {
-        // this is a simple one.
-        super(session);
-    }
-
-    /**
-     * Construct an SMTPMessage instance by reading and parsing the data from
-     * the provided InputStream. The InputStream will be left positioned at the
-     * end of the message data on constructor completion.
-     * 
-     * @param session
-     *            The hosting Javamail Session.
-     */
-    public SMTPMessage(Session session, InputStream source) throws MessagingException {
-        // this is a simple one.
-        super(session, source);
-    }
-
-    /**
-     * Construct an SMTPMimeMessage from another source MimeMessage object. The
-     * new object and the old object are independent of each other.
-     * 
-     * @param source
-     *            The source MimeMessage object.
-     */
-    public SMTPMessage(MimeMessage source) throws MessagingException {
-        super(source);
-    }
-
-    /**
-     * Change the allow8BitMime attribute for the message.
-     * 
-     * @param a
-     *            The new setting.
-     */
-    public void setAllow8bitMIME(boolean a) {
-        allow8bitMIME = a;
-    }
-
-    /**
-     * Retrieve the current 8bitMIME attribute.
-     * 
-     * @return The current attribute value.
-     */
-    public boolean getAllow8bitMIME() {
-        return allow8bitMIME;
-    }
-
-    /**
-     * Change the envelopeFrom attribute for the message.
-     * 
-     * @param from
-     *            The new setting.
-     */
-    public void setEnvelopeFrom(String from) {
-        envelopeFrom = from;
-    }
-
-    /**
-     * Retrieve the current evelopeFrom attribute.
-     * 
-     * @return The current attribute value.
-     */
-    public String getEnvelopeFrom() {
-        return envelopeFrom;
-    }
-
-    /**
-     * Change the mailExtension attribute for the message.
-     * 
-     * @param e
-     *            The new setting.
-     */
-    public void setMailExtension(String e) {
-        mailExtension = e;
-    }
-
-    /**
-     * Retrieve the current mailExtension attribute.
-     * 
-     * @return The current attribute value.
-     */
-    public String getMailExtension() {
-        return mailExtension;
-    }
-
-    /**
-     * Change the notifyOptions attribute for the message.
-     * 
-     * @param options
-     *            The new setting.
-     */
-    public void setNotifyOptions(int options) {
-        notifyOptions = options;
-    }
-
-    /**
-     * Retrieve the current notifyOptions attribute.
-     * 
-     * @return The current attribute value.
-     */
-    public int getNotifyOptions() {
-        return notifyOptions;
-    }
-
-    /**
-     * Change the returnOptions attribute for the message.
-     * 
-     * @param option
-     *            The new setting.
-     */
-    public void setReturnOption(int option) {
-        returnOption = option;
-    }
-
-    /**
-     * Retrieve the current returnOption attribute.
-     * 
-     * @return The current attribute value.
-     */
-    public int getReturnOption() {
-        return returnOption;
-    }
-
-    /**
-     * Change the sendPartial attribute for the message.
-     * 
-     * @param a
-     *            The new setting.
-     */
-    public void setSendPartial(boolean a) {
-        sendPartial = a;
-    }
-
-    /**
-     * Retrieve the current sendPartial attribute.
-     * 
-     * @return The current attribute value.
-     */
-    public boolean getSendPartial() {
-        return sendPartial;
-    }
-
-    /**
-     * Change the submitter attribute for the message.
-     * 
-     * @param s
-     *            The new setting.
-     */
-    public void setSubmitter(String s) {
-        submitter = s;
-    }
-
-    /**
-     * Retrieve the current submitter attribute.
-     * 
-     * @return The current attribute value.
-     */
-    public String getSubmitter() {
-        return submitter;
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPReply.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPReply.java
deleted file mode 100644
index dbee40e..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPReply.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.smtp;
-
-/**
- * Util class to represent a reply from a SMTP server
- * 
- * @version $Rev$ $Date$
- */
-class SMTPReply {
-    // The original reply string
-    private final String reply;
-
-    // returned message code
-    private final int code;
-
-    // the returned message text
-    private final String message;
-
-    // indicates that this is a continuation response
-    private boolean continued;
-
-    SMTPReply(String s) throws MalformedSMTPReplyException {
-        // save the reply
-        reply = s;
-
-        // In a normal response, the first 3 must be the return code. However,
-        // the response back from a QUIT command is frequently a null string.
-        // Therefore, if the result is
-        // too short, just default the code to -1 and use the entire text for
-        // the message.
-        if (s == null || s.length() < 3) {
-            code = -1;
-            message = s;
-            return;
-        }
-
-        try {
-            continued = false;
-            code = Integer.parseInt(s.substring(0, 3));
-
-            // message should be separated by a space OR a continuation
-            // character if this is a
-            // multi-line response.
-            if (s.length() > 4) {
-                //
-                if (s.charAt(3) == '-') {
-                    continued = true;
-                }
-                message = s.substring(4);
-            } else {
-                message = "";
-            }
-        } catch (NumberFormatException e) {
-            throw new MalformedSMTPReplyException("error in parsing code", e);
-        }
-    }
-
-    /**
-     * Return the code value associated with the reply.
-     * 
-     * @return The integer code associated with the reply.
-     */
-    public int getCode() {
-        return this.code;
-    }
-
-    /**
-     * Get the message text associated with the reply.
-     * 
-     * @return The string value of the message from the reply.
-     */
-    public String getMessage() {
-        return this.message;
-    }
-
-    /**
-     * Retrieve the raw reply string for the reponse.
-     * 
-     * @return The original reply string from the server.
-     */
-    public String getReply() {
-        return reply;
-    }
-
-    /**
-     * Indicates if reply is an error condition
-     */
-    boolean isError() {
-        // error codes are all above 400
-        return code >= 400;
-    }
-
-    /**
-     * Indicates whether this response is flagged as part of a multiple line
-     * response.
-     * 
-     * @return true if the response has multiple lines, false if this is the
-     *         last line of the response.
-     */
-    public boolean isContinued() {
-        return continued;
-    }
-
-    public String toString() {
-        return "CODE = " + getCode() + " : MSG = " + getMessage();
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPSTransport.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPSTransport.java
deleted file mode 100644
index 0794065..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPSTransport.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.smtp;
-
-import javax.mail.Session;
-import javax.mail.URLName;
-
-public class SMTPSTransport extends SMTPTransport {
-    /**
-     * @param session
-     * @param name
-     */
-    public SMTPSTransport(Session session, URLName name) {
-        super(session, name, "smtps", 465, true);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPSendFailedException.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPSendFailedException.java
deleted file mode 100644
index 20ff08a..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPSendFailedException.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.smtp;
-
-import javax.mail.Address;
-import javax.mail.SendFailedException;
-
-public class SMTPSendFailedException extends SendFailedException {
-    // the failing command
-    protected String cmd;
-
-    // the error code for the failure
-    protected int rc;
-
-    /**
-     * Constructor for an SMTPSendFaileException.
-     * 
-     * @param cmd
-     *            The failing command string.
-     * @param rc
-     *            The error code for the failing command.
-     * @param err
-     *            An error message for the exception.
-     * @param ex
-     *            Any associated nested exception.
-     * @param vs
-     *            An array of valid, sent addresses.
-     * @param vus
-     *            An array of addresses that were valid, but were unsent.
-     * @param inv
-     *            An array of addresses deemed invalid.
-     */
-    SMTPSendFailedException(java.lang.String cmd, int rc, java.lang.String err, java.lang.Exception ex, Address[] vs,
-            Address[] vus, Address[] inv) {
-        super(err, ex, vs, vus, inv);
-        this.cmd = cmd;
-        this.rc = rc;
-    }
-
-    /**
-     * Get the failing command string for the exception.
-     * 
-     * @return The string value of the failing command.
-     */
-    public String getCommand() {
-        return cmd;
-    }
-
-    /**
-     * The failing command return code.
-     * 
-     * @return The failure return code.
-     */
-    public int getReturnCode() {
-        return rc;
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPTransport.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPTransport.java
deleted file mode 100644
index 7b96d52..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPTransport.java
+++ /dev/null
@@ -1,2362 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.smtp;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.io.UnsupportedEncodingException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.StringTokenizer;
-
-import javax.mail.Address;
-import javax.mail.AuthenticationFailedException;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Session;
-import javax.mail.Transport;
-import javax.mail.URLName;
-import javax.mail.event.TransportEvent;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
-import javax.net.ssl.SSLSocket;
-
-import org.apache.geronimo.javamail.authentication.ClientAuthenticator;
-import org.apache.geronimo.javamail.authentication.CramMD5Authenticator;
-import org.apache.geronimo.javamail.authentication.DigestMD5Authenticator;
-import org.apache.geronimo.javamail.authentication.LoginAuthenticator;
-import org.apache.geronimo.javamail.authentication.PlainAuthenticator;
-import org.apache.geronimo.javamail.util.MIMEOutputStream;
-import org.apache.geronimo.javamail.util.TraceInputStream;
-import org.apache.geronimo.javamail.util.TraceOutputStream;
-import org.apache.geronimo.mail.util.Base64;
-import org.apache.geronimo.mail.util.XText;
-
-/**
- * Simple implementation of SMTP transport. Just does plain RFC821-ish delivery.
- * <p/> Supported properties : <p/>
- * <ul>
- * <li> mail.host : to set the server to deliver to. Default = localhost</li>
- * <li> mail.smtp.port : to set the port. Default = 25</li>
- * <li> mail.smtp.locahost : name to use for HELO/EHLO - default getHostName()</li>
- * </ul>
- * <p/> There is no way to indicate failure for a given recipient (it's possible
- * to have a recipient address rejected). The sun impl throws exceptions even if
- * others successful), but maybe we do a different way... <p/> TODO : lots.
- * ESMTP, user/pass, indicate failure, etc...
- *
- * @version $Rev$ $Date$
- */
-public class SMTPTransport extends Transport {
-
-    /**
-     * constants for EOL termination
-     */
-    protected static final char CR = '\r';
-
-    protected static final char LF = '\n';
-
-    /**
-     * property keys for top level session properties.
-     */
-    protected static final String MAIL_LOCALHOST = "mail.localhost";
-
-    protected static final String MAIL_SSLFACTORY_CLASS = "mail.SSLSocketFactory.class";
-
-    /**
-     * property keys for protocol properties. The actual property name will be
-     * appended with "mail." + protocol + ".", where the protocol is either
-     * "smtp" or "smtps".
-     */
-    protected static final String MAIL_SMTP_AUTH = "auth";
-
-    protected static final String MAIL_SMTP_PORT = "port";
-
-    protected static final String MAIL_SMTP_LOCALHOST = "localhost";
-
-    protected static final String MAIL_SMTP_TIMEOUT = "timeout";
-
-    protected static final String MAIL_SMTP_SASL_REALM = "sasl.realm";
-
-    protected static final String MAIL_SMTP_TLS = "starttls.enable";
-
-    protected static final String MAIL_SMTP_FACTORY_CLASS = "socketFactory.class";
-
-    protected static final String MAIL_SMTP_FACTORY_FALLBACK = "socketFactory.fallback";
-
-    protected static final String MAIL_SMTP_FACTORY_PORT = "socketFactory.port";
-
-    protected static final String MAIL_SMTP_REPORT_SUCCESS = "reportsuccess";
-
-    protected static final String MAIL_SMTP_STARTTLS_ENABLE = "starttls.enable";
-
-    protected static final String MAIL_SMTP_DSN_NOTIFY = "dsn.notify";
-
-    protected static final String MAIL_SMTP_SENDPARTIAL = "sendpartial";
-
-    protected static final String MAIL_SMTP_LOCALADDRESS = "localaddress";
-
-    protected static final String MAIL_SMTP_LOCALPORT = "localport";
-
-    protected static final String MAIL_SMTP_QUITWAIT = "quitwait";
-
-    protected static final String MAIL_SMTP_FROM = "from";
-
-    protected static final String MAIL_SMTP_DSN_RET = "dsn.ret";
-
-    protected static final String MAIL_SMTP_SUBMITTER = "submitter";
-
-    protected static final String MAIL_SMTP_EXTENSION = "mailextension";
-
-    protected static final String MAIL_SMTP_EHLO = "ehlo";
-
-    protected static final String MAIL_SMTP_ENCODE_TRACE = "encodetrace";
-
-    protected static final int MIN_MILLIS = 1000 * 60;
-
-    protected static final int TIMEOUT = MIN_MILLIS * 5;
-
-    protected static final String DEFAULT_MAIL_HOST = "localhost";
-
-    protected static final int DEFAULT_MAIL_SMTP_PORT = 25;
-
-    protected static final int DEFAULT_MAIL_SMTPS_PORT = 465;
-
-    // SMTP reply codes
-    protected static final int SERVICE_READY = 220;
-
-    protected static final int SERVICE_CLOSING = 221;
-
-    protected static final int AUTHENTICATION_COMPLETE = 235;
-
-    protected static final int COMMAND_ACCEPTED = 250;
-
-    protected static final int ADDRESS_NOT_LOCAL = 251;
-
-    protected static final int AUTHENTICATION_CHALLENGE = 334;
-
-    protected static final int START_MAIL_INPUT = 354;
-
-    protected static final int SERVICE_NOT_AVAILABLE = 421;
-
-    protected static final int MAILBOX_BUSY = 450;
-
-    protected static final int PROCESSING_ERROR = 451;
-
-    protected static final int INSUFFICIENT_STORAGE = 452;
-
-    protected static final int COMMAND_SYNTAX_ERROR = 500;
-
-    protected static final int PARAMETER_SYNTAX_ERROR = 501;
-
-    protected static final int COMMAND_NOT_IMPLEMENTED = 502;
-
-    protected static final int INVALID_COMMAND_SEQUENCE = 503;
-
-    protected static final int COMMAND_PARAMETER_NOT_IMPLEMENTED = 504;
-
-    protected static final int MAILBOX_NOT_FOUND = 550;
-
-    protected static final int USER_NOT_LOCAL = 551;
-
-    protected static final int MAILBOX_FULL = 552;
-
-    protected static final int INVALID_MAILBOX = 553;
-
-    protected static final int TRANSACTION_FAILED = 553;
-
-    protected static final String AUTHENTICATION_PLAIN = "PLAIN";
-
-    protected static final String AUTHENTICATION_LOGIN = "LOGIN";
-
-    protected static final String AUTHENTICATION_CRAMMD5 = "CRAM-MD5";
-
-    protected static final String AUTHENTICATION_DIGESTMD5 = "DIGEST-MD5";
-
-    // the protocol we're working with. This will be either "smtp" or "smtps".
-    protected String protocol;
-
-    // the target host
-    protected String host;
-
-    // the default port to use for this protocol (differs between "smtp" and
-    // "smtps").
-    protected int defaultPort;
-
-    // the target server port.
-    protected int port;
-
-    // the connection socket...can be a plain socket or SSLSocket, if TLS is
-    // being used.
-    protected Socket socket;
-
-    // our local host name
-    protected String localHost;
-
-    // input stream used to read data. If Sasl is in use, this might be other
-    // than the
-    // direct access to the socket input stream.
-    protected InputStream inputStream;
-
-    // the other end of the connection pipeline.
-    protected OutputStream outputStream;
-
-    // list of authentication mechanisms supported by the server
-    protected HashMap serverAuthenticationMechanisms;
-
-    // map of server extension arguments
-    protected HashMap serverExtensionArgs;
-
-    // do we report success after completion of each mail send.
-    protected boolean reportSuccess;
-
-    // does the server support transport level security?
-    protected boolean serverTLS = false;
-
-    // is TLS enabled on our part?
-    protected boolean useTLS = false;
-
-    // do we use SSL for our initial connection?
-    protected boolean sslConnection = false;
-
-    // the username we connect with
-    protected String username;
-
-    // the authentication password.
-    protected String password;
-
-    // the target SASL realm (normally null unless explicitly set or we have an
-    // authentication mechanism that
-    // requires it.
-    protected String realm;
-
-    // the last response line received from the server.
-    protected SMTPReply lastServerResponse = null;
-
-    // our session provided debug output stream.
-    protected PrintStream debugStream;
-
-    /**
-     * Normal constructor for an SMTPTransport() object. This constructor is
-     * used to build a transport instance for the "smtp" protocol.
-     *
-     * @param session
-     *            The attached session.
-     * @param name
-     *            An optional URLName object containing target information.
-     */
-    public SMTPTransport(Session session, URLName name) {
-        this(session, name, "smtp", DEFAULT_MAIL_SMTP_PORT, false);
-    }
-
-    /**
-     * Common constructor used by the SMTPTransport and SMTPSTransport classes
-     * to do common initialization of defaults.
-     *
-     * @param session
-     *            The host session instance.
-     * @param name
-     *            The URLName of the target.
-     * @param protocol
-     *            The protocol type (either "smtp" or "smtps". This helps us in
-     *            retrieving protocol-specific session properties.
-     * @param defaultPort
-     *            The default port used by this protocol. For "smtp", this will
-     *            be 25. The default for "smtps" is 465.
-     * @param sslConnection
-     *            Indicates whether an SSL connection should be used to initial
-     *            contact the server. This is different from the STARTTLS
-     *            support, which switches the connection to SSL after the
-     *            initial startup.
-     */
-    protected SMTPTransport(Session session, URLName name, String protocol, int defaultPort, boolean sslConnection) {
-        super(session, name);
-        this.protocol = protocol;
-
-        // these are defaults based on what the superclass specifies.
-        this.defaultPort = defaultPort;
-        this.sslConnection = sslConnection;
-        // check to see if we need to throw an exception after a send operation.
-        reportSuccess = isProtocolPropertyTrue(MAIL_SMTP_REPORT_SUCCESS);
-        // and also check for TLS enablement.
-        useTLS = isProtocolPropertyTrue(MAIL_SMTP_STARTTLS_ENABLE);
-
-        // get our debug output.
-        debugStream = session.getDebugOut();
-    }
-
-    /**
-     * Connect to a server using an already created socket. This connection is
-     * just like any other connection, except we will not create a new socket.
-     *
-     * @param socket
-     *            The socket connection to use.
-     */
-    public void connect(Socket socket) throws MessagingException {
-        this.socket = socket;
-        super.connect();
-    }
-
-    /**
-     * Do the protocol connection for an SMTP transport. This handles server
-     * authentication, if possible. Returns false if unable to connect to the
-     * server.
-     *
-     * @param host
-     *            The target host name.
-     * @param port
-     *            The server port number.
-     * @param user
-     *            The authentication user (if any).
-     * @param password
-     *            The server password. Might not be sent directly if more
-     *            sophisticated authentication is used.
-     *
-     * @return true if we were able to connect to the server properly, false for
-     *         any failures.
-     * @exception MessagingException
-     */
-    protected boolean protocolConnect(String host, int port, String username, String password)
-            throws MessagingException {
-        if (debug) {
-            debugOut("Connecting to server " + host + ":" + port + " for user " + username);
-        }
-
-        // now check to see if we need to authenticate. If we need this, then
-        // we must have a username and
-        // password specified. Failing this may result in a user prompt to
-        // collect the information.
-        boolean mustAuthenticate = isProtocolPropertyTrue(MAIL_SMTP_AUTH);
-
-        // if we need to authenticate, and we don't have both a userid and
-        // password, then we fail this
-        // immediately. The Service.connect() method will try to obtain the user
-        // information and retry the
-        // connection one time.
-        if (mustAuthenticate && (username == null || password == null)) {
-            return false;
-        }
-
-        // if the port is defaulted, then see if we have something configured in
-        // the session.
-        // if not configured, we just use the default default.
-        if (port == -1) {
-            // take the default first.
-            port = defaultPort;
-            String configuredPort = getProtocolProperty(MAIL_SMTP_PORT);
-            if (configuredPort != null) {
-                port = Integer.parseInt(configuredPort);
-            }
-        }
-    	
-    	// Before we do anything, let's make sure that we succesfully received a host
-    	if ( host == null ) {
-    		host = DEFAULT_MAIL_HOST;
-    	}
-
-        try {
-
-            // create socket and connect to server.
-            getConnection(host, port, username, password);
-
-            // receive welcoming message
-            if (!getWelcome()) {
-                throw new MessagingException("Error in getting welcome msg");
-            }
-
-            // say hello
-            if (!sendHandshake()) {
-                throw new MessagingException("Error in saying EHLO to server");
-            }
-
-            // authenticate with the server, if necessary
-            if (!processAuthentication()) {
-                if (debug) {
-                    debugOut("User authentication failure");
-                }
-                throw new AuthenticationFailedException("Error authenticating with server");
-            }
-        } catch (IOException e) {
-            if (debug) {
-                debugOut("I/O exception establishing connection", e);
-            }
-            throw new MessagingException("Connection error", e);
-        }
-        return true;
-    }
-
-    /**
-     * Send a message to multiple addressees.
-     *
-     * @param message
-     *            The message we're sending.
-     * @param addresses
-     *            An array of addresses to send to.
-     *
-     * @exception MessagingException
-     */
-    public void sendMessage(Message message, Address[] addresses) throws MessagingException {
-        if (!isConnected()) {
-            throw new IllegalStateException("Not connected");
-        }
-        // don't bother me w/ null messages or no addreses
-        if (message == null) {
-            throw new MessagingException("Null message");
-        }
-
-        // SMTP only handles instances of MimeMessage, not the more general
-        // message case.
-        if (!(message instanceof MimeMessage)) {
-            throw new MessagingException("SMTP can only send MimeMessages");
-        }
-
-        // we must have a message list.
-        if (addresses == null || addresses.length == 0) {
-            throw new MessagingException("Null or empty address array");
-        }
-
-        boolean haveGroup = false;
-
-        // enforce the requirement that all of the targets are InternetAddress
-        // instances.
-        for (int i = 0; i < addresses.length; i++) {
-            if (addresses[i] instanceof InternetAddress) {
-                // and while we're here, see if we have a groups in the address
-                // list. If we do, then
-                // we're going to need to expand these before sending.
-                if (((InternetAddress) addresses[i]).isGroup()) {
-                    haveGroup = true;
-                }
-            } else {
-                throw new MessagingException("Illegal InternetAddress " + addresses[i]);
-            }
-        }
-
-        // did we find a group? Time to expand this into our full target list.
-        if (haveGroup) {
-            addresses = expandGroups(addresses);
-        }
-
-        SendStatus[] stats = new SendStatus[addresses.length];
-
-        // create our lists for notification and exception reporting.
-        Address[] sent = null;
-        Address[] unsent = null;
-        Address[] invalid = null;
-
-        try {
-            // send sender first. If this failed, send a failure notice of the
-            // event, using the full list of
-            // addresses as the unsent, and nothing for the rest.
-            if (!sendMailFrom(message)) {
-                unsent = addresses;
-                sent = new Address[0];
-                invalid = new Address[0];
-                // notify of the error.
-                notifyTransportListeners(TransportEvent.MESSAGE_NOT_DELIVERED, sent, unsent, invalid, message);
-
-                // include the reponse information here.
-                SMTPReply last = lastServerResponse;
-                // now send an "uber-exception" to indicate the failure.
-                throw new SMTPSendFailedException("MAIL FROM", last.getCode(), last.getMessage(), null, sent, unsent,
-                        invalid);
-            }
-
-            String dsn = null;
-
-            // there's an optional notification argument that can be added to
-            // MAIL TO. See if we've been
-            // provided with one.
-
-            // an SMTPMessage object is the first source
-            if (message instanceof SMTPMessage) {
-                // get the notification options
-                int options = ((SMTPMessage) message).getNotifyOptions();
-
-                switch (options) {
-                // a zero value indicates nothing is set.
-                case 0:
-                    break;
-
-                case SMTPMessage.NOTIFY_NEVER:
-                    dsn = "NEVER";
-                    break;
-
-                case SMTPMessage.NOTIFY_SUCCESS:
-                    dsn = "SUCCESS";
-                    break;
-
-                case SMTPMessage.NOTIFY_FAILURE:
-                    dsn = "FAILURE";
-                    break;
-
-                case SMTPMessage.NOTIFY_DELAY:
-                    dsn = "DELAY";
-                    break;
-
-                // now for combinations...there are few enough combinations here
-                // that we can just handle this in the switch statement rather
-                // than have to
-                // concatentate everything together.
-                case (SMTPMessage.NOTIFY_SUCCESS + SMTPMessage.NOTIFY_FAILURE):
-                    dsn = "SUCCESS,FAILURE";
-                    break;
-
-                case (SMTPMessage.NOTIFY_SUCCESS + SMTPMessage.NOTIFY_DELAY):
-                    dsn = "SUCCESS,DELAY";
-                    break;
-
-                case (SMTPMessage.NOTIFY_FAILURE + SMTPMessage.NOTIFY_DELAY):
-                    dsn = "FAILURE,DELAY";
-                    break;
-
-                case (SMTPMessage.NOTIFY_SUCCESS + SMTPMessage.NOTIFY_FAILURE + SMTPMessage.NOTIFY_DELAY):
-                    dsn = "SUCCESS,FAILURE,DELAY";
-                    break;
-                }
-            }
-
-            // if still null, grab a property value (yada, yada, yada...)
-            if (dsn == null) {
-                dsn = getProtocolProperty(MAIL_SMTP_DSN_NOTIFY);
-            }
-
-            // we need to know about any failures once we've gone through the
-            // complete list, so keep a
-            // failure flag.
-            boolean sendFailure = false;
-
-            // event notifcation requires we send lists of successes and
-            // failures broken down by category.
-            // The categories are:
-            //
-            // 1) addresses successfully processed.
-            // 2) addresses deemed valid, but had a processing failure that
-            // prevented sending.
-            // 3) addressed deemed invalid (basically all other processing
-            // failures).
-            ArrayList sentAddresses = new ArrayList();
-            ArrayList unsentAddresses = new ArrayList();
-            ArrayList invalidAddresses = new ArrayList();
-
-            // Now we add a MAIL TO record for each recipient. At this point, we
-            // just collect
-            for (int i = 0; i < addresses.length; i++) {
-                InternetAddress target = (InternetAddress) addresses[i];
-
-                // write out the record now.
-                SendStatus status = sendRcptTo(target, dsn);
-                stats[i] = status;
-
-                switch (status.getStatus()) {
-                // successfully sent
-                case SendStatus.SUCCESS:
-                    sentAddresses.add(target);
-                    break;
-
-                // we have an invalid address of some sort, or a general sending
-                // error (which we'll
-                // interpret as due to an invalid address.
-                case SendStatus.INVALID_ADDRESS:
-                case SendStatus.GENERAL_ERROR:
-                    sendFailure = true;
-                    invalidAddresses.add(target);
-                    break;
-
-                // good address, but this was a send failure.
-                case SendStatus.SEND_FAILURE:
-                    sendFailure = true;
-                    unsentAddresses.add(target);
-                    break;
-                }
-            }
-
-            // if we had a send failure, then we need to check if we allow
-            // partial sends. If not allowed,
-            // we abort the send operation now.
-            if (sendFailure) {
-                // now see how we're configured for this send operation.
-                boolean partialSends = false;
-
-                // this can be attached directly to the message.
-                if (message instanceof SMTPMessage) {
-                    partialSends = ((SMTPMessage) message).getSendPartial();
-                }
-
-                // if still false on the message object, check for a property
-                // version also
-                if (!partialSends) {
-                    partialSends = isProtocolPropertyTrue(MAIL_SMTP_SENDPARTIAL);
-                }
-
-                // if we're not allowing partial successes or we've failed on
-                // all of the addresses, it's
-                // time to abort.
-                if (!partialSends || sentAddresses.isEmpty()) {
-                    // we send along the valid and invalid address lists on the
-                    // notifications and
-                    // exceptions.
-                    // however, since we're aborting the entire send, the
-                    // successes need to become
-                    // members of the failure list.
-                    unsentAddresses.addAll(sentAddresses);
-
-                    // this one is empty.
-                    sent = new Address[0];
-                    unsent = (Address[]) unsentAddresses.toArray(new Address[0]);
-                    invalid = (Address[]) invalidAddresses.toArray(new Address[0]);
-
-                    // go reset our connection so we can process additional
-                    // sends.
-                    resetConnection();
-
-                    // get a list of chained exceptions for all of the failures.
-                    MessagingException failures = generateExceptionChain(stats, false);
-
-                    // now send an "uber-exception" to indicate the failure.
-                    throw new SMTPSendFailedException("MAIL TO", 0, "Invalid Address", failures, sent, unsent, invalid);
-                }
-            }
-
-            try {
-                // try to send the data
-                sendData(message);
-            } catch (MessagingException e) {
-                // If there's an error at this point, this is a complete
-                // delivery failure.
-                // we send along the valid and invalid address lists on the
-                // notifications and
-                // exceptions.
-                // however, since we're aborting the entire send, the successes
-                // need to become
-                // members of the failure list.
-                unsentAddresses.addAll(sentAddresses);
-
-                // this one is empty.
-                sent = new Address[0];
-                unsent = (Address[]) unsentAddresses.toArray(new Address[0]);
-                invalid = (Address[]) invalidAddresses.toArray(new Address[0]);
-                // notify of the error.
-                notifyTransportListeners(TransportEvent.MESSAGE_NOT_DELIVERED, sent, unsent, invalid, message);
-                // send a send failure exception.
-                throw new SMTPSendFailedException("DATA", 0, "Send failure", e, sent, unsent, invalid);
-            }
-
-            // create our lists for notification and exception reporting from
-            // this point on.
-            sent = (Address[]) sentAddresses.toArray(new Address[0]);
-            unsent = (Address[]) unsentAddresses.toArray(new Address[0]);
-            invalid = (Address[]) invalidAddresses.toArray(new Address[0]);
-
-            // if sendFailure is true, we had an error during the address phase,
-            // but we had permission to
-            // process this as a partial send operation. Now that the data has
-            // been sent ok, it's time to
-            // report the partial failure.
-            if (sendFailure) {
-                // notify our listeners of the partial delivery.
-                notifyTransportListeners(TransportEvent.MESSAGE_PARTIALLY_DELIVERED, sent, unsent, invalid, message);
-
-                // get a list of chained exceptions for all of the failures (and
-                // the successes, if reportSuccess has been
-                // turned on).
-                MessagingException failures = generateExceptionChain(stats, getReportSuccess());
-
-                // now send an "uber-exception" to indicate the failure.
-                throw new SMTPSendFailedException("MAIL TO", 0, "Invalid Address", failures, sent, unsent, invalid);
-            }
-
-            // notify our listeners of successful delivery.
-            notifyTransportListeners(TransportEvent.MESSAGE_DELIVERED, sent, unsent, invalid, message);
-
-            // we've not had any failures, but we've been asked to report
-            // success as an exception. Do
-            // this now.
-            if (reportSuccess) {
-                // generate the chain of success exceptions (we already know
-                // there are no failure ones to report).
-                MessagingException successes = generateExceptionChain(stats, reportSuccess);
-                if (successes != null) {
-                    throw successes;
-                }
-            }
-        } catch (SMTPSendFailedException e) {
-            // if this is a send failure, we've already handled
-            // notifications....just rethrow it.
-            throw e;
-        } catch (MessagingException e) {
-            // notify of the error.
-            notifyTransportListeners(TransportEvent.MESSAGE_NOT_DELIVERED, sent, unsent, invalid, message);
-            throw e;
-        }
-    }
-
-    /**
-     * Close the connection. On completion, we'll be disconnected from the
-     * server and unable to send more data.
-     *
-     * @exception MessagingException
-     */
-    public void close() throws MessagingException {
-        // if we're already closed, get outta here.
-        if (socket == null) {
-            return;
-        }
-        try {
-            // say goodbye
-            sendQuit();
-        } finally {
-            // and close up the connection. We do this in a finally block to
-            // make sure the connection
-            // is shut down even if quit gets an error.
-            closeServerConnection();
-        }
-    }
-
-    /**
-     * Turn a series of send status items into a chain of exceptions indicating
-     * the state of each send operation.
-     *
-     * @param stats
-     *            The list of SendStatus items.
-     * @param reportSuccess
-     *            Indicates whether we should include the report success items.
-     *
-     * @return The head of a chained list of MessagingExceptions.
-     */
-    protected MessagingException generateExceptionChain(SendStatus[] stats, boolean reportSuccess) {
-        MessagingException current = null;
-
-        for (int i = 0; i < stats.length; i++) {
-            SendStatus status = stats[i];
-
-            if (status != null) {
-                MessagingException nextException = stats[i].getException(reportSuccess);
-                // if there's an exception associated with this status, chain it
-                // up with the rest.
-                if (nextException != null) {
-                    if (current == null) {
-                        current = nextException;
-                    } else {
-                        current.setNextException(nextException);
-                        current = nextException;
-                    }
-                }
-            }
-        }
-        return current;
-    }
-
-    /**
-     * Reset the server connection after an error.
-     *
-     * @exception MessagingException
-     */
-    protected void resetConnection() throws MessagingException {
-        // we want the caller to retrieve the last response responsbile for
-        // requiring the reset, so save and
-        // restore that info around the reset.
-        SMTPReply last = lastServerResponse;
-
-        // send a reset command.
-        SMTPReply line = sendCommand("RSET");
-
-        // if this did not reset ok, just close the connection
-        if (line.getCode() != COMMAND_ACCEPTED) {
-            close();
-        }
-        // restore this.
-        lastServerResponse = last;
-    }
-
-    /**
-     * Expand the address list by converting any group addresses into single
-     * address targets.
-     *
-     * @param addresses
-     *            The input array of addresses.
-     *
-     * @return The expanded array of addresses.
-     * @exception MessagingException
-     */
-    protected Address[] expandGroups(Address[] addresses) throws MessagingException {
-        ArrayList expandedAddresses = new ArrayList();
-
-        // run the list looking for group addresses, and add the full group list
-        // to our targets.
-        for (int i = 0; i < addresses.length; i++) {
-            InternetAddress address = (InternetAddress) addresses[i];
-            // not a group? Just copy over to the other list.
-            if (!address.isGroup()) {
-                expandedAddresses.add(address);
-            } else {
-                // get the group address and copy each member of the group into
-                // the expanded list.
-                InternetAddress[] groupAddresses = address.getGroup(true);
-                for (int j = 1; j < groupAddresses.length; j++) {
-                    expandedAddresses.add(groupAddresses[j]);
-                }
-            }
-        }
-
-        // convert back into an array.
-        return (Address[]) expandedAddresses.toArray(new Address[0]);
-    }
-
-    /**
-     * Create a transport connection object and connect it to the target server.
-     *
-     * @param host
-     *            The target server host.
-     * @param port
-     *            The connection port.
-     *
-     * @exception MessagingException
-     */
-    protected void getConnection(String host, int port, String username, String password) throws IOException {
-        this.host = host;
-        this.port = port;
-        this.username = username;
-        this.password = password;
-        // and see if STARTTLS is enabled.
-        useTLS = isProtocolPropertyTrue(MAIL_SMTP_TLS);
-        serverAuthenticationMechanisms = new HashMap();
-        // We might have been passed a socket to connect with...if not, we need
-        // to create one of the correct type.
-        if (socket == null) {
-            // if this is the "smtps" protocol, we start with an SSLSocket
-            if (sslConnection) {
-                getConnectedSSLSocket();
-            } else {
-                getConnectedSocket();
-            }
-        }
-        // if we already have a socket, get some information from it and
-        // override what we've been passed.
-        else {
-            port = socket.getPort();
-            host = socket.getInetAddress().getHostName();
-        }
-        // now set up the input/output streams.
-        inputStream = new TraceInputStream(socket.getInputStream(), debugStream, debug,
-                isProtocolPropertyTrue(MAIL_SMTP_ENCODE_TRACE));
-        ;
-        outputStream = new TraceOutputStream(socket.getOutputStream(), debugStream, debug,
-                isProtocolPropertyTrue(MAIL_SMTP_ENCODE_TRACE));
-    }
-
-    /**
-     * Get a property associated with this mail protocol.
-     *
-     * @param name
-     *            The name of the property.
-     *
-     * @return The property value (returns null if the property has not been
-     *         set).
-     */
-    protected String getProtocolProperty(String name) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "smtp" or "smtps").
-        String fullName = "mail." + protocol + "." + name;
-        return getSessionProperty(fullName);
-    }
-
-    /**
-     * Get a property associated with this mail session.
-     *
-     * @param name
-     *            The name of the property.
-     *
-     * @return The property value (returns null if the property has not been
-     *         set).
-     */
-    protected String getSessionProperty(String name) {
-        return session.getProperty(name);
-    }
-
-    /**
-     * Get a property associated with this mail session. Returns the provided
-     * default if it doesn't exist.
-     *
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     *
-     * @return The property value (returns defaultValue if the property has not
-     *         been set).
-     */
-    protected String getSessionProperty(String name, String defaultValue) {
-        String result = session.getProperty(name);
-        if (result == null) {
-            return defaultValue;
-        }
-        return result;
-    }
-
-    /**
-     * Get a property associated with this mail session. Returns the provided
-     * default if it doesn't exist.
-     *
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     *
-     * @return The property value (returns defaultValue if the property has not
-     *         been set).
-     */
-    protected String getProtocolProperty(String name, String defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "smtp" or "smtps").
-        String fullName = "mail." + protocol + "." + name;
-        return getSessionProperty(fullName, defaultValue);
-    }
-
-    /**
-     * Get a property associated with this mail session as an integer value.
-     * Returns the default value if the property doesn't exist or it doesn't
-     * have a valid int value.
-     *
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     *
-     * @return The property value converted to an int.
-     */
-    protected int getIntSessionProperty(String name, int defaultValue) {
-        String result = getSessionProperty(name);
-        if (result != null) {
-            try {
-                // convert into an int value.
-                return Integer.parseInt(result);
-            } catch (NumberFormatException e) {
-            }
-        }
-        // return default value if it doesn't exist is isn't convertable.
-        return defaultValue;
-    }
-
-    /**
-     * Get a property associated with this mail session as an integer value.
-     * Returns the default value if the property doesn't exist or it doesn't
-     * have a valid int value.
-     *
-     * @param name
-     *            The name of the property.
-     * @param defaultValue
-     *            The default value to return if the property doesn't exist.
-     *
-     * @return The property value converted to an int.
-     */
-    protected int getIntProtocolProperty(String name, int defaultValue) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "smtp" or "smtps").
-        String fullName = "mail." + protocol + "." + name;
-        return getIntSessionProperty(fullName, defaultValue);
-    }
-
-    /**
-     * Process a session property as a boolean value, returning either true or
-     * false.
-     *
-     * @return True if the property value is "true". Returns false for any other
-     *         value (including null).
-     */
-    protected boolean isProtocolPropertyTrue(String name) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "smtp" or "smtps").
-        String fullName = "mail." + protocol + "." + name;
-        return isSessionPropertyTrue(fullName);
-    }
-
-    /**
-     * Process a session property as a boolean value, returning either true or
-     * false.
-     *
-     * @return True if the property value is "true". Returns false for any other
-     *         value (including null).
-     */
-    protected boolean isSessionPropertyTrue(String name) {
-        String property = session.getProperty(name);
-        if (property != null) {
-            return property.equals("true");
-        }
-        return false;
-    }
-
-    /**
-     * Process a session property as a boolean value, returning either true or
-     * false.
-     *
-     * @return True if the property value is "false". Returns false for other
-     *         value (including null).
-     */
-    protected boolean isSessionPropertyFalse(String name) {
-        String property = session.getProperty(name);
-        if (property != null) {
-            return property.equals("false");
-        }
-        return false;
-    }
-
-    /**
-     * Process a session property as a boolean value, returning either true or
-     * false.
-     *
-     * @return True if the property value is "false". Returns false for other
-     *         value (including null).
-     */
-    protected boolean isProtocolPropertyFalse(String name) {
-        // the name we're given is the least qualified part of the name. We
-        // construct the full property name
-        // using the protocol (either "smtp" or "smtps").
-        String fullName = "mail." + protocol + "." + name;
-        return isSessionPropertyTrue(fullName);
-    }
-
-    /**
-     * Close the server connection at termination.
-     */
-    protected void closeServerConnection() {
-        try {
-            socket.close();
-        } catch (IOException ignored) {
-        }
-
-        socket = null;
-        inputStream = null;
-        outputStream = null;
-    }
-
-    /**
-     * Creates a connected socket
-     *
-     * @exception MessagingException
-     */
-    protected void getConnectedSocket() throws IOException {
-        if (debug) {
-            debugOut("Attempting plain socket connection to server " + host + ":" + port);
-        }
-
-        // the socket factory can be specified via a session property. By
-        // default, we just directly
-        // instantiate a socket without using a factor.
-        String socketFactory = getProtocolProperty(MAIL_SMTP_FACTORY_CLASS);
-
-        // there are several protocol properties that can be set to tune the
-        // created socket. We need to
-        // retrieve those bits before creating the socket.
-        int timeout = getIntProtocolProperty(MAIL_SMTP_TIMEOUT, -1);
-        InetAddress localAddress = null;
-        // see if we have a local address override.
-        String localAddrProp = getProtocolProperty(MAIL_SMTP_LOCALADDRESS);
-        if (localAddrProp != null) {
-            localAddress = InetAddress.getByName(localAddrProp);
-        }
-
-        // check for a local port...default is to allow socket to choose.
-        int localPort = getIntProtocolProperty(MAIL_SMTP_LOCALPORT, 0);
-
-        socket = null;
-
-        // if there is no socket factory defined (normal), we just create a
-        // socket directly.
-        if (socketFactory == null) {
-            socket = new Socket(host, port, localAddress, localPort);
-        }
-
-        else {
-            try {
-                int socketFactoryPort = getIntProtocolProperty(MAIL_SMTP_FACTORY_PORT, -1);
-
-                // we choose the port used by the socket based on overrides.
-                Integer portArg = new Integer(socketFactoryPort == -1 ? port : socketFactoryPort);
-
-                // use the current context loader to resolve this.
-                ClassLoader loader = Thread.currentThread().getContextClassLoader();
-                Class factoryClass = loader.loadClass(socketFactory);
-
-                // done indirectly, we need to invoke the method using
-                // reflection.
-                // This retrieves a factory instance.
-                Method getDefault = factoryClass.getMethod("getDefault", new Class[0]);
-                Object defFactory = getDefault.invoke(new Object(), new Object[0]);
-
-                // now that we have the factory, there are two different
-                // createSocket() calls we use,
-                // depending on whether we have a localAddress override.
-
-                if (localAddress != null) {
-                    // retrieve the createSocket(String, int, InetAddress, int)
-                    // method.
-                    Class[] createSocketSig = new Class[] { String.class, Integer.TYPE, InetAddress.class, Integer.TYPE };
-                    Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-
-                    Object[] createSocketArgs = new Object[] { host, portArg, localAddress, new Integer(localPort) };
-                    socket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-                } else {
-                    // retrieve the createSocket(String, int) method.
-                    Class[] createSocketSig = new Class[] { String.class, Integer.TYPE };
-                    Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-
-                    Object[] createSocketArgs = new Object[] { host, portArg };
-                    socket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-                }
-            } catch (Throwable e) {
-                // if a socket factor is specified, then we may need to fall
-                // back to a default. This behavior
-                // is controlled by (surprise) more session properties.
-                if (isProtocolPropertyTrue(MAIL_SMTP_FACTORY_FALLBACK)) {
-                    if (debug) {
-                        debugOut("First plain socket attempt faile, falling back to default factory", e);
-                    }
-                    socket = new Socket(host, port, localAddress, localPort);
-                }
-                // we have an exception. We're going to throw an IOException,
-                // which may require unwrapping
-                // or rewrapping the exception.
-                else {
-                    // we have an exception from the reflection, so unwrap the
-                    // base exception
-                    if (e instanceof InvocationTargetException) {
-                        e = ((InvocationTargetException) e).getTargetException();
-                    }
-
-                    if (debug) {
-                        debugOut("Plain socket creation failure", e);
-                    }
-
-                    // throw this as an IOException, with the original exception
-                    // attached.
-                    IOException ioe = new IOException("Error connecting to " + host + ", " + port);
-                    ioe.initCause(e);
-                    throw ioe;
-                }
-            }
-        }
-
-        if (timeout >= 0) {
-            socket.setSoTimeout(timeout);
-        }
-    }
-
-    /**
-     * Creates a connected SSL socket for an initial SSL connection.
-     *
-     * @exception MessagingException
-     */
-    protected void getConnectedSSLSocket() throws IOException {
-        if (debug) {
-            debugOut("Attempting SSL socket connection to server " + host + ":" + port);
-        }
-        // the socket factory can be specified via a protocol property, a
-        // session property, and if all else
-        // fails (which it usually does), we fall back to the standard factory
-        // class.
-        String socketFactory = getProtocolProperty(MAIL_SMTP_FACTORY_CLASS, getSessionProperty(MAIL_SSLFACTORY_CLASS,
-                "javax.net.ssl.SSLSocketFactory"));
-
-        // there are several protocol properties that can be set to tune the
-        // created socket. We need to
-        // retrieve those bits before creating the socket.
-        int timeout = getIntProtocolProperty(MAIL_SMTP_TIMEOUT, -1);
-        InetAddress localAddress = null;
-        // see if we have a local address override.
-        String localAddrProp = getProtocolProperty(MAIL_SMTP_LOCALADDRESS);
-        if (localAddrProp != null) {
-            localAddress = InetAddress.getByName(localAddrProp);
-        }
-
-        // check for a local port...default is to allow socket to choose.
-        int localPort = getIntProtocolProperty(MAIL_SMTP_LOCALPORT, 0);
-
-        socket = null;
-
-        // if there is no socket factory defined (normal), we just create a
-        // socket directly.
-        if (socketFactory == null) {
-            socket = new Socket(host, port, localAddress, localPort);
-        }
-
-        else {
-            // we'll try this with potentially two different factories if we're
-            // allowed to fall back.
-            boolean fallback = isProtocolPropertyTrue(MAIL_SMTP_FACTORY_FALLBACK);
-
-            while (true) {
-                try {
-                    if (debug) {
-                        debugOut("Creating SSL socket using factory " + socketFactory);
-                    }
-
-                    int socketFactoryPort = getIntProtocolProperty(MAIL_SMTP_FACTORY_PORT, -1);
-
-                    // we choose the port used by the socket based on overrides.
-                    Integer portArg = new Integer(socketFactoryPort == -1 ? port : socketFactoryPort);
-
-                    // use the current context loader to resolve this.
-                    ClassLoader loader = Thread.currentThread().getContextClassLoader();
-                    Class factoryClass = loader.loadClass(socketFactory);
-
-                    // done indirectly, we need to invoke the method using
-                    // reflection.
-                    // This retrieves a factory instance.
-                    Method getDefault = factoryClass.getMethod("getDefault", new Class[0]);
-                    Object defFactory = getDefault.invoke(new Object(), new Object[0]);
-
-                    // now that we have the factory, there are two different
-                    // createSocket() calls we use,
-                    // depending on whether we have a localAddress override.
-
-                    if (localAddress != null) {
-                        // retrieve the createSocket(String, int, InetAddress,
-                        // int) method.
-                        Class[] createSocketSig = new Class[] { String.class, Integer.TYPE, InetAddress.class,
-                                Integer.TYPE };
-                        Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-
-                        Object[] createSocketArgs = new Object[] { host, portArg, localAddress, new Integer(localPort) };
-                        socket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-                    } else {
-                        // retrieve the createSocket(String, int) method.
-                        Class[] createSocketSig = new Class[] { String.class, Integer.TYPE };
-                        Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-
-                        Object[] createSocketArgs = new Object[] { host, portArg };
-                        socket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-                    }
-                    // now break out and configure the socket.
-                    break;
-                } catch (Throwable e) {
-                    // if we're allowed to fallback, then use the default
-                    // factory and try this again. We only
-                    // allow this to happen once.
-                    if (fallback) {
-                        if (debug) {
-                            debugOut("First attempt at creating SSL socket failed, falling back to default factory");
-                        }
-                        socketFactory = "javax.net.ssl.SSLSocketFactory";
-                        fallback = false;
-                        continue;
-                    }
-                    // we have an exception. We're going to throw an
-                    // IOException, which may require unwrapping
-                    // or rewrapping the exception.
-                    else {
-                        // we have an exception from the reflection, so unwrap
-                        // the base exception
-                        if (e instanceof InvocationTargetException) {
-                            e = ((InvocationTargetException) e).getTargetException();
-                        }
-
-                        if (debug) {
-                            debugOut("Failure creating SSL socket", e);
-                        }
-
-                        // throw this as an IOException, with the original
-                        // exception attached.
-                        IOException ioe = new IOException("Error connecting to " + host + ", " + port);
-                        ioe.initCause(e);
-                        throw ioe;
-                    }
-                }
-            }
-        }
-
-        if (timeout >= 0) {
-            socket.setSoTimeout(timeout);
-        }
-    }
-
-    /**
-     * Switch the connection to using TLS level security, switching to an SSL
-     * socket.
-     */
-    protected void getConnectedTLSSocket() throws MessagingException {
-        if (debug) {
-            debugOut("Attempting to negotiate STARTTLS with server " + host);
-        }
-        // tell the server of our intention to start a TLS session
-        SMTPReply line = sendCommand("STARTTLS");
-
-        if (line.getCode() != SERVICE_READY) {
-            if (debug) {
-                debugOut("STARTTLS command rejected by SMTP server " + host);
-            }
-            throw new MessagingException("Unable to make TLS server connection");
-        }
-        // it worked, now switch the socket into TLS mode
-        try {
-
-            // we use the same target and port as the current connection.
-            String host = socket.getInetAddress().getHostName();
-            int port = socket.getPort();
-
-            // the socket factory can be specified via a session property. By
-            // default, we use
-            // the native SSL factory.
-            String socketFactory = getProtocolProperty(MAIL_SMTP_FACTORY_CLASS, "javax.net.ssl.SSLSocketFactory");
-
-            // use the current context loader to resolve this.
-            ClassLoader loader = Thread.currentThread().getContextClassLoader();
-            Class factoryClass = loader.loadClass(socketFactory);
-
-            // done indirectly, we need to invoke the method using reflection.
-            // This retrieves a factory instance.
-            Method getDefault = factoryClass.getMethod("getDefault", new Class[0]);
-            Object defFactory = getDefault.invoke(new Object(), new Object[0]);
-
-            // now we need to invoke createSocket()
-            Class[] createSocketSig = new Class[] { Socket.class, String.class, Integer.TYPE, Boolean.TYPE };
-            Method createSocket = factoryClass.getMethod("createSocket", createSocketSig);
-
-            Object[] createSocketArgs = new Object[] { socket, host, new Integer(port), Boolean.TRUE };
-
-            // and finally create the socket
-            Socket sslSocket = (Socket) createSocket.invoke(defFactory, createSocketArgs);
-
-            // if this is an instance of SSLSocket (very common), try setting
-            // the protocol to be
-            // "TLSv1". If this is some other class because of a factory
-            // override, we'll just have to
-            // accept that things will work.
-            if (sslSocket instanceof SSLSocket) {
-                ((SSLSocket) sslSocket).setEnabledProtocols(new String[] { "TLSv1" });
-                ((SSLSocket) sslSocket).setUseClientMode(true);
-                ((SSLSocket) sslSocket).startHandshake();
-            }
-
-            // and finally, as a last step, replace our input streams with the
-            // secure ones.
-            // now set up the input/output streams.
-            inputStream = new TraceInputStream(sslSocket.getInputStream(), debugStream, debug,
-                    isProtocolPropertyTrue(MAIL_SMTP_ENCODE_TRACE));
-            ;
-            outputStream = new TraceOutputStream(sslSocket.getOutputStream(), debugStream, debug,
-                    isProtocolPropertyTrue(MAIL_SMTP_ENCODE_TRACE));
-            // this is our active socket now
-            socket = sslSocket;
-
-        } catch (Exception e) {
-            if (debug) {
-                debugOut("Failure attempting to convert connection to TLS", e);
-            }
-            throw new MessagingException("Unable to convert connection to SSL", e);
-        }
-    }
-
-    /**
-     * Get the servers welcome blob from the wire....
-     */
-    protected boolean getWelcome() throws MessagingException {
-        SMTPReply line = getReply();
-        return !line.isError();
-    }
-
-    /**
-     * Sends the data in the message down the socket. This presumes the server
-     * is in the right place and ready for getting the DATA message and the data
-     * right place in the sequence
-     */
-    protected void sendData(Message msg) throws MessagingException {
-
-        // send the DATA command
-        SMTPReply line = sendCommand("DATA");
-
-        if (line.isError()) {
-            throw new MessagingException("Error issuing SMTP 'DATA' command: " + line);
-        }
-
-        // now the data... I could look at the type, but
-        try {
-            // the data content has two requirements we need to meet by
-            // filtering the
-            // output stream. Requirement 1 is to conicalize any line breaks.
-            // All line
-            // breaks will be transformed into properly formed CRLF sequences.
-            //
-            // Requirement 2 is to perform byte-stuff for any line that begins
-            // with a "."
-            // so that data is not confused with the end-of-data marker (a
-            // "\r\n.\r\n" sequence.
-            //
-            // The MIME output stream performs those two functions on behalf of
-            // the content
-            // writer.
-            OutputStream mimeOut = new MIMEOutputStream(outputStream);
-
-            msg.writeTo(mimeOut);
-            mimeOut.flush();
-        } catch (IOException e) {
-            throw new MessagingException(e.toString());
-        } catch (MessagingException e) {
-            throw new MessagingException(e.toString());
-        }
-
-        // now to finish, we send a CRLF sequence, followed by a ".".
-        sendLine("");
-        sendLine(".");
-
-        // use a longer time out here to give the server time to process the
-        // data.
-        try {
-            line = new SMTPReply(receiveLine(TIMEOUT * 2));
-        } catch (MalformedSMTPReplyException e) {
-            throw new MessagingException(e.toString());
-        } catch (MessagingException e) {
-            throw new MessagingException(e.toString());
-        }
-
-        if (line.isError()) {
-            throw new MessagingException("Error issuing SMTP 'DATA' command: " + line);
-        }
-    }
-
-    /**
-     * Sends the QUIT message and receieves the response
-     */
-    protected void sendQuit() throws MessagingException {
-        // there's yet another property that controls whether we should wait for
-        // a reply for a QUIT command. If true, we're suppposed to wait for a response 
-        // from the QUIT command.  Otherwise we just send the QUIT and bail.  The default 
-        // is "false"
-        if (isProtocolPropertyTrue(MAIL_SMTP_QUITWAIT)) {
-            // handle as a real command...we're going to ignore the response.
-            sendCommand("QUIT");
-        } else {
-            // just send the command without waiting for a response. 
-            sendLine("QUIT");
-        }
-    }
-
-    /**
-     * Sets a receiver address for the current message
-     *
-     * @param addr
-     *            The target address.
-     * @param dsn
-     *            An optional notification address appended to the MAIL command.
-     *
-     * @return The status for this particular send operation.
-     * @exception MessagingException
-     */
-    protected SendStatus sendRcptTo(InternetAddress addr, String dsn) throws MessagingException {
-        // compose the command using the fixed up email address. Normally, this
-        // involves adding
-        // "<" and ">" around the address.
-
-        StringBuffer command = new StringBuffer();
-
-        // compose the first part of the command
-        command.append("RCPT TO: ");
-        command.append(fixEmailAddress(addr.getAddress()));
-
-        // if we have DSN information, append it to the command.
-        if (dsn != null) {
-            command.append(" NOTIFY=");
-            command.append(dsn);
-        }
-
-        // get a string version of this command.
-        String commandString = command.toString();
-
-        SMTPReply line = sendCommand(commandString);
-
-        switch (line.getCode()) {
-        // these two are both successful transmissions
-        case COMMAND_ACCEPTED:
-        case ADDRESS_NOT_LOCAL:
-            // we get out of here with the status information.
-            return new SendStatus(SendStatus.SUCCESS, addr, commandString, line);
-
-        // these are considered invalid address errors
-        case PARAMETER_SYNTAX_ERROR:
-        case INVALID_COMMAND_SEQUENCE:
-        case MAILBOX_NOT_FOUND:
-        case INVALID_MAILBOX:
-        case USER_NOT_LOCAL:
-            // we get out of here with the status information.
-            return new SendStatus(SendStatus.INVALID_ADDRESS, addr, commandString, line);
-
-        // the command was valid, but something went wrong in the server.
-        case SERVICE_NOT_AVAILABLE:
-        case MAILBOX_BUSY:
-        case PROCESSING_ERROR:
-        case INSUFFICIENT_STORAGE:
-        case MAILBOX_FULL:
-            // we get out of here with the status information.
-            return new SendStatus(SendStatus.SEND_FAILURE, addr, commandString, line);
-
-        // everything else is considered really bad...
-        default:
-            // we get out of here with the status information.
-            return new SendStatus(SendStatus.GENERAL_ERROR, addr, commandString, line);
-        }
-    }
-
-    /**
-     * Set the sender for this mail.
-     *
-     * @param message
-     *            The message we're sending.
-     *
-     * @exception MessagingException
-     */
-    protected boolean sendMailFrom(Message message) throws MessagingException {
-
-        // need to sort the from value out from a variety of sources.
-        String from = null;
-
-        // first potential source is from the message itself, if it's an
-        // instance of SMTPMessage.
-        if (message instanceof SMTPMessage) {
-            from = ((SMTPMessage) message).getEnvelopeFrom();
-        }
-
-        // if not available from the message, check the protocol property next
-        if (from == null || from.length() == 0) {
-            // the from value can be set explicitly as a property
-            from = getProtocolProperty(MAIL_SMTP_FROM);
-        }
-
-        // if not there, see if we have something in the message header.
-        if (from == null || from.length() == 0) {
-            Address[] fromAddresses = message.getFrom();
-
-            // if we have some addresses in the header, then take the first one
-            // as our From: address
-            if (fromAddresses != null && fromAddresses.length > 0) {
-                from = ((InternetAddress) fromAddresses[0]).getAddress();
-            }
-            // get what the InternetAddress class believes to be the local
-            // address.
-            else {
-                InternetAddress local = InternetAddress.getLocalAddress(session);
-                if (local != null) {
-                    from = local.getAddress(); 
-                }
-            }
-        }
-
-        if (from == null || from.length() == 0) {
-            throw new MessagingException("no FROM address");
-        }
-
-        StringBuffer command = new StringBuffer();
-
-        // start building up the command
-        command.append("MAIL FROM: ");
-        command.append(fixEmailAddress(from));
-
-        // does this server support Delivery Status Notification? Then we may
-        // need to add some extra to the command.
-        if (supportsExtension("DSN")) {
-            String returnNotification = null;
-
-            // the return notification stuff might be set as value on the
-            // message object itself.
-            if (message instanceof SMTPMessage) {
-                // we need to convert the option into a string value.
-                switch (((SMTPMessage) message).getReturnOption()) {
-                case SMTPMessage.RETURN_FULL:
-                    returnNotification = "FULL";
-                    break;
-
-                case SMTPMessage.RETURN_HDRS:
-                    returnNotification = "HDRS";
-                    break;
-                }
-            }
-
-            // if not obtained from the message object, it can also be set as a
-            // property.
-            if (returnNotification == null) {
-                // the DSN value is set by yet another property.
-                returnNotification = getProtocolProperty(MAIL_SMTP_DSN_RET);
-            }
-
-            // if we have a target, add the notification stuff to our FROM
-            // command.
-            if (returnNotification != null) {
-                command.append(" RET=");
-                command.append(returnNotification);
-            }
-        }
-
-        // if this server supports AUTH and we have submitter information, then
-        // we also add the
-        // "AUTH=" keyword to the MAIL FROM command (see RFC 2554).
-
-        if (supportsExtension("AUTH")) {
-            String submitter = null;
-
-            // another option that can be specified on the message object.
-            if (message instanceof SMTPMessage) {
-                submitter = ((SMTPMessage) message).getSubmitter();
-            }
-            // if not part of the object, try for a propery version.
-            if (submitter == null) {
-                // we only send the extra keyword is a submitter is specified.
-                submitter = getProtocolProperty(MAIL_SMTP_SUBMITTER);
-            }
-            // we have one...add the keyword, plus the submitter info in xtext
-            // format (defined by RFC 1891).
-            if (submitter != null) {
-                command.append(" AUTH=");
-                try {
-                    // add this encoded
-                    command.append(new String(XText.encode(submitter.getBytes("US-ASCII"))));
-                } catch (UnsupportedEncodingException e) {
-                    throw new MessagingException("Invalid submitter value " + submitter);
-                }
-            }
-        }
-
-        String extension = null;
-
-        // now see if we need to add any additional extension info to this
-        // command. The extension is not
-        // checked for validity. That's the reponsibility of the caller.
-        if (message instanceof SMTPMessage) {
-            extension = ((SMTPMessage) message).getMailExtension();
-        }
-        // this can come either from the object or from a set property.
-        if (extension == null) {
-            extension = getProtocolProperty(MAIL_SMTP_EXTENSION);
-        }
-
-        // have something real to add?
-        if (extension != null && extension.length() != 0) {
-            // tack this on the end with a blank delimiter.
-            command.append(' ');
-            command.append(extension);
-        }
-
-        // and finally send the command
-        SMTPReply line = sendCommand(command.toString());
-
-        // 250 response indicates success.
-        return line.getCode() == COMMAND_ACCEPTED;
-    }
-
-    /**
-     * Send a command to the server, returning the first response line back as a
-     * reply.
-     *
-     * @param data
-     *            The data to send.
-     *
-     * @return A reply object with the reply line.
-     * @exception MessagingException
-     */
-    protected SMTPReply sendCommand(String data) throws MessagingException {
-        sendLine(data);
-        return getReply();
-    }
-
-    /**
-     * Sends a message down the socket and terminates with the appropriate CRLF
-     */
-    protected void sendLine(String data) throws MessagingException {
-        if (socket == null || !socket.isConnected()) {
-            throw new MessagingException("no connection");
-        }
-        try {
-            System.out.println(">>>>>Sending data " + data + "<<<<<<");
-            outputStream.write(data.getBytes());
-            outputStream.write(CR);
-            outputStream.write(LF);
-            outputStream.flush();
-        } catch (IOException e) {
-            throw new MessagingException(e.toString());
-        }
-    }
-
-    /**
-     * Receives one line from the server. A line is a sequence of bytes
-     * terminated by a CRLF
-     *
-     * @return the line from the server as String
-     */
-    protected String receiveLine() throws MessagingException {
-        return receiveLine(TIMEOUT);
-    }
-
-    /**
-     * Get a reply line for an SMTP command.
-     *
-     * @return An SMTP reply object from the stream.
-     */
-    protected SMTPReply getReply() throws MessagingException {
-        try {
-            lastServerResponse = new SMTPReply(receiveLine());
-        } catch (MalformedSMTPReplyException e) {
-            throw new MessagingException(e.toString());
-        } catch (MessagingException e) {
-            throw e;
-        }
-        return lastServerResponse;
-    }
-
-    /**
-     * Retrieve the last response received from the SMTP server.
-     *
-     * @return The raw response string (including the error code) returned from
-     *         the SMTP server.
-     */
-    public String getLastServerResponse() {
-        if (lastServerResponse == null) {
-            return "";
-        }
-        return lastServerResponse.getReply();
-    }
-
-    /**
-     * Receives one line from the server. A line is a sequence of bytes
-     * terminated by a CRLF
-     *
-     * @return the line from the server as String
-     */
-    protected String receiveLine(int delayMillis) throws MessagingException {
-        if (socket == null || !socket.isConnected()) {
-            throw new MessagingException("no connection");
-        }
-
-        int timeout = 0;
-
-        try {
-            // for now, read byte for byte, looking for a CRLF
-            timeout = socket.getSoTimeout();
-
-            socket.setSoTimeout(delayMillis);
-
-            StringBuffer buff = new StringBuffer();
-
-            int c;
-            boolean crFound = false, lfFound = false;
-
-            while ((c = inputStream.read()) != -1 && crFound == false && lfFound == false) {
-                // we're looking for a CRLF sequence, so mark each one as seen.
-                // Any other
-                // character gets appended to the end of the buffer.
-                if (c == CR) {
-                    crFound = true;
-                } else if (c == LF) {
-                    lfFound = true;
-                } else {
-                    buff.append((char) c);
-                }
-            }
-
-            String line = buff.toString();
-            return line;
-
-        } catch (SocketException e) {
-            throw new MessagingException(e.toString());
-        } catch (IOException e) {
-            throw new MessagingException(e.toString());
-        } finally {
-            try {
-                socket.setSoTimeout(timeout);
-            } catch (SocketException e) {
-                // ignore - was just trying to do the decent thing...
-            }
-        }
-    }
-
-    /**
-     * Convert an InternetAddress into a form sendable on an SMTP mail command.
-     * InternetAddress.getAddress() generally returns just the address portion
-     * of the full address, minus route address markers. We need to ensure we
-     * have an address with '<' and '>' delimiters.
-     *
-     * @param mail
-     *            The mail address returned from InternetAddress.getAddress().
-     *
-     * @return A string formatted for sending.
-     */
-    protected String fixEmailAddress(String mail) {
-        if (mail.charAt(0) == '<') {
-            return mail;
-        }
-        return "<" + mail + ">";
-    }
-
-    /**
-     * Start the handshake process with the server, including setting up and
-     * TLS-level work. At the completion of this task, we should be ready to
-     * authenticate with the server, if needed.
-     */
-    protected boolean sendHandshake() throws MessagingException {
-        // check to see what sort of initial handshake we need to make.
-        boolean useEhlo = !isProtocolPropertyFalse(MAIL_SMTP_EHLO);
-
-        // if we're to use Ehlo, send it and then fall back to just a HELO
-        // message if it fails.
-        if (useEhlo) {
-            if (!sendEhlo()) {
-                sendHelo();
-            }
-        } else {
-            // send the initial hello response.
-            sendHelo();
-        }
-
-        if (useTLS) {
-            // if we've been told to use TLS, and this server doesn't support
-            // it, then this is a failure
-            if (!serverTLS) {
-                throw new MessagingException("Server doesn't support required transport level security");
-            }
-            // if the server supports TLS, then use it for the connection.
-            // on our connection.
-            getConnectedTLSSocket();
-
-            // some servers (gmail is one that I know of) only send a STARTTLS
-            // extension message on the
-            // first EHLO command. Now that we have the TLS handshaking
-            // established, we need to send a
-            // second EHLO message to retrieve the AUTH records from the server.
-            serverAuthenticationMechanisms.clear();
-            if (!sendEhlo()) {
-                throw new MessagingException("Failure sending EHLO command to SMTP server");
-            }
-        }
-
-        // this worked.
-        return true;
-    }
-
-    /**
-     * Send the EHLO command to the SMTP server.
-     *
-     * @return True if the command was accepted ok, false for any errors.
-     * @exception SMTPTransportException
-     * @exception MalformedSMTPReplyException
-     * @exception MessagingException
-     */
-    protected boolean sendEhlo() throws MessagingException {
-        sendLine("EHLO " + getLocalHost());
-
-        SMTPReply line = getReply();
-
-        // we get a 250 code back. The first line is just a greeting, and
-        // extensions are identifed on
-        // continuations. If this fails, then we'll try once more with HELO to
-        // establish bona fides.
-        if (line.getCode() != COMMAND_ACCEPTED) {
-            return false;
-        }
-
-        // get a fresh extension mapping table.
-        serverExtensionArgs = new HashMap();
-
-        // process all of the continuation lines
-        while (line.isContinued()) {
-            // get the next line
-            line = getReply();
-            if (line.getCode() != COMMAND_ACCEPTED) {
-                // all EHLO failures go back to the HELO failback step.
-                return false;
-            }
-            // go process the extention
-            processExtension(line.getMessage());
-        }
-        return true;
-    }
-
-    /**
-     * Send the HELO command to the SMTP server.
-     *
-     * @exception MessagingException
-     */
-    protected void sendHelo() throws MessagingException {
-        sendLine("HELO " + getLocalHost());
-
-        SMTPReply line = getReply();
-
-        // we get a 250 code back. The first line is just a greeting, and
-        // extensions are identifed on
-        // continuations. If this fails, then we'll try once more with HELO to
-        // establish bona fides.
-        if (line.getCode() != COMMAND_ACCEPTED) {
-            throw new MessagingException("Failure sending HELO command to SMTP server");
-        }
-    }
-
-    /**
-     * Retrieve the local client host name.
-     *
-     * @return The string version of the local host name.
-     * @exception SMTPTransportException
-     */
-    public String getLocalHost() throws MessagingException {
-        if (localHost == null) {
-
-            try {
-                localHost = InetAddress.getLocalHost().getHostName();
-            } catch (UnknownHostException e) {
-                // fine, we're misconfigured - ignore
-            }
-
-            if (localHost == null) {
-                localHost = getProtocolProperty(MAIL_SMTP_LOCALHOST);
-            }
-
-            if (localHost == null) {
-                localHost = getSessionProperty(MAIL_LOCALHOST);
-            }
-
-            if (localHost == null) {
-                throw new MessagingException("Can't get local hostname. "
-                        + " Please correctly configure JDK/DNS or set mail.smtp.localhost");
-            }
-        }
-
-        return localHost;
-    }
-
-    /**
-     * Return the current reportSuccess property.
-     *
-     * @return The current reportSuccess property.
-     */
-    public boolean getReportSuccess() {
-        return reportSuccess;
-    }
-
-    /**
-     * Set a new value for the reportSuccess property.
-     *
-     * @param report
-     *            The new setting.
-     */
-    public void setReportSuccess(boolean report) {
-        reportSuccess = report;
-    }
-
-    /**
-     * Return the current startTLS property.
-     *
-     * @return The current startTLS property.
-     */
-    public boolean getStartTLS() {
-        return reportSuccess;
-    }
-
-    /**
-     * Set a new value for the startTLS property.
-     *
-     * @param start
-     *            The new setting.
-     */
-    public void setStartTLS(boolean start) {
-        useTLS = start;
-    }
-
-    /**
-     * Retrieve the SASL realm used for DIGEST-MD5 authentication. This will
-     * either be explicitly set, or retrieved using the mail.smtp.sasl.realm
-     * session property.
-     *
-     * @return The current realm information (which can be null).
-     */
-    public String getSASLRealm() {
-        // if the realm is null, retrieve it using the realm session property.
-        if (realm == null) {
-            realm = getProtocolProperty(MAIL_SMTP_SASL_REALM);
-        }
-        return realm;
-    }
-
-    /**
-     * Explicitly set the SASL realm used for DIGEST-MD5 authenticaiton.
-     *
-     * @param name
-     *            The new realm name.
-     */
-    public void setSASLRealm(String name) {
-        realm = name;
-    }
-
-    /**
-     * Explicitly set the local host information.
-     *
-     * @param localHost
-     *            The new localHost name.
-     */
-    public void setLocalHost(String localHost) {
-        this.localHost = localHost;
-    }
-
-    /**
-     * Process an extension string passed back as the EHLP response.
-     *
-     * @param extension
-     *            The string value of the extension (which will be of the form
-     *            "NAME arguments").
-     */
-    protected void processExtension(String extension) {
-        String extensionName = extension.toUpperCase();
-        String argument = "";
-
-        int delimiter = extension.indexOf(' ');
-        // if we have a keyword with arguments, parse them out and add to the
-        // argument map.
-        if (delimiter != -1) {
-            extensionName = extension.substring(0, delimiter).toUpperCase();
-            argument = extension.substring(delimiter + 1);
-        }
-
-        // add this to the map so it can be tested later.
-        serverExtensionArgs.put(extensionName, argument);
-
-        // process a few special ones that don't require extra parsing.
-        // AUTH and AUTH=LOGIN are handled the same
-        if (extensionName.equals("AUTH")) {
-            // if we don't have an argument on AUTH, this means LOGIN.
-            if (argument == null) {
-                serverAuthenticationMechanisms.put("LOGIN", "LOGIN");
-            } else {
-                // The security mechanisms are blank delimited tokens.
-                StringTokenizer tokenizer = new StringTokenizer(argument);
-
-                while (tokenizer.hasMoreTokens()) {
-                    String mechanism = tokenizer.nextToken().toUpperCase();
-                    serverAuthenticationMechanisms.put(mechanism, mechanism);
-                }
-            }
-        }
-        // special case for some older servers.
-        else if (extensionName.equals("AUTH=LOGIN")) {
-            serverAuthenticationMechanisms.put("LOGIN", "LOGIN");
-        }
-        // does this support transport level security?
-        else if (extensionName.equals("STARTTLS")) {
-            // flag this for later
-            serverTLS = true;
-        }
-    }
-
-    /**
-     * Retrieve any argument information associated with a extension reported
-     * back by the server on the EHLO command.
-     *
-     * @param name
-     *            The name of the target server extension.
-     *
-     * @return Any argument passed on a server extension. Returns null if the
-     *         extension did not include an argument or the extension was not
-     *         supported.
-     */
-    public String extensionParameter(String name) {
-        if (serverExtensionArgs != null) {
-            return (String) serverExtensionArgs.get(name);
-        }
-        return null;
-    }
-
-    /**
-     * Tests whether the target server supports a named extension.
-     *
-     * @param name
-     *            The target extension name.
-     *
-     * @return true if the target server reported on the EHLO command that is
-     *         supports the targer server, false if the extension was not
-     *         supported.
-     */
-    public boolean supportsExtension(String name) {
-        // this only returns null if we don't have this extension
-        return extensionParameter(name) != null;
-    }
-
-    /**
-     * Determine if the target server supports a given authentication mechanism.
-     *
-     * @param mechanism
-     *            The mechanism name.
-     *
-     * @return true if the server EHLO response indicates it supports the
-     *         mechanism, false otherwise.
-     */
-    protected boolean supportsAuthentication(String mechanism) {
-        return serverAuthenticationMechanisms.get(mechanism) != null;
-    }
-
-    /**
-     * Authenticate with the server, if necessary (or possible).
-     *
-     * @return true if we are ok to proceed, false for an authentication
-     *         failures.
-     */
-    protected boolean processAuthentication() throws MessagingException {
-        // no authentication defined?
-        if (!isProtocolPropertyTrue(MAIL_SMTP_AUTH)) {
-            return true;
-        }
-
-        // we need to authenticate, but we don't have userid/password
-        // information...fail this
-        // immediately.
-        if (username == null || password == null) {
-            return false;
-        }
-
-        ClientAuthenticator authenticator = null;
-
-        // now go through the progression of mechanisms we support, from the
-        // most secure to the
-        // least secure.
-
-        if (supportsAuthentication(AUTHENTICATION_DIGESTMD5)) {
-            authenticator = new DigestMD5Authenticator(host, username, password, getSASLRealm());
-        } else if (supportsAuthentication(AUTHENTICATION_CRAMMD5)) {
-            authenticator = new CramMD5Authenticator(username, password);
-        } else if (supportsAuthentication(AUTHENTICATION_LOGIN)) {
-            authenticator = new LoginAuthenticator(username, password);
-        } else if (supportsAuthentication(AUTHENTICATION_PLAIN)) {
-            authenticator = new PlainAuthenticator(username, password);
-        } else {
-            // can't find a mechanism we support in common
-            return false;
-        }
-
-        if (debug) {
-            debugOut("Authenticating for user: " + username + " using " + authenticator.getMechanismName());
-        }
-
-        // if the authenticator has some initial data, we compose a command
-        // containing the initial data.
-        if (authenticator.hasInitialResponse()) {
-            StringBuffer command = new StringBuffer();
-            // the auth command initiates the handshaking.
-            command.append("AUTH ");
-            // and tell the server which mechanism we're using.
-            command.append(authenticator.getMechanismName());
-            command.append(" ");
-            // and append the response data
-            command.append(new String(Base64.encode(authenticator.evaluateChallenge(null))));
-            // send the command now
-            sendLine(command.toString());
-        }
-        // we just send an auth command with the command type.
-        else {
-            StringBuffer command = new StringBuffer();
-            // the auth command initiates the handshaking.
-            command.append("AUTH ");
-            // and tell the server which mechanism we're using.
-            command.append(authenticator.getMechanismName());
-            // send the command now
-            sendLine(command.toString());
-        }
-
-        // now process the challenge sequence. We get a 235 response back when
-        // the server accepts the
-        // authentication, and a 334 indicates we have an additional challenge.
-        while (true) {
-            // get the next line, and if it is an error response, return now.
-            SMTPReply line;
-            try {
-                line = new SMTPReply(receiveLine());
-            } catch (MalformedSMTPReplyException e) {
-                throw new MessagingException(e.toString());
-            } catch (MessagingException e) {
-                throw e;
-            }
-
-            // if we get a completion return, we've passed muster, so give an
-            // authentication response.
-            if (line.getCode() == AUTHENTICATION_COMPLETE) {
-                if (debug) {
-                    debugOut("Successful SMTP authentication");
-                }
-                return true;
-            }
-            // we have an additional challenge to process.
-            else if (line.getCode() == AUTHENTICATION_CHALLENGE) {
-                // Does the authenticator think it is finished? We can't answer
-                // an additional challenge,
-                // so fail this.
-                if (authenticator.isComplete()) {
-                    return false;
-                }
-
-                // we're passed back a challenge value, Base64 encoded.
-                byte[] challenge = Base64.decode(line.getMessage().getBytes());
-
-                // have the authenticator evaluate and send back the encoded
-                // response.
-                sendLine(new String(Base64.encode(authenticator.evaluateChallenge(challenge))));
-            }
-            // completion or challenge are the only responses we know how to
-            // handle. Anything else must
-            // be a failure.
-            else {
-                if (debug) {
-                    debugOut("Authentication failure " + line);
-                }
-                return false;
-            }
-        }
-    }
-
-    /**
-     * Simple holder class for the address/send status duple, as we can have
-     * mixed success for a set of addresses and a message
-     */
-    public class SendStatus {
-        public final static int SUCCESS = 0;
-
-        public final static int INVALID_ADDRESS = 1;
-
-        public final static int SEND_FAILURE = 2;
-
-        public final static int GENERAL_ERROR = 3;
-
-        // the status type of the send operation.
-        int status;
-
-        // the address associated with this status
-        InternetAddress address;
-
-        // the command string send to the server.
-        String cmd;
-
-        // the reply from the server.
-        SMTPReply reply;
-
-        /**
-         * Constructor for a SendStatus item.
-         *
-         * @param s
-         *            The status type.
-         * @param a
-         *            The address this is the status for.
-         * @param c
-         *            The command string associated with this status.
-         * @param r
-         *            The reply information from the server.
-         */
-        public SendStatus(int s, InternetAddress a, String c, SMTPReply r) {
-            this.cmd = c;
-            this.status = s;
-            this.address = a;
-            this.reply = r;
-        }
-
-        /**
-         * Get the status information for this item.
-         *
-         * @return The current status code.
-         */
-        public int getStatus() {
-            return this.status;
-        }
-
-        /**
-         * Retrieve the InternetAddress object associated with this send
-         * operation.
-         *
-         * @return The associated address object.
-         */
-        public InternetAddress getAddress() {
-            return this.address;
-        }
-
-        /**
-         * Retrieve the reply information associated with this send operati
-         *
-         * @return The SMTPReply object received for the operation.
-         */
-        public SMTPReply getReply() {
-            return reply;
-        }
-
-        /**
-         * Get the command string sent for this send operation.
-         *
-         * @return The command string for the MAIL TO command sent to the
-         *         server.
-         */
-        public String getCommand() {
-            return cmd;
-        }
-
-        /**
-         * Get an exception object associated with this send operation. There is
-         * a mechanism for reporting send success via a send operation, so this
-         * will be either a success or failure exception.
-         *
-         * @param reportSuccess
-         *            Indicates if we want success operations too.
-         *
-         * @return A newly constructed exception object.
-         */
-        public MessagingException getException(boolean reportSuccess) {
-            if (status != SUCCESS) {
-                return new SMTPAddressFailedException(address, cmd, reply.getCode(), reply.getMessage());
-            } else {
-                if (reportSuccess) {
-                    return new SMTPAddressSucceededException(address, cmd, reply.getCode(), reply.getMessage());
-                }
-            }
-            return null;
-        }
-    }
-
-    /**
-     * Internal debug output routine.
-     *
-     * @param value
-     *            The string value to output.
-     */
-    protected void debugOut(String message) {
-        debugStream.println("SMTPTransport DEBUG: " + message);
-    }
-
-    /**
-     * Internal debugging routine for reporting exceptions.
-     *
-     * @param message
-     *            A message associated with the exception context.
-     * @param e
-     *            The received exception.
-     */
-    protected void debugOut(String message, Throwable e) {
-        debugOut("Received exception -> " + message);
-        debugOut("Exception message -> " + e.getMessage());
-        e.printStackTrace(debugStream);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPTransportException.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPTransportException.java
deleted file mode 100644
index 636bbde..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/transport/smtp/SMTPTransportException.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.transport.smtp;
-
-/**
- * General purpose Exception
- * 
- * @version $Id$
- */
-class SMTPTransportException extends Exception {
-
-    SMTPTransportException() {
-        super();
-    }
-
-    SMTPTransportException(String s) {
-        super(s);
-    }
-
-    SMTPTransportException(String s, Exception t) {
-        super(s, t);
-    }
-
-    SMTPTransportException(Exception t) {
-        super("SMTP Transport error", t);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/util/MIMEOutputStream.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/util/MIMEOutputStream.java
deleted file mode 100644
index 0409331..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/util/MIMEOutputStream.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.util;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- * An implementation of an OutputStream that performs MIME linebreak
- * canonicalization and "byte-stuff" so that data content does not get mistaken
- * for a message data-end marker (CRLF.CRLF)l
- * 
- * @version $Rev$ $Date$
- */
-public class MIMEOutputStream extends OutputStream {
-
-    // the wrappered output stream.
-    protected OutputStream out;
-
-    // last character we handled...used to recongnize line breaks.
-    protected int lastWrite = -1;
-
-    // a flag to indicate we've just processed a line break. This is used for
-    // byte stuffing purposes. This
-    // is initially true, because if the first character of the content is a
-    // period, we need to byte-stuff
-    // immediately.
-    protected boolean atLineBreak = true;
-
-    /**
-     * Create an output stream that writes to the target output stream.
-     * 
-     * @param out
-     *            The wrapped output stream.
-     */
-    public MIMEOutputStream(OutputStream out) {
-        this.out = out;
-    }
-
-    // in order for this to work, we only need override the single character
-    // form, as the others
-    // funnel through this one by default.
-    public void write(int ch) throws IOException {
-        // if this is a CR character, always write out a full sequence, and
-        // remember that we just did this.
-        if (ch == '\r') {
-            out.write((byte) '\r');
-            out.write((byte) '\n');
-            // we've just taken a break;
-            atLineBreak = true;
-        }
-        // if this is a new line, then we need to determine if this is a loner
-        // or part of a CRLF sequence.
-        else if (ch == '\n') {
-            // is this a lone ranger?
-            if (lastWrite != '\r') {
-                // write the full CRLF sequence.
-                out.write((byte) '\r');
-                out.write((byte) '\n');
-            }
-            // regardless of whether we wrote something or not, we're still at a
-            // line break.
-            atLineBreak = true;
-        }
-        // potential byte-stuffing situation?
-        else if (ch == '.') {
-            // ok, this is a potential stuff situation. Did we just have a line
-            // break? Double up the character.
-            if (atLineBreak) {
-                out.write('.');
-            }
-            out.write('.');
-            atLineBreak = false;
-        } else {
-            // just write this out and flip the linebreak flag.
-            out.write(ch);
-            atLineBreak = false;
-        }
-        // remember this last one for CRLF tracking purposes.
-        lastWrite = ch;
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/util/TraceInputStream.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/util/TraceInputStream.java
deleted file mode 100644
index 39ee6dd..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/util/TraceInputStream.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.util;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import org.apache.geronimo.mail.util.QuotedPrintableEncoderStream;
-
-/**
- * @version $Rev$ $Date$
- */
-public class TraceInputStream extends FilterInputStream {
-    // the current debug setting
-    protected boolean debug = false;
-
-    // the target trace output stream.
-    protected OutputStream traceStream;
-
-    /**
-     * Construct a debug trace stream.
-     * 
-     * @param in
-     *            The source input stream.
-     * @param traceStream
-     *            The side trace stream to which trace data gets written.
-     * @param encode
-     *            Indicates whether we wish the Trace data to be Q-P encoded.
-     */
-    public TraceInputStream(InputStream in, OutputStream traceStream, boolean debug, boolean encode) {
-        super(in);
-        this.debug = debug;
-        if (encode) {
-            this.traceStream = new QuotedPrintableEncoderStream(traceStream);
-        } else {
-            this.traceStream = traceStream;
-        }
-    }
-
-    /**
-     * Set the current setting of the debug trace stream debug flag.
-     * 
-     * @param d
-     *            The new debug flag settings.
-     */
-    public void setDebug(boolean d) {
-        debug = d;
-    }
-
-    /**
-     * Reads up to <code>len</code> bytes of data from this input stream into
-     * an array of bytes. This method blocks until some input is available.
-     * <p>
-     * This method simply performs <code>in.read(b, off, len)</code> and
-     * returns the result.
-     * 
-     * @param b
-     *            the buffer into which the data is read.
-     * @param off
-     *            the start offset of the data.
-     * @param len
-     *            the maximum number of bytes read.
-     * @return the total number of bytes read into the buffer, or
-     *         <code>-1</code> if there is no more data because the end of the
-     *         stream has been reached.
-     * @exception IOException
-     *                if an I/O error occurs.
-     * @see java.io.FilterInputStream#in
-     */
-    public int read(byte b[], int off, int len) throws IOException {
-        int count = in.read(b, off, len);
-        if (debug && count > 0) {
-            traceStream.write(b, off, count);
-        }
-        return count;
-    }
-
-    /**
-     * Reads the next byte of data from this input stream. The value byte is
-     * returned as an <code>int</code> in the range <code>0</code> to
-     * <code>255</code>. If no byte is available because the end of the
-     * stream has been reached, the value <code>-1</code> is returned. This
-     * method blocks until input data is available, the end of the stream is
-     * detected, or an exception is thrown.
-     * <p>
-     * This method simply performs <code>in.read()</code> and returns the
-     * result.
-     * 
-     * @return the next byte of data, or <code>-1</code> if the end of the
-     *         stream is reached.
-     * @exception IOException
-     *                if an I/O error occurs.
-     * @see java.io.FilterInputStream#in
-     */
-    public int read() throws IOException {
-        int b = in.read();
-        if (debug) {
-            traceStream.write(b);
-        }
-        return b;
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/util/TraceOutputStream.java b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/util/TraceOutputStream.java
deleted file mode 100644
index 94cebd8..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/java/org/apache/geronimo/javamail/util/TraceOutputStream.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.geronimo.javamail.util;
-
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.apache.geronimo.mail.util.QuotedPrintableEncoderStream;
-
-/**
- * @version $Rev$ $Date$
- */
-public class TraceOutputStream extends FilterOutputStream {
-    // the current debug setting
-    protected boolean debug = false;
-
-    // the target trace output stream.
-    protected OutputStream traceStream;
-
-    /**
-     * Construct a debug trace stream.
-     *
-     * @param out
-     *            The target out put stream.
-     * @param traceStream
-     *            The side trace stream to which trace data gets written.
-     * @param encode
-     *            Indicates whether we wish the Trace data to be Q-P encoded.
-     */
-    public TraceOutputStream(OutputStream out, OutputStream traceStream, boolean debug, boolean encode) {
-        super(out);
-        this.debug = debug;
-        if (encode) {
-            this.traceStream = new QuotedPrintableEncoderStream(traceStream);
-        } else {
-            this.traceStream = traceStream;
-        }
-    }
-
-    /**
-     * Set the current setting of the debug trace stream debug flag.
-     *
-     * @param d
-     *            The new debug flag settings.
-     */
-    public void setDebug(boolean d) {
-        debug = d;
-    }
-
-
-    /**
-     * Writes the specified <code>byte</code> to this output stream.
-     * <p>
-     * The <code>write</code> method of <code>FilterOutputStream</code>
-     * calls the <code>write</code> method of its underlying output stream,
-     * that is, it performs <tt>out.write(b)</tt>.
-     * <p>
-     * Implements the abstract <tt>write</tt> method of <tt>OutputStream</tt>.
-     *
-     * @param b
-     *            the <code>byte</code>.
-     * @exception IOException
-     *                if an I/O error occurs.
-     */
-    public void write(int b) throws IOException {
-        if (debug) {
-            traceStream.write(b);
-        }
-        super.write(b);
-    }
-}
diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/resources/META-INF/javamail.default.address.map b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/resources/META-INF/javamail.default.address.map
deleted file mode 100644
index 3bba278..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/resources/META-INF/javamail.default.address.map
+++ /dev/null
@@ -1,34 +0,0 @@
-##

-## Licensed to the Apache Software Foundation (ASF) under one

-## or more contributor license agreements.  See the NOTICE file

-## distributed with this work for additional information

-## regarding copyright ownership.  The ASF licenses this file

-## to you under the Apache License, Version 2.0 (the

-## "License"); you may not use this file except in compliance

-## with the License.  You may obtain a copy of the License at

-##

-##  http://www.apache.org/licenses/LICENSE-2.0

-##

-## Unless required by applicable law or agreed to in writing,

-## software distributed under the License is distributed on an

-## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

-## KIND, either express or implied.  See the License for the

-## specific language governing permissions and limitations

-## under the License.

-##

-

-##

-## $Rev: 437934 $ $Date: 2006-08-28 20:27:42 -0700 (Mon, 28 Aug 2006) $

-##

-

-#

-# This file configures the default behaviour of JavaMail. DO NOT EDIT.

-# Create a new file /META-INF/javamail.address.map and put

-# the same format lines in there.

-#

-# Note that you can't override these defaults, merely add to them.

-#

-# $Rev: 351866 $ $Date: 2005-12-02 20:12:14 -0500 (Fri, 02 Dec 2005) $

-#

-rfc822=smtp

-news=nntp

diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/resources/META-INF/javamail.default.providers b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/resources/META-INF/javamail.default.providers
deleted file mode 100644
index fb8ee77..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/main/resources/META-INF/javamail.default.providers
+++ /dev/null
@@ -1,38 +0,0 @@
-##

-## Licensed to the Apache Software Foundation (ASF) under one

-## or more contributor license agreements.  See the NOTICE file

-## distributed with this work for additional information

-## regarding copyright ownership.  The ASF licenses this file

-## to you under the Apache License, Version 2.0 (the

-## "License"); you may not use this file except in compliance

-## with the License.  You may obtain a copy of the License at

-##

-##  http://www.apache.org/licenses/LICENSE-2.0

-##

-## Unless required by applicable law or agreed to in writing,

-## software distributed under the License is distributed on an

-## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

-## KIND, either express or implied.  See the License for the

-## specific language governing permissions and limitations

-## under the License.

-##

-

-##

-## $Rev: 437934 $ $Date: 2006-08-28 20:27:42 -0700 (Mon, 28 Aug 2006) $

-##

-

-#

-# This file configures the default behaviour of JavaMail. DO NOT EDIT.

-# Create a new file /META-INF/javamail.providers and put

-# the same format lines in there.

-#

-# Note that you can't override these defaults, merely add to them.

-#

-# $Rev: 398634 $ $Date: 2006-05-01 12:56:06 -0400 (Mon, 01 May 2006) $

-#

-protocol=smtp; type=transport; class=org.apache.geronimo.javamail.transport.smtp.SMTPTransport; vendor=Apache Software Foundation; version=1.0

-protocol=smtps; type=transport; class=org.apache.geronimo.javamail.transport.smtp.SMTPTSransport; vendor=Apache Software Foundation; version=1.0

-protocol=nntp-post; type=transport; class=org.apache.geronimo.javamail.transport.nntp.NNTPTransport; vendor=Apache Software Foundation; version=1.0

-protocol=nntp; type=store; class=org.apache.geronimo.javamail.store.nntp.NNTPStore; vendor=Apache Software Foundation; version=1.0

-protocol=pop3; type=store; class=org.apache.geronimo.javamail.store.pop3.POP3Store; vendor=Apache Software Foundation; version=1.0

-

diff --git a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/site/site.xml b/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/site/site.xml
deleted file mode 100644
index 80f99dd..0000000
--- a/geronimo-javamail_1.4/geronimo-javamail_1.4_provider/src/site/site.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-    
-     http://www.apache.org/licenses/LICENSE-2.0
-    
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!-- $Rev$ $Date$ -->
-
-<project name="${project.name}">
-    
-    <body>
-        
-        ${parentProject}
-        
-        ${modules}
-        
-        ${reports}
-        
-    </body>
-
-</project>
-
-
diff --git a/geronimo-javamail_1.4/pom.xml b/geronimo-javamail_1.4/pom.xml
deleted file mode 100644
index abf9d30..0000000
--- a/geronimo-javamail_1.4/pom.xml
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one
-    or more contributor license agreements.  See the NOTICE file
-    distributed with this work for additional information
-    regarding copyright ownership.  The ASF licenses this file
-    to you under the Apache License, Version 2.0 (the
-    "License"); you may not use this file except in compliance
-    with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing,
-    software distributed under the License is distributed on an
-    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, either express or implied.  See the License for the
-    specific language governing permissions and limitations
-    under the License.
--->
-
-<!-- $Rev$ $Date$ -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.geronimo.genesis.config</groupId>
-        <artifactId>project-config</artifactId>
-        <version>1.1</version>
-    </parent>
-
-    <groupId>org.apache.geronimo.javamail</groupId>
-    <artifactId>javamail-1.4</artifactId>
-    <name>Geronimo JavaMail</name>
-    <packaging>pom</packaging>
-
-    <version>1.1-SNAPSHOT</version>
-
-    <description>
-        Geronimmo JavaMail provider.
-    </description>
-
-    <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/geronimo/javamail/trunk/geronimo-javamail_1.4/</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/geronimo/javamail/trunkgeronimo-javamail_1.4//</developerConnection>
-        <url>http://svn.apache.org/viewvc/geronimo/javamail/trunk/geronimo-javamail_1.4/</url>
-    </scm>
-
-    <dependencyManagement>
-        <dependencies>
-
-            <dependency>
-                <groupId>org.apache.geronimo.specs</groupId>
-                <artifactId>geronimo-activation_1.1_spec</artifactId>
-                <version>1.0-SNAPSHOT</version>
-            </dependency>
-
-            <dependency>
-                <groupId>org.apache.geronimo.specs</groupId>
-                <artifactId>geronimo-javamail_1.4_spec</artifactId>
-                <version>1.0-SNAPSHOT</version>
-            </dependency>
-
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.4</source>
-                    <target>1.4</target>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-idea-plugin</artifactId>
-                <configuration>
-                    <jdkName>1.4</jdkName>
-                    <linkModules>true</linkModules>
-                </configuration>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-release-plugin</artifactId>
-                <configuration>
-                    <tagBase>https://svn.apache.org/repos/asf/geronimo/javamail/tags</tagBase>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-    <repositories>
-        <!--
-        NOTE: The default repositories are picked up by Genesis, but need to
-              specify where Genesis lives to pick it up + any additional repositories.
-        -->
-
-        <repository>
-            <id>apache-snapshots</id>
-            <name>Apache Snapshots Repository</name>
-            <url>http://people.apache.org/repo/m2-snapshot-repository</url>
-            <layout>default</layout>
-            <snapshots>
-                <enabled>true</enabled>
-                <updatePolicy>daily</updatePolicy>
-                <checksumPolicy>ignore</checksumPolicy>
-            </snapshots>
-            <releases>
-                <enabled>false</enabled>
-            </releases>
-        </repository>
-    </repositories>
-
-    <distributionManagement>
-        <site>
-            <id>geronimo-website</id>
-            <url>scp://people.apache.org/www/geronimo.apache.org/maven/javamail</url>
-        </site>
-    </distributionManagement>
-
-    <profiles>
-        <profile>
-            <id>default</id>
-
-            <activation>
-                <activeByDefault>true</activeByDefault>
-            </activation>
-
-            <modules>
-                <module>geronimo-javamail_1.4_provider</module>
-                <module>geronimo-javamail_1.4_mail</module>
-            </modules>
-        </profile>
-    </profiles>
-
-</project>