JML

org.jmlspecs.checker
Class JmlClassContext

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.jmlspecs.checker.JmlContext
          extended byorg.jmlspecs.checker.JmlClassContext
All Implemented Interfaces:
CClassContextType, CContextType, Cloneable, Constants, Constants, Constants
Direct Known Subclasses:
JmlInterfaceContext

public class JmlClassContext
extends JmlContext
implements CClassContextType

This class represents the context for a class during checking passes (checkInterface, checkInitializers, typecheck).

See Also:
CContextType

Field Summary
 
Fields inherited from class org.jmlspecs.checker.JmlContext
cunit, delegee, parent
 
Fields inherited from class org.multijava.util.Utils
DBG_LEVEL_HIGH, DBG_LEVEL_LOW, DBG_LEVEL_NO
 
Fields inherited from interface org.jmlspecs.checker.Constants
ACC2_RAC_METHOD, ACC_CODE, ACC_CODE_BIGINT_MATH, ACC_CODE_JAVA_MATH, ACC_CODE_SAFE_MATH, ACC_GHOST, ACC_HELPER, ACC_INSTANCE, ACC_MODEL, ACC_MONITORED, ACC_QUERY, ACC_SECRET, ACC_SPEC_BIGINT_MATH, ACC_SPEC_JAVA_MATH, ACC_SPEC_PROTECTED, ACC_SPEC_PUBLIC, ACC_SPEC_SAFE_MATH, ACC_UNINITIALIZED, ACCESS_FLAG_ARRAY, ACCESS_FLAG_NAMES, AMID_BIGINT_MATH, EVERYTHING, JML_JMLObjectSet, NOT_SPECIFIED, NOTHING, OPE_BACKWARD_IMPLIES, OPE_EQUIV, OPE_EXISTS, OPE_FORALL, OPE_IMPLIES, OPE_L_ARROW, OPE_MAX, OPE_MIN, OPE_NOT_EQUIV, OPE_NUM_OF, OPE_PRODUCT, OPE_R_ARROW, OPE_SUBTYPE, OPE_SUM, SAME, TID_BIGINT, TID_REAL, TID_TYPE, TN_JMLOBJECTSET, TN_JMLTYPE, TN_JMLVALUESET
 
Fields inherited from interface org.multijava.mjc.Constants
ACC_MODIFIER_FLAGS_MASK, ACC_NON_NULL, ACC_NON_NULL_BY_DEFAULT, ACC_NULLABLE, ACC_NULLABLE_BY_DEFAULT, ACC_PURE, AMID_JAVA_MATH, AMID_MAX, AMID_SAFE_MATH, CMP_VERSION, IMPLICITLY_NON_NULL, JAV_ASSERTION_ERROR, JAV_CLASS, JAV_CLASSLOADER, JAV_CLASSNOTFOUND_EXCEPTION, JAV_CLONE, JAV_CLONEABLE, JAV_CONSTRUCTOR, JAV_ERROR, JAV_EXCEPTION, JAV_INIT, JAV_LENGTH, JAV_NAME_SEPARATOR, JAV_NOCLASSDEFFOUND_ERROR, JAV_OBJECT, JAV_OUTER_THIS, JAV_RMJ_RUNTIME_EXCEPTION, JAV_RUNTIME, JAV_RUNTIME_EXCEPTION, JAV_SERIALIZABLE, JAV_STATIC_INIT, JAV_STRING, JAV_STRINGBUFFER, JAV_SUPER, JAV_THIS, JAV_THROWABLE, MJ_ANCHOR, NULLITY_MODS, OPE_BAND, OPE_BNOT, OPE_BOR, OPE_BSR, OPE_BXOR, OPE_EQ, OPE_GE, OPE_GT, OPE_LAND, OPE_LE, OPE_LNOT, OPE_LOR, OPE_LT, OPE_MINUS, OPE_NE, OPE_PERCENT, OPE_PLUS, OPE_POSTDEC, OPE_POSTINC, OPE_PREDEC, OPE_PREINC, OPE_SIMPLE, OPE_SL, OPE_SLASH, OPE_SR, OPE_STAR, TID_ARRAY, TID_BOOLEAN, TID_BYTE, TID_CHAR, TID_CLASS, TID_DOUBLE, TID_FLOAT, TID_INT, TID_LONG, TID_MAX, TID_SHORT, TID_VOID, UNIV_ARRAY_TMP, UNIV_TMP
 
Fields inherited from interface org.multijava.util.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VOLATILE, ATT_ANCHOR, ATT_BRIDGE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_DISPATCHER, ATT_EXCEPTIONS, ATT_GENERIC, ATT_GENERIC_FUNCTIONS, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_MM_BODY, ATT_REDIRECTOR, ATT_RMJ_GLUE, ATT_RMJ_SIGNATURE, ATT_RUNTIME_VISIBLE_ANNOTATIONS, ATT_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, ATT_SIGNATURE, ATT_SOURCEFILE, ATT_SYNTHETIC, ATT_UNIVERSE_FIELD, ATT_UNIVERSE_METHOD, ATT_UNIVERSE_VERSION, CST_CLASS, CST_DOUBLE, CST_FIELD, CST_FLOAT, CST_INTEGER, CST_INTERFACEMETHOD, CST_LONG, CST_METHOD, CST_NAMEANDTYPE, CST_STRING, CST_UTF8, ENV_DEBUG_MODE, ENV_USE_CACHE, JAVA_MAGIC, JAVA_MAJOR, JAVA_MINOR, MAX_CODE_PER_METHOD, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_dup_x1, opc_dup_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc2_w, opc_ldc_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, POO_ASCII_CONSTANT, POO_CLASS_CONSTANT, POO_DOUBLE_CONSTANT, POO_FLOAT_CONSTANT, POO_INTEGER_CONSTANT, POO_LONG_CONSTANT, POO_NAT_CONSTANT, POO_REF_CONSTANT, POO_STRING_CONSTANT, TYP_ADDRESS, TYP_DOUBLE, TYP_FLOAT, TYP_INT, TYP_LONG, TYP_REFERENCE, TYP_VOID
 
Constructor Summary
protected JmlClassContext(CContextType parent)
          Constructs a class context.
(package private) JmlClassContext(CContextType parent, CClass self)
           
 
Method Summary
 void addInitializer()
          Add an initializer to this context
 void checkingComplete(JTypeDeclarationType decl, CVariableInfoTable staticC, CVariableInfoTable instanceC, CVariableInfoTable[] constructorsC)
          Verifies that all final fields are initialized and all abstract methods are appropriately implemented.
 CConstructorContextType createConstructorContext(CMethod self)
           
 CInitializerContextType createInitializerContext(CMethod self)
           
 CMethodContextType createMethodContext(CMethod self)
           
 CVariableInfoTable fieldInfo()
          Returns a duplicate copy of fieldInfo table.
 CVariableInfoTable fieldInfoTable()
          Returns the current field information for the most recently checked member of this context.
 CMemberHost findNearestHost()
          Returns the signature of the nearest lexically enclosing context that can host member declarations (i.e., a CClass or a CCompilationUnit).
 CClassContextType getClassContext()
          getClassContext
 CClass getHostClass()
          Returns the CClass representing the signature of the class containing this context.
 CClass getOwnerClass()
          Returns the CClass representing the signature of the class that is the logical owner of this context.
 boolean hasInitializer()
          Returns true if this class need initializers
 void initializeField(VariableDescriptor varDesc)
          Marks the field with the given descriptor as definitely assigned to in this context.
 boolean isFieldDefinitelyAssigned(int pos)
          Indicates whether the field in the given position is definitely assigned to in this context.
 CClass lookupClass(String name)
          Searches for a class with the given simple name according the procedure in JLS2 6.5.5.
 CFieldAccessor lookupField(String ident, CExpressionContextType context)
          lookupField
 JLocalVariable lookupLocalVariable(String ident)
          lookupLocalVariable
 CMethod lookupMethod(String ident, CType[] params, CClassContextType context)
          Searches for the most specific method when no receiver is explicit at the call site.
 CMethodSet lookupMethodOrSet(String ident, CType[] params, CClassContextType context)
          Searches for the most specific method(s) when no receiver is explicit at the call site.
 CFieldAccessor lookupOuterField(String ident, CExpressionContextType context)
          Searches for a field of the given name in the context surrounding the current lexical contour.
 JExpression lookupOuterLocalVariable(TokenReference ref, String ident)
          Finds a local variable with the given name that appears outside the current lexical contour.
 CTypeVariable lookupTypeVariable(String ident)
          search for the type variable that are accessible
 void markAllFieldsAsInitialized()
           
 void registerVisibleType(CType type)
          Registers with the surrounding context that a reference to the given type occurs in this context.
 void replaceFieldInfoUpTo(int pos, CVariableInfoTable replacement)
          Replaces the local field info for fields in positions 0 up to pos with the info in replacement.
 void resolveMaybeExtMethodRef(String ident)
          Searches for any imported or private external generic functions.
 void setFieldInfoTable(CVariableInfoTable fieldInfo)
          Sets the field information for this to match that given by fieldInfo.
 
Methods inherited from class org.jmlspecs.checker.JmlContext
addFANonNull, addFANonNulls, addFANull, addFANulls, adoptNullityInfo, arithmeticMode, catchUp, check, check, check, check, classToGenerate, createClassContext, createDummyContext, createExtMethodContext, createInterfaceContext, declaredOutsideOfLoop, declares, dumpNonNulls, enterSpecScope, exitSpecScope, fail, fail, fail, getCMethod, getCompilationUnit, getCompiler, getContextNullity, getFANonNulls, getFANulls, getFlowControlContext, getMethodContext, getParentContext, inSpecScope, isBeforeSuperConstructorCall, isFANonNull, isInConstructor, isInInitializer, isInLoop, isPure, isStatic, lookupField, lookupMethod, lookupMethodOrSet, lookupOuterField, mergeNullityInfo, modUtil, registerGFDecl, registerVisibleMethod, removeAllFANullity, removeFANonNull, reportTrouble
 
Methods inherited from class org.multijava.util.Utils
assertTrue, assertTrue, combineArrays, escapeString, escapeString, fail, fail, getFilePath, hasFlag, hasOtherFlags, parsePathParts, relativePathTo, splitQualifiedName, splitQualifiedName, stripJavaModifiers, stripNonJavaModifiers, stripPrivateModifier, unescapeString, vectorToArray, vectorToIntArray
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.multijava.mjc.CContextType
addFANonNull, addFANonNulls, addFANull, addFANulls, adoptNullityInfo, arithmeticMode, catchUp, check, check, check, check, classToGenerate, createClassContext, createExtMethodContext, createInterfaceContext, declaredOutsideOfLoop, declares, dumpNonNulls, fail, fail, getCMethod, getCompilationUnit, getCompiler, getFANonNulls, getFANulls, getFlowControlContext, getMethodContext, getParentContext, isBeforeSuperConstructorCall, isFANonNull, isInConstructor, isInInitializer, isInLoop, isPure, isStatic, lookupField, lookupMethod, lookupMethodOrSet, lookupOuterField, mergeNullityInfo, modUtil, registerGFDecl, registerVisibleMethod, removeAllFANullity, removeFANonNull, reportTrouble
 

Constructor Detail

JmlClassContext

JmlClassContext(CContextType parent,
                CClass self)
Parameters:
parent - the parent context or null at top level
self - the corresponding clazz

JmlClassContext

protected JmlClassContext(CContextType parent)
Constructs a class context.

Parameters:
parent - the parent context, it must be different than null except if called by the top level
Method Detail

checkingComplete

public void checkingComplete(JTypeDeclarationType decl,
                             CVariableInfoTable staticC,
                             CVariableInfoTable instanceC,
                             CVariableInfoTable[] constructorsC)
                      throws UnpositionedError
Verifies that all final fields are initialized and all abstract methods are appropriately implemented.

Specified by:
checkingComplete in interface CClassContextType
Throws:
UnpositionedError - if any checks fail

createMethodContext

public CMethodContextType createMethodContext(CMethod self)
Specified by:
createMethodContext in interface CClassContextType

createConstructorContext

public CConstructorContextType createConstructorContext(CMethod self)
Specified by:
createConstructorContext in interface CClassContextType

createInitializerContext

public CInitializerContextType createInitializerContext(CMethod self)
Specified by:
createInitializerContext in interface CClassContextType

addInitializer

public void addInitializer()
Add an initializer to this context

Specified by:
addInitializer in interface CClassContextType

hasInitializer

public boolean hasInitializer()
Returns true if this class need initializers

Specified by:
hasInitializer in interface CClassContextType

fieldInfo

public CVariableInfoTable fieldInfo()
Returns a duplicate copy of fieldInfo table.

Specified by:
fieldInfo in interface CClassContextType
Returns:
an field into table.

replaceFieldInfoUpTo

public void replaceFieldInfoUpTo(int pos,
                                 CVariableInfoTable replacement)
Replaces the local field info for fields in positions 0 up to pos with the info in replacement.

Specified by:
replaceFieldInfoUpTo in interface CClassContextType
Overrides:
replaceFieldInfoUpTo in class JmlContext

initializeField

public void initializeField(VariableDescriptor varDesc)
Marks the field with the given descriptor as definitely assigned to in this context.

Specified by:
initializeField in interface CClassContextType
Overrides:
initializeField in class JmlContext

isFieldDefinitelyAssigned

public boolean isFieldDefinitelyAssigned(int pos)
Indicates whether the field in the given position is definitely assigned to in this context.

Specified by:
isFieldDefinitelyAssigned in interface CClassContextType
Overrides:
isFieldDefinitelyAssigned in class JmlContext

fieldInfoTable

public CVariableInfoTable fieldInfoTable()
Returns the current field information for the most recently checked member of this context. It then clears the field info stored in this object. The pattern of use is to pass this context into a typecheck method. That method mutates this context to include the variable information extracted from the statement being checked. Upon return from the typecheck the caller calls fieldInfoTable to extract the information. This is kludgey and one wonders why the typecheck methods doesn't just return the CVariableInfoTable instance. !FIXME!

Specified by:
fieldInfoTable in interface CClassContextType

setFieldInfoTable

public void setFieldInfoTable(CVariableInfoTable fieldInfo)
Sets the field information for this to match that given by fieldInfo. Called before typechecking constructors with the argument equal to the field assignment information after checking initializers.

Specified by:
setFieldInfoTable in interface CClassContextType

markAllFieldsAsInitialized

public void markAllFieldsAsInitialized()
Specified by:
markAllFieldsAsInitialized in interface CClassContextType

lookupClass

public CClass lookupClass(String name)
                   throws UnpositionedError
Searches for a class with the given simple name according the procedure in JLS2 6.5.5. This method implements the second and third bullet points of the procedure. That is "Otherwise, if the simple type name occurs within the scope of exactly one visible member type, then the simple type name denotes that member type;" and "Otherwise, if the simple type name occurs within the scope of more than one visible member type, then the name is ambiguous as a type name; a compile-time error occurs." If the class is not found according to these constraints, then the surrounding context is called to check the remaining bullets.

Specified by:
lookupClass in interface CClassContextType
Overrides:
lookupClass in class JmlContext
Parameters:
name - the class name, without qualifiers
Returns:
the class if found, null otherwise
Throws:
UnpositionedError - if search fails

lookupTypeVariable

public CTypeVariable lookupTypeVariable(String ident)
                                 throws UnpositionedError
Description copied from interface: CClassContextType
search for the type variable that are accessible

Specified by:
lookupTypeVariable in interface CClassContextType
Overrides:
lookupTypeVariable in class JmlContext
Throws:
UnpositionedError

lookupMethod

public CMethod lookupMethod(String ident,
                            CType[] params,
                            CClassContextType context)
                     throws UnpositionedError
Searches for the most specific method when no receiver is explicit at the call site.

Specified by:
lookupMethod in interface CClassContextType
Overrides:
lookupMethod in class JmlContext
Parameters:
ident - method name
params - method parameters
context - the context of the class containing the method call
Returns:
the method or null if not found
Throws:
UnpositionedError - this error will be positioned soon

lookupMethodOrSet

public CMethodSet lookupMethodOrSet(String ident,
                                    CType[] params,
                                    CClassContextType context)
                             throws UnpositionedError
Searches for the most specific method(s) when no receiver is explicit at the call site.

Specified by:
lookupMethodOrSet in interface CClassContextType
Overrides:
lookupMethodOrSet in class JmlContext
Parameters:
ident - method name
params - method parameters
context - the context of the class containing the method call
Returns:
the method or null if not found
Throws:
UnpositionedError - this error will be positioned soon

lookupOuterField

public CFieldAccessor lookupOuterField(String ident,
                                       CExpressionContextType context)
                                throws UnpositionedError
Searches for a field of the given name in the context surrounding the current lexical contour.

Specified by:
lookupOuterField in interface CClassContextType
Overrides:
lookupOuterField in class JmlContext
Parameters:
ident - the name of the field
context - the context of the field access
Returns:
a variable from a field in the surrounding context, or null if none is found
Throws:
UnpositionedError - this error will be positioned soon

lookupField

public CFieldAccessor lookupField(String ident,
                                  CExpressionContextType context)
                           throws UnpositionedError
lookupField

Specified by:
lookupField in interface CClassContextType
Overrides:
lookupField in class JmlContext
Parameters:
ident - the name of the field
context - the context of the field access
Returns:
a variable from an ident in current context
Throws:
UnpositionedError - this error will be positioned soon

lookupOuterLocalVariable

public JExpression lookupOuterLocalVariable(TokenReference ref,
                                            String ident)
Finds a local variable with the given name that appears outside the current lexical contour.

Specified by:
lookupOuterLocalVariable in interface CClassContextType
Overrides:
lookupOuterLocalVariable in class JmlContext
Parameters:
ref - a token reference used to build a new JOuterLocalVariableExpression
ident - the name of the outer variable
Returns:
a variable from an ident in the surrounding context, or null if not found

lookupLocalVariable

public JLocalVariable lookupLocalVariable(String ident)
lookupLocalVariable

Specified by:
lookupLocalVariable in interface CContextType
Overrides:
lookupLocalVariable in class JmlContext
Parameters:
ident - the name of the local variable
Returns:
a variable from an ident in current context

getClassContext

public CClassContextType getClassContext()
getClassContext

Specified by:
getClassContext in interface CClassContextType
Overrides:
getClassContext in class JmlContext
Returns:
the near parent of type CClassContextType

getHostClass

public CClass getHostClass()
Returns the CClass representing the signature of the class containing this context.

Specified by:
getHostClass in interface CClassContextType
Overrides:
getHostClass in class JmlContext
Returns:
the CClass representing the signature of the class

getOwnerClass

public CClass getOwnerClass()
Returns the CClass representing the signature of the class that is the logical owner of this context. Useful for external methods where the host is the generic function anchor but the owner is the method's receiver.

Specified by:
getOwnerClass in interface CClassContextType
Returns:
the CClass representing the signature of the class
See Also:
CClassContextType.getHostClass(), org.multijava.mjc.CExtMethodContext#getHostClass()

findNearestHost

public CMemberHost findNearestHost()
Returns the signature of the nearest lexically enclosing context that can host member declarations (i.e., a CClass or a CCompilationUnit). Used for access checks, this is slightly different than getHostClass(). The later method returns an anchor class signature for external methods, which is useful in code generation and in typechecking external method bodies. On the other hand, this method returns a CCompilationUnit for external methods, which is useful in checking access between two differently named generic functions declared in the same compilation unit. !FIXME! It may be possible to eliminate this method and just use getHostClass now that private external methods are duplicated in every anchor.

Specified by:
findNearestHost in interface CClassContextType
Overrides:
findNearestHost in class JmlContext
Returns:
the nearest parent that can be coerced to a CMemberHost, i.e., this.self

resolveMaybeExtMethodRef

public void resolveMaybeExtMethodRef(String ident)
Searches for any imported or private external generic functions.

Specified by:
resolveMaybeExtMethodRef in interface CClassContextType
Overrides:
resolveMaybeExtMethodRef in class JmlContext
Parameters:
ident - the name of the generic function to search for

registerVisibleType

public void registerVisibleType(CType type)
Registers with the surrounding context that a reference to the given type occurs in this context.

Specified by:
registerVisibleType in interface CClassContextType
Overrides:
registerVisibleType in class JmlContext

JML

JML is Copyright (C) 1998-2002 by Iowa State University and is distributed under the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This release depends on code from the MultiJava project and is based in part on the Kopi project Copyright (C) 1990-99 DMS Decision Management Systems Ges.m.b.H.