1 /* 2 * Copyright (C) 2007-2010 Jlio Vilmar Gesser. 3 * Copyright (C) 2011, 2013-2016 The JavaParser Team. 4 * 5 * This file is part of JavaParser. 6 * 7 * JavaParser can be used either under the terms of 8 * a) the GNU Lesser General Public License as published by 9 * the Free Software Foundation, either version 3 of the License, or 10 * (at your option) any later version. 11 * b) the terms of the Apache License 12 * 13 * You should have received a copy of both licenses in LICENCE.LGPL and 14 * LICENCE.APACHE. Please refer to those files for details. 15 * 16 * JavaParser is distributed in the hope that it will be useful, 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 * GNU Lesser General Public License for more details. 20 */ 21 package com.github.javaparser.ast.expr; 22 23 import com.github.javaparser.ast.AllFieldsConstructor; 24 import com.github.javaparser.ast.NodeList; 25 import com.github.javaparser.ast.observer.ObservableProperty; 26 import com.github.javaparser.ast.visitor.GenericVisitor; 27 import com.github.javaparser.ast.visitor.VoidVisitor; 28 import java.util.Arrays; 29 import java.util.List; 30 import static com.github.javaparser.utils.Utils.assertNotNull; 31 import com.github.javaparser.ast.Node; 32 import com.github.javaparser.ast.visitor.CloneVisitor; 33 import com.github.javaparser.metamodel.NormalAnnotationExprMetaModel; 34 import com.github.javaparser.metamodel.JavaParserMetaModel; 35 import javax.annotation.Generated; 36 import com.github.javaparser.TokenRange; 37 import java.util.function.Consumer; 38 import java.util.Optional; 39 40 /** 41 * An annotation that has zero or more key-value pairs.<br/><code>@Mapping(a=5, d=10)</code> 42 * @author Julio Vilmar Gesser 43 */ 44 public final class NormalAnnotationExpr extends AnnotationExpr { 45 46 private NodeList<MemberValuePair> pairs; 47 48 public NormalAnnotationExpr() { 49 this(null, new Name(), new NodeList<>()); 50 } 51 52 @AllFieldsConstructor 53 public NormalAnnotationExpr(final Name name, final NodeList<MemberValuePair> pairs) { 54 this(null, name, pairs); 55 } 56 57 /** 58 * This constructor is used by the parser and is considered private. 59 */ 60 @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator") 61 public NormalAnnotationExpr(TokenRange tokenRange, Name name, NodeList<MemberValuePair> pairs) { 62 super(tokenRange, name); 63 setPairs(pairs); 64 customInitialization(); 65 } 66 67 @Override 68 @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") 69 public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) { 70 return v.visit(this, arg); 71 } 72 73 @Override 74 @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") 75 public <A> void accept(final VoidVisitor<A> v, final A arg) { 76 v.visit(this, arg); 77 } 78 79 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 80 public NodeList<MemberValuePair> getPairs() { 81 return pairs; 82 } 83 84 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 85 public NormalAnnotationExpr setPairs(final NodeList<MemberValuePair> pairs) { 86 assertNotNull(pairs); 87 if (pairs == this.pairs) { 88 return (NormalAnnotationExpr) this; 89 } 90 notifyPropertyChange(ObservableProperty.PAIRS, this.pairs, pairs); 91 if (this.pairs != null) 92 this.pairs.setParentNode(null); 93 this.pairs = pairs; 94 setAsParentNodeOf(pairs); 95 return this; 96 } 97 98 /** 99 * adds a pair to this annotation 100 * 101 * @return this, the {@link NormalAnnotationExpr} 102 */ 103 public NormalAnnotationExpr addPair(String key, String value) { 104 return addPair(key, new NameExpr(value)); 105 } 106 107 /** 108 * adds a pair to this annotation 109 * 110 * @return this, the {@link NormalAnnotationExpr} 111 */ 112 public NormalAnnotationExpr addPair(String key, NameExpr value) { 113 MemberValuePair memberValuePair = new MemberValuePair(key, value); 114 getPairs().add(memberValuePair); 115 return this; 116 } 117 118 @Override 119 @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") 120 public boolean remove(Node node) { 121 if (node == null) 122 return false; 123 for (int i = 0; i < pairs.size(); i++) { 124 if (pairs.get(i) == node) { 125 pairs.remove(i); 126 return true; 127 } 128 } 129 return super.remove(node); 130 } 131 132 @Override 133 @Generated("com.github.javaparser.generator.core.node.CloneGenerator") 134 public NormalAnnotationExpr clone() { 135 return (NormalAnnotationExpr) accept(new CloneVisitor(), null); 136 } 137 138 @Override 139 @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator") 140 public NormalAnnotationExprMetaModel getMetaModel() { 141 return JavaParserMetaModel.normalAnnotationExprMetaModel; 142 } 143 144 @Override 145 @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator") 146 public boolean replace(Node node, Node replacementNode) { 147 if (node == null) 148 return false; 149 for (int i = 0; i < pairs.size(); i++) { 150 if (pairs.get(i) == node) { 151 pairs.set(i, (MemberValuePair) replacementNode); 152 return true; 153 } 154 } 155 return super.replace(node, replacementNode); 156 } 157 158 @Override 159 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 160 public boolean isNormalAnnotationExpr() { 161 return true; 162 } 163 164 @Override 165 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 166 public NormalAnnotationExpr asNormalAnnotationExpr() { 167 return this; 168 } 169 170 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 171 public void ifNormalAnnotationExpr(Consumer<NormalAnnotationExpr> action) { 172 action.accept(this); 173 } 174 175 @Override 176 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 177 public Optional<NormalAnnotationExpr> toNormalAnnotationExpr() { 178 return Optional.of(this); 179 } 180 } 181