<?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.    
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia at Apr 19, 2012 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>
     Source Code</title>
    <style type="text/css" media="all">
      @import url("./css/james.css");
      @import url("./css/maven-base.css");
      @import url("./css/maven-theme.css");
      @import url("./css/site.css");
      @import url("./js/jquery/css/custom-theme/jquery-ui-1.8.5.custom.css");
      @import url("./js/jquery/css/print.css");
      @import url("./js/fancybox/jquery.fancybox-1.3.4.css");
    </style>
    <script type="text/javascript" src="./js/jquery/js/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="./js/jquery/js/jquery-ui-1.8.5.custom.min.js"></script>
    <script type="text/javascript" src="./js/fancybox/jquery.fancybox-1.3.4.js"></script>
    <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
    <meta name="Date-Revision-yyyymmdd" content="20120419" />
    <meta http-equiv="Content-Language" content="en" />
                                                    
<link title="DOAP" rel="meta" type="application/rdf+xml" href="http://james.apache.org//doap_james-project.rdf"/>
                      
          <!-- Google Analytics -->
    <script type="text/javascript">
    
      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-1384591-1']);
      _gaq.push(['_trackPageview']);

      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script').item(0); s.parentNode.insertBefore(ga, s);
      })();

    </script>
    </head>
  <body class="composite">
    <div id="banner">
                                      <a href="../server/index.html" id="bannerLeft" title="james-server-logo.gif">
              
                                                                            
        <img src="images/logos/james-server-logo.gif" alt="James Server" />
                </a>
                              <a href="http://www.apache.org/index.html" id="bannerRight">
              
                                        
        <img src="images/logos/asf-logo-reduced.gif" alt="The Apache Software Foundation" />
                </a>
            <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="breadcrumbs">
            
                
                <div class="xleft">
        <span id="publishDate">Last Published: 2012-04-19</span>
                      </div>
            <div class="xright">                    <a href="../index.html" title="Home">Home</a>
            |
                        <a href="../server/index.html" title="Server">Server</a>
            |
                        <a href="../hupa/index.html" title="Hupa">Hupa</a>
            |
                        <a href="index.html" title="Protocols">Protocols</a>
            |
                        <a href="../imap/index.html" title="IMAP">IMAP</a>
            |
                        <a href="../mailet/index.html" title="Mailets">Mailets</a>
            |
                        <a href="../mailbox/index.html" title="Mailbox">Mailbox</a>
            |
                        <a href="../mime4j/index.html" title="Mime4J">Mime4J</a>
            |
                        <a href="../jsieve/index.html" title="jSieve">jSieve</a>
            |
                        <a href="../jspf/index.html" title="jSPF">jSPF</a>
            |
                        <a href="../jdkim/index.html" title="jDKIM">jDKIM</a>
            |
                        <a href="../mpt/index.html" title="MPT">MPT</a>
            |
                        <a href="../postage/index.html" title="Postage">Postage</a>
              
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="leftColumn">
      <div id="navcolumn">
             
                
                                <h5>Documentation</h5>
                  <ul>
                  <li class="none">
                          <a href="index.html" title="Introduction">Introduction</a>
            </li>
                  <li class="none">
                          <a href="smtp.html" title="SMTP">SMTP</a>
            </li>
                  <li class="none">
                          <a href="pop3.html" title="POP3">POP3</a>
            </li>
                  <li class="none">
                          <a href="imap4.html" title="IMAP4">IMAP4</a>
            </li>
                  <li class="none">
            <strong>Source Code</strong>
          </li>
          </ul>
                       <h5>References</h5>
                  <ul>
                  <li class="none">
                          <a href="apidocs/index.html" title="Javadoc">Javadoc</a>
            </li>
                  <li class="none">
                          <a href="https://issues.apache.org/jira/browse/PROTOCOLS" title="Issue Tracker">Issue Tracker</a>
            </li>
          </ul>
                       <h5>About James</h5>
                  <ul>
                  <li class="none">
                          <a href="../index.html" title="Overview">Overview</a>
            </li>
                  <li class="none">
                          <a href="../newsarchive.html" title="News">News</a>
            </li>
                  <li class="none">
                          <a href="../mail.html" title="Mailing Lists">Mailing Lists</a>
            </li>
                  <li class="none">
                          <a href="../contribute.html" title="Contributing">Contributing</a>
            </li>
                  <li class="none">
                          <a href="../guidelines.html" title="Guidelines">Guidelines</a>
            </li>
                  <li class="none">
                          <a href="http://wiki.apache.org/james" title="Wiki">Wiki</a>
            </li>
                  <li class="none">
                          <a href="../team-list.html" title="Who We Are">Who We Are</a>
            </li>
                  <li class="none">
                          <a href="../license.html" title="License">License</a>
            </li>
          </ul>
                       <h5>Download</h5>
                  <ul>
                  <li class="none">
                          <a href="../download.cgi" title="Releases">Releases</a>
            </li>
                  <li class="none">
                          <a href="https://repository.apache.org/content/repositories/snapshots/org/apache/james/" title=""></a>
            </li>
          </ul>
        <h5>Apache Software Foundation</h5>
  <ul>
    <li>
      <strong>
        <a title="ASF" href="http://www.apache.org/">ASF</a>
      </strong>
    </li>
    <li>
      <a title="Get Involved" href="http://www.apache.org/foundation/getinvolved.html">Get Involved</a>
    </li>
    <li>
      <a title="FAQ" href="http://www.apache.org/foundation/faq.html">FAQ</a>
    </li>
    <li>
      <a title="License" href="http://www.apache.org/licenses/" >License</a>
    </li>
    <li>
      <a title="Sponsorship" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
    </li>
    <li>
      <a title="Thanks" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
    </li>
    <li>
      <a title="Security" href="http://www.apache.org/security/">Security</a>
    </li>
  </ul>
                       <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
        <img class="poweredBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
      </a>
                   
                
            </div>
    </div>
    <div id="bodyColumn">
      <div id="contentBox">
        <!-- 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. -->

  

  <div class="section"><h2>Get Source Code<a name="Get_Source_Code"></a></h2>
    <div class="section"><h3>Anonymous Access<a name="Anonymous_Access"></a></h3>
      <p>The source can be checked out anonymously from SVN with the following command.</p>
      <p><tt>$ svn checkout http://svn.apache.org/repos/asf/james/protocols/trunk james-protocols</tt></p>
    </div>
    <div class="section"><h3>Developer Access<a name="Developer_Access"></a></h3>
      <p>Everyone can access the Subversion repository via HTTP, but Committers must checkout the Subversion repository via HTTPS.</p>
      <p><tt>$ svn checkout https://svn.apache.org/repos/asf/james/protocols/trunk james-protocols</tt></p>
    </div>
  </div>

  <div class="section"><h2>Build Source Code<a name="Build_Source_Code"></a></h2>
    <p>You can read a tutorial on how to build Apache James Server on <a class="externalLink" href="http://james.apache.org/server/3/dev-build.html">http://james.apache.org/server/3/dev-build.html</a>.</p>
    <p>The SVN URLs and the project names must be adapted, but the requirements and process are the same and you can inspire
       from the build the Apache James IMAP libraries.</p>
  </div>

  <div class="section"><h2>Source Organization<a name="Source_Organization"></a></h2>
    <div class="section"><h3>Modules<a name="Modules"></a></h3>
      <div style="float:left; margin=4px;">
        <img src="images/uml/org.apache.james.protocols-package.png" alt="" />
      </div>
    </div>
    <div style="clear:both; float:none;" />
    <div class="section"><h3>James Protocols API<a name="James_Protocols_API"></a></h3>
      <p><tt>apache-james-protocols-api</tt> contains the interfaces, exceptions and Constants needed by the other projects.</p>
    </div>
    <div class="section"><h3>James Protocols Implementation<a name="James_Protocols_Implementation"></a></h3>
      <p><tt>apache-james-protocols-impl</tt> provides common services that can be used by any mail protocol.</p>
    </div>
    <div class="section"><h3>James Protocols SMTP<a name="James_Protocols_SMTP"></a></h3>
      <p><tt>apache-james-protocols-smtp</tt> implements the SMTP protocols with <a class="externalLink" href="http://james.apache.org/server/3/dev-extend-smtp-hook.html">hooks</a> for extensions.</p>
    </div>
  </div>

  <div class="section"><h2>IMAP4 Source Code<a name="IMAP4_Source_Code"></a></h2>
    <div class="section"><h3>Modules<a name="Modules"></a></h3>
      <div style="float:left; margin:4px;">
        <img src="images/uml/org.apache.james.imap-withtest-package.png" alt="" />
      </div>
    </div>
    <div style="clear:both; float:none;" />
    <div class="section"><h3>Apache James IMAP API<a name="Apache_James_IMAP_API"></a></h3>
      <p><tt>apache-james-imap-api</tt> contains the interfaces, exceptions and Constants needed by the other projects.</p>
      <p>The following diagram represents some key (not all) interfaces of the IMAP API project.</p>
<!-- Add an updated image... -->
<!-- <img src="images/uml/org.apache.james.imap.api.png"/> -->
    </div>
    <div class="section"><h3>Apache James IMAP Message<a name="Apache_James_IMAP_Message"></a></h3>
      <p><tt>apache-james-imap-message</tt> allows to encode, decode and structure the IMAP requests and responses.</p>
      <p>It will provide among other the ImapRequestMessage and ImapResponseMessage implementation to be processed
         by the apache-james-imap-processor project.</p>
    </div>
    <div class="section"><h3>Apache James IMAP Processor<a name="Apache_James_IMAP_Processor"></a></h3>
      <p><tt>apache-james-imap-processor</tt> implements the Chain Of Responsibility design pattern.</p>
      <p>ImapRequestMessage and ImapResponder will be passed to the list of Processors that 
         will execute doProcess if applicable.</p>
    </div>
    <div class="section"><h3>Apache James Integeration Test<a name="Apache_James_Integeration_Test"></a></h3>
      <p>A <a class="externalLink" href="https://svn.apache.org/repos/asf/james/mailbox-integration-tester/trunk/">specific integration project</a> is 
      responsible to test the IMAP protocol in conjunction with the <a class="externalLink" href="http://james.apache.org/mailbox">Apache James mailbox</a> components.</p>
    </div>
    
  </div>
    



      </div>
    </div>
    <div class="clear">
      <hr/>
    </div>
    <div id="footer">
      <div class="xright">Copyright &#169;                    2010-2012
                        <a href="http://www.apache.org/">The Apache Software Foundation</a>.
            All Rights Reserved.      
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
  </body>
</html>
