<--

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.

-->


=========================
BSF 2.4, 2006-10-06
=========================

=========================================================
Release notes for BSF 2.4 (http://jakarta.apache.org/bsf)
=========================================================


About the "Bean Scripting Framework (BSF)"
==========================================

BSF allows Java programmers to easily deploy scripts written in many scripting
(like) languages like JavaScript, JLog (PROLOG) Jython, Rexx, and use even XSLT
with the same simple, but powerful BSF APIs.

It is possible to supply arguments and retrieve result values from the scripts,
as well as sharing Java objects among each other (and among all scripts that are
deployed with the help of the same BSF manager).

BSF itself can be deployed starting with Java version 1.3, but some scripting
languages may need newer versions of Java.

This release is meant to be fully compatible with any previous version of BSF.


Changes to previous release candidate
=====================================

- Bug fixes, e.g.

       - datatype conversion now encompasses the oversighted primitive datatype
         "char" into account (class 'TypeConvertor.java',
         'TypeConvertorRegistry.java')

       - dynamic event adapter creation now succeeds

       - fixed a few spelling errors in the code

- Enhancements, changes, e.g.

       - can be used as an extension package to Java by placing it into
         "jre/lib/ext" [using the thread's context classloader, ie. the result
         of 'Thread.currentThread().getContextClassLoader()']

       - removed experimental 'DebugLog' class, superceded by commons-logging
         and log4j

       - removed 'org.apache.bsf.engines.activescript.*', as it is not
         supported anymore (stems from the original IBM codebase, but would
         need native Windows code to bridge OLE/ActiveX)

       - removed 'org.apache.bsf.engines.jpython', as it is superceded by
         the newer 'org.apache.bsf.engines.jython'

       - 'org.apache.bsf.BSFMain.java': new method
         "public String getVersion()", returns string in the form of a
         dewey decimal number 'abc' (three levels, each between 0 and 9)
         'abc.yyyymmdd', 'yyyy' four digit year, 'mm' two digit month,
         'dd' two digit day;
         e.g. '240.20061006' stands for: BSF version 2.4.0 as of 2006-10-06

       - new class 'org.apache.bsf.utils.BSFEventProcessorReturningEventInfos'

       - 'org.apache.bsf.utils.EngineUtils.java': added the method
         'addEventListenerReturningEventInfos(...)'


People who have contributed to this release one way or the other
(order by first name)
================================================================

       Don Schwarz
       Henning P. Schmiedehausen
       Igor Bukanov
       Kev Jackson
       Nandika Jayawardana
       Nilupa Bandara
       Rony G. Flatscher
       Sanjiva Weerawarana
       Sanka Samaranayke
       Thomas Klaeger (Kl&auml;ger)
       Victor J. Orlikowski

