001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.jexl2.parser;
018    
019    import java.util.Collections;
020    import java.util.Map;
021    
022    public final class ASTMapLiteral extends JexlNode implements JexlNode.Literal<Object> {
023        /** The type literal value. */
024        Map<?,?> map = null;
025        /** Whether this array is constant or not. */
026        boolean constant = false;
027    
028        ASTMapLiteral(int id) {
029            super(id);
030        }
031    
032        ASTMapLiteral(Parser p, int id) {
033            super(p, id);
034        }
035    
036    
037        /** {@inheritDoc} */
038        @Override
039        public void jjtClose() {
040            if (children == null || children.length == 0) {
041                map = Collections.EMPTY_MAP;
042                constant = true;
043            } else {
044                constant = isConstant();
045            }
046        }
047    
048        /**
049         *  Gets the literal value.
050         * @return the array literal
051         */
052        public Object getLiteral() {
053            return map;
054        }
055    
056        /**
057         * Sets the literal value only if the descendants of this node compose a constant
058         * @param literal the literal array value
059         * @throws IllegalArgumentException if literal is not an array or null
060         */
061        public void setLiteral(Object literal) {
062            if (constant) {
063                if (!(literal instanceof Map<?,?>)) {
064                    throw new IllegalArgumentException(literal.getClass() + " is not an array");
065                }
066                this.map = (Map<?,?>) literal;
067            }
068        }
069    
070        /** {@inheritDoc} */
071        @Override
072        public Object jjtAccept(ParserVisitor visitor, Object data) {
073            return visitor.visit(this, data);
074        }
075    }