amiro       2002/06/25 06:31:05

  Modified:    java/src/org/apache/xalan/xsltc/compiler
                        FunctionAvailableCall.java
  Log:
  fix check for extension functions
  
  Revision  Changes    Path
  1.7       +51 -61    
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionAvailableCall.java
  
  Index: FunctionAvailableCall.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/FunctionAvailableCall.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- FunctionAvailableCall.java        24 Apr 2002 17:03:15 -0000      1.6
  +++ FunctionAvailableCall.java        25 Jun 2002 13:31:05 -0000      1.7
  @@ -73,39 +73,34 @@
   
   final class FunctionAvailableCall extends FunctionCall {
   
  -    private boolean    _isFunctionAvailable = false; 
       private Expression _arg; 
  -    private String     _namespaceOfFunct =null;      
  -    private String     _nameOfFunct =null; 
  -
  +    private String     _nameOfFunct = null; 
  +    private String     _namespaceOfFunct = null;     
  +    private boolean    _isFunctionAvailable = false; 
   
       /**
        * Constructs a FunctionAvailableCall FunctionCall. Takes the
  -     * function name qname, for example, 'function-available', and a list
  -     * of arguments where the arguments must be instances of 
  -     * LiteralExpression. The test for availability considers
  -     * internal xsl functions such as 'floor' as well as external
  -     * Java functions, such as 'java.lang.Math.sin'.  The case of
  -     * external functions is handled here, the case of internal
  -     * functions is handled in getResult. 
  +     * function name qname, for example, 'function-available', and 
  +     * a list of arguments where the arguments must be instances of 
  +     * LiteralExpression. 
        */
       public FunctionAvailableCall(QName fname, Vector arguments) {
        super(fname, arguments);
        _arg = (Expression)arguments.elementAt(0);
        _type = null; 
  +
           if (_arg instanceof LiteralExpr) {
  -         LiteralExpr arg = (LiteralExpr)_arg;
  +         LiteralExpr arg = (LiteralExpr) _arg;
               _namespaceOfFunct = arg.getNamespace();
               _nameOfFunct = arg.getValue();
  -            if ((_namespaceOfFunct != null) && 
  -                (!_namespaceOfFunct.equals(Constants.EMPTYSTRING)))
  +
  +            if (_namespaceOfFunct != null &&
  +             (_namespaceOfFunct.startsWith(JAVA_EXT_XSLTC) ||
  +              _namespaceOfFunct.startsWith(JAVA_EXT_XALAN))) 
            {
  -             // the function is external, such as a java function
                   _isFunctionAvailable = hasMethods();
               }
  -         // the case of internal function is handled in getResult.
           }
  -     // case where _arg is not instanceof LiteralExpr can not be handled.
       }
   
       /**
  @@ -113,13 +108,11 @@
        * returns the type of function-available to be boolean.  
        */
       public Type typeCheck(SymbolTable stable) throws TypeCheckError {
  -     // may be already set
  -     if ( _type != null ) {
  +     if (_type != null) {
           return _type;
        }
        if (_arg instanceof LiteralExpr) {
  -         _type = Type.Boolean;
  -         return Type.Boolean;        
  +         return _type = Type.Boolean;
        }
        ErrorMsg err = new ErrorMsg(ErrorMsg.NEED_LITERAL_ERR,
                        "function-available", this);
  @@ -186,65 +179,62 @@
        * the specified method is found in the specifed class. 
        */
       private boolean hasMethods() {
  -        
        LiteralExpr arg = (LiteralExpr)_arg;
        final String externalFunctName = getExternalFunctionName();
  +
        if (externalFunctName == null) {
            return false;
        }
  +
        final String className = getClassName(externalFunctName);
   
  -        if (_namespaceOfFunct.startsWith(JAVA_EXT_XSLTC) ||
  -            _namespaceOfFunct.startsWith(JAVA_EXT_XALAN)) {
  -            try {
  -                TransletLoader loader = new TransletLoader();
  -                final Class clazz = loader.loadClass(className);
  -
  -                if (clazz == null) {
  -                    final ErrorMsg msg =
  -                        new ErrorMsg(ErrorMsg.CLASS_NOT_FOUND_ERR, 
className);
  -                    getParser().reportError(Constants.ERROR, msg);
  -                }
  -                else {
  -                    final String methodName = 
getMethodName(externalFunctName);
  -                    final Method[] methods = clazz.getDeclaredMethods();
  -
  -                    for (int i = 0; i < methods.length; i++) {
  -                        final int mods = methods[i].getModifiers();
  -
  -                        if (Modifier.isPublic(mods)
  -                            && Modifier.isStatic(mods)
  -                            && methods[i].getName().equals(methodName))
  -                        {
  -                         return true;
  -                        }
  -                    }
  -                }
  -            }
  -            catch (ClassNotFoundException e) {
  -                final ErrorMsg msg =
  -                    new ErrorMsg(ErrorMsg.CLASS_NOT_FOUND_ERR, className);
  -                getParser().reportError(Constants.ERROR, msg);
  -            }
  -        }
  +     try {
  +         TransletLoader loader = new TransletLoader();
  +         final Class clazz = loader.loadClass(className);
  +
  +         if (clazz == null) {
  +             final ErrorMsg msg =
  +                 new ErrorMsg(ErrorMsg.CLASS_NOT_FOUND_ERR, className);
  +             getParser().reportError(Constants.ERROR, msg);
  +         }
  +         else {
  +             final String methodName = getMethodName(externalFunctName);
  +             final Method[] methods = clazz.getDeclaredMethods();
  +
  +             for (int i = 0; i < methods.length; i++) {
  +                 final int mods = methods[i].getModifiers();
  +
  +                 if (Modifier.isPublic(mods)
  +                     && Modifier.isStatic(mods)
  +                     && methods[i].getName().equals(methodName))
  +                 {
  +                     return true;
  +                 }
  +             }
  +         }
  +     }
  +     catch (ClassNotFoundException e) {
  +         final ErrorMsg msg =
  +             new ErrorMsg(ErrorMsg.CLASS_NOT_FOUND_ERR, className);
  +                 getParser().reportError(Constants.ERROR, msg);
  +     }
           return false;   
       }
   
       /**
  -     * reports on whether the function specified in the argument to
  +     * Reports on whether the function specified in the argument to
        * xslt function 'function-available' was found.
        */
       public boolean getResult() {
  -        if ((_namespaceOfFunct == null) ||
  -           (_namespaceOfFunct.equals(Constants.EMPTYSTRING)))
  +        if (_namespaceOfFunct == null ||
  +            _namespaceOfFunct.equals(EMPTYSTRING) ||
  +         _namespaceOfFunct.equals(TRANSLET_URI))
           {
  -            // no namespace, so the function is an internal xslt function.
               final Parser parser = getParser();
               _isFunctionAvailable = parser.functionSupported(_nameOfFunct);
           }
        return _isFunctionAvailable;
       }
  -
   
       /**
        * Calls to 'function-available' are resolved at compile time since 
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to