=============================================================
 Welcome to Apache OODT  <http://oodt.apache.org/>
=============================================================

OODT is a grid middleware framework used on a number of successful projects at
NASA's Jet Propulsion Laboratory/California Institute of Technology, and many
other research institutions and universities, specifically those part of the:

* National Cancer Institute's (NCI's) Early Detection Research Network (EDRN)
  project - over 40+ institutions all performing research into discovering
  biomarkers which are early indicators of disease.
* NASA's Planetary Data System (PDS) - NASA's planetary data archive, a
  repository and registry for all planetary data collected over the past 30+
  years.
* Various Earth Science data processing missions, including
  Seawinds/QuickSCAT, the Orbiting Carbon Observatory, the NPP Sounder PEATE
  project, and the Soil Moisture Active Passive (SMAP) mission.
    
OODT is a Top Level project of the Apache Software Foundation 
<http://www.apache.org/>.

Getting Started
===============

OODT is primarily written in Java, with some components available in Python.
It requires Java 5 and uses the Maven 2 <http://maven.apache.org/> build
system.  To build the Java components of OODT, use the following command in
this directory:

    mvn install

For the Python components, see the "agility" subdirectory.

License (see also LICENSE.txt)
==============================

Collective work: Copyright 2010 The Apache Software Foundation.

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.

Apache OODT includes a number of subcomponents with separate copyright
notices and license terms. Your use of these subcomponents is subject to
the terms and conditions of the licenses listed in the LICENSE.txt file.

Export control
==============

This distribution includes cryptographic software.  The country in which you
currently reside may have restrictions on the import, possession, use, and/or
re-export to another country, of encryption software.  BEFORE using any
encryption software, please check your country's laws, regulations and
policies concerning the import, possession, or use, and re-export of
encryption software, to see if this is permitted.  See
<http://www.wassenaar.org/> for more information.

The U.S.  Government Department of Commerce, Bureau of Industry and Security
(BIS), has classified this software as Export Commodity Control Number (ECCN)
5D002.C.1, which includes information security software using or performing
cryptographic functions with asymmetric algorithms.  The form and manner of
this Apache Software Foundation distribution makes it eligible for export
under the License Exception ENC Technology Software Unrestricted (TSU)
exception (see the BIS Export Administration Regulations, Section 740.13) for
both object code and source code.

The following provides more details on the included cryptographic software:

    Apache OODT uses Apache Tika which uses the Bouncy Castle generic
    encryption libraries for extracting text content and metadata from
    encrypted PDF files.  See http://www.bouncycastle.org/ for more details on
    Bouncy Castle.

Documentation
=============

You can build a local copy of the OODT documentation including JavaDocs using
the following Maven 2 command in the OODT source directory:

    mvn site 

You can then open the OODT Documentation in a web browser: 

    ./target/site/index.html

Note: all OODT source files are encoded with UTF-8.  You must set your
MAVEN_OPTS environment variable to include "-Dfile.encoding=UTF-8" in order to
properly generate the web site and other artifacts from source.

Note: generating the documentation requires enormous amounts of memory.  More
than likely you'll need to add to the MAVEN_OPTS environment variable in order
to set the Java heap maximum size with "-Xmx512m" or larger before attempting
to run "mvn site".

Mailing Lists
=============

Discussion about OODT takes place on the following mailing lists:

    dev@oodt.apache.org    - About using OODT and developing OODT

Notification on all code changes are sent to the following mailing list:

    commits@oodt.apache.org

The mailing lists are open to anyone and publicly archived.

You can subscribe the mailing lists by sending a message to
<LIST>-subscribe@oodt.apache.org (for example
dev-subscribe@oodt...).  To unsubscribe, send a message to
<LIST>-unsubscribe@oodt.apache.org.  For more instructions, send a
message to <LIST>-help@oodt.apache.org.

Issue Tracker
=============

If you encounter errors in OODT or want to suggest an improvement or a new
feature, please visit the OODT issue tracker at
https://issues.apache.org/jira/browse/OODT.  There you can also find the
latest information on known issues and recent bug fixes and enhancements.
