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 }