| 
 | 
 | 
 | 
 | 
 */  | 
 | 
/*  | 
 | 
 * 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.  | 
 | 
 */  | 
 | 
 | 
 | 
package com.sun.org.apache.xalan.internal.xsltc.compiler;  | 
 | 
 | 
 | 
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;  | 
 | 
import com.sun.org.apache.bcel.internal.generic.PUSH;  | 
 | 
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator;  | 
 | 
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;  | 
 | 
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator;  | 
 | 
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;  | 
 | 
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;  | 
 | 
import java.util.List;  | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
final class ElementAvailableCall extends FunctionCall { | 
 | 
 | 
 | 
    public ElementAvailableCall(QName fname, List<Expression> arguments) { | 
 | 
        super(fname, arguments);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public Type typeCheck(SymbolTable stable) throws TypeCheckError { | 
 | 
        if (argument() instanceof LiteralExpr) { | 
 | 
            return _type = Type.Boolean;  | 
 | 
        }  | 
 | 
        ErrorMsg err = new ErrorMsg(ErrorMsg.NEED_LITERAL_ERR,  | 
 | 
                                    "element-available", this);  | 
 | 
        throw new TypeCheckError(err);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public Object evaluateAtCompileTime() { | 
 | 
        return getResult() ? Boolean.TRUE : Boolean.FALSE;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
     */  | 
 | 
    public boolean getResult() { | 
 | 
        try { | 
 | 
            final LiteralExpr arg = (LiteralExpr) argument();  | 
 | 
            final String qname = arg.getValue();  | 
 | 
            final int index = qname.indexOf(':'); | 
 | 
            final String localName = (index > 0) ?  | 
 | 
                qname.substring(index + 1) : qname;  | 
 | 
            return getParser().elementSupported(arg.getNamespace(),  | 
 | 
                                                localName);  | 
 | 
        }  | 
 | 
        catch (ClassCastException e) { | 
 | 
            return false;  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    public void translate(ClassGenerator classGen, MethodGenerator methodGen) { | 
 | 
        final ConstantPoolGen cpg = classGen.getConstantPool();  | 
 | 
        final boolean result = getResult();  | 
 | 
        methodGen.getInstructionList().append(new PUSH(cpg, result));  | 
 | 
    }  | 
 | 
}  |