Apache UIMA BSFAnnotator OSGi software component
Copyright 2007-2009 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This software also includes:

    - Beanshell 1.3.0, lightweight Scripting for Java, from http://www.beanshell.org/

    - Rhino, the open-source implementation of JavaScript written entirely in Java, from 
      http://www.mozilla.org/rhino/
      


      

       
