<?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 document PUBLIC "-//APACHE//DTD Documentation V2.0//EN"
"http://forrest.apache.org/dtd/document-v20.dtd">
<document>
  <header>
    <title>Welcome to Apache Droids</title>
  </header>
  <body>
    <section>
      <title>News</title>
      <section>
        <title>09 February 2009 - Lucene at ApacheCon Europe 2009 in Amsterdam</title>
        <p>
          <a title="ApacheCon EU 2009"
            href="http://www.eu.apachecon.com/c/aceu2009/">
            <img src="http://www.eu.apachecon.com/page_attachments/0000/0115/125x125_basic.gif"
              class="float-right" alt="ApacheCon EU 2009 Logo"/>
          </a>
          Lucene will be extremely well represented at
          <a href="http://us.apachecon.com/c/acus2008/">ApacheCon US 2009</a> in
          Amsterdam, Netherlands this March 23-27, 2009: </p>
        <ul>
          <li>
            <a href="http://eu.apachecon.com/c/aceu2009/sessions/197">Lucene
              Boot Camp</a> - A two day training session, March 23 &amp; 24th</li>
          <li>
            <a href="http://eu.apachecon.com/c/aceu2009/sessions/201">Solr Boot
              Camp</a> - A one day training session, March 24th</li>
          <li>
            <a href="http://eu.apachecon.com/c/aceu2009/sessions/136">
              Introducing Apache Mahout</a> - Grant Ingersoll. March 25th @ 10:30</li>
          <li>
            <a href="http://eu.apachecon.com/c/aceu2009/sessions/137">
              Lucene/Solr Case Studies</a> - Erik Hatcher. March 25th @ 11:30</li>
          <li>
            <a href="http://eu.apachecon.com/c/aceu2009/sessions/138">Advanced
              Indexing Techniques with Apache Lucene</a> - Michael Busch. March 25th @
            14:00</li>
          <li>
            <a href="http://eu.apachecon.com/c/aceu2009/sessions/251">Apache
              Solr - A Case Study</a> - Uri Boness. March 26th @ 17:30</li>
          <li>
            <a href="http://eu.apachecon.com/c/aceu2009/sessions/250">Best of breed
              - httpd, forrest, solr and droids</a> - Thorsten Scherler. March 27th @
            17:30</li>
          <li>
            <a href="http://eu.apachecon.com/c/aceu2009/sessions/165">Apache
              Droids - an intelligent standalone robot framework</a> - Thorsten Scherler.
            March 26th @ 15:00</li>
        </ul>
      </section>
    </section>
    <section id="what">
      <title>What is this?</title>
      <p>Droids aims to be an intelligent standalone robot
        framework that allows to create and extend existing droids
        (robots). In the future it will offer an administration
        application to manage and controll the different droids.</p>
      <p>Droids makes it very easy to extend existing robots or
        write a new one from scratch, which can automatically seek out
        relevant online information based on the user's specifications.</p>
      <p>Droids (plural) is not designed for a special usecase, it is a framework: <strong>Take what
        you need, do what you want.</strong></p>
      <p>Droids offers you following the components so far:</p>
      <ul>
        <li>Queue, a queue is the data structure where the different tasks are waiting for
          service.</li>
        <li>Protocol, the protocol interface is a wrapper to hide the underlying
          implementation of the communication at protocol level.</li>
        <li>Parser -> Apache Tika, the parser component is just a wrapper for tika
          since it offers everything we need. No need to duplicate the effort. The Paser
          component parses different input types to SAX events.</li>
        <li>Handler, a handler is a component that uses the original stream and/or the parse
          (ContentHandler coming from Tika) and the url to invoke arbitrary business logic
          on the objects. Unless like the other components different handler can be applied
          on the stream/parse</li>
      </ul>
      <p>A Droid (singular) however is all about <strong>ONE special usecase</strong>. For example the
        helloCrawler is a wget style crawler. Meaning you go to a page extract the links and
        save the page afterward to the file system. The focus of the helloCrawler is this
        special usecase and to solve it hello uses different components.</p>
      <p>In the future there could evolve different subprojects that are providing
        specialist components for a special use case. However if components get used in
        different usecases they should be considered common. </p>
    </section>
    <section>
      <title>Install</title>
      <p>Since Droids is ATM developing very fast we decided to maintain our documentation in
        the
        <a href="ext:wiki">wiki</a> to allow all user to participate. Please see our
        <a href="ext:wiki/install">installation guide</a> on how to get started with droids.</p>
    </section>
    <section>
      <title>Feature list</title>
      <ul>
        <li>
          <strong>Customizable.</strong>
          Completely controlled by its default.properties which can be
          easily be overridden by creating a file build.properties and
          overriding the default properties that are needed.
        </li>
        <li>
          <strong>Multi-threaded.</strong>
          The architecture is that a robot (e.g. HelloCrawler controls
          various worker (threads) that are doing the actual work.
        </li>
        <li>
          <strong>Honor robots.txt.</strong>
          By default droids honors the robot.txt. However you can turn
          on the hostile mode of a droid
          (droids.protocol.http.force=true).
        </li>
        <li>
          <strong>Crawl throttling.</strong>
          You can configure the amount of concurrent threads that a
          droid can distribute to their workers (droids.maxThreads=5)
          and the delay time between the requests
          (droids.delay.request=500). You can use one of the different
          delay components:
          <ul>
            <li>SimpleDelayTimer</li>
            <li>RandomDelayTimer</li>
            <li>GaussianRandomDelayTime</li>
          </ul>
        </li>
        <li>
          <strong>Spring based - dynamics.</strong>
          The properties mentioned above get picked up by the build
          process which inject them in the spring configuration.
        </li>
        <li>
          <strong>Extensible - dynamics.</strong>
          The spring configuration makes usage of the
          cocoon-configurator and its dynamic registry support (making
          extending droids a pleasure).
        </li>
      </ul>
    </section>
    <section>
      <title>Architecture</title>
      <p>The following graph shows the basic architecture of droids
        with the help of the first implementation (helloCrawler).</p>
      <figure src="images/droidsOverview.png" alt="Overview"
        width="400" />
    </section>
    <section>
      <title>Why was it created?</title>
      <p>Mainly because of personal curiosity and an usecase: The background of this work is
        that Cocoon trunk does not provide a crawler anymore and Forrest is based on it,
        meaning we cannot update anymore till we found a crawler replacement. Getting more
        involved in Solr and Nutch we saw request for a generic standalone crawler.</p>
    </section>
    <section>
      <title>Requirements</title>
      <ul>
        <li>JDK 1.6 or higher</li>
      </ul>
    </section>
    <warning label="HEADSUP">!!! Please ONLY crawl localhost NEVER a
      internet site when you test the first time!!! You will need to
      adjust the urlfilters to limit loops.</warning>
    <section>
      <title>Links / related projects</title>
      <ul>
        <li>
          <a href="http://lucene.apache.org/nutch/">Nutch web-search software</a>
        </li>
        <li>
          <a href="http://www.robotstxt.org/wc/robots.html">The Web Robots Pages</a>
        </li>
        <li>
          <a
            href="http://www.andreas-hess.info/programming/webcrawler/index.html"> Programming webcrawler</a>
        </li>
        <li>
          <a
            href="http://www.andreas-hess.info/programming/webcrawler/index.html"> Writing a Web Crawler in the Java Programming Language</a>
        </li>
        <li>
          <a
            href="http://svn.apache.org/repos/asf/httpcomponents/norobots-rfc/trunk/src/java/org/apache/http/norobots/"> Norbert</a>
        </li>
        <li>
          <a
            href="http://www.ajaxprojects.com/ajax/newsdetails.php?itemid=178">Crawling AJAX</a>
        </li>
        <li>
          <a href="http://simile.mit.edu/wiki/Crowbar">Crowbar is a web scraping environment based
            on the use of a server-side headless mozilla-based browser.</a>
        </li>
        <li>
        <a href="http://www.osjava.org/oscube/">OSCube is a framework of sorts. I find myself writing a particular type of application, some kind of job engine, repeatedly and OSCube is the generic version there-of. It uses Simple-JNDI, and therefore really just basic JNDI, as its configuration system, and the Quartz scheduler for Cron-work.</a> 
        </li>
      </ul>
    </section>
  </body>
</document>