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.stmt; 22 23 import com.github.javaparser.ast.AllFieldsConstructor; 24 import com.github.javaparser.ast.expr.Expression; 25 import com.github.javaparser.ast.expr.NameExpr; 26 import com.github.javaparser.ast.nodeTypes.NodeWithBlockStmt; 27 import com.github.javaparser.ast.nodeTypes.NodeWithExpression; 28 import com.github.javaparser.ast.observer.ObservableProperty; 29 import com.github.javaparser.ast.visitor.GenericVisitor; 30 import com.github.javaparser.ast.visitor.VoidVisitor; 31 import static com.github.javaparser.utils.Utils.assertNotNull; 32 import com.github.javaparser.ast.Node; 33 import com.github.javaparser.ast.visitor.CloneVisitor; 34 import com.github.javaparser.metamodel.SynchronizedStmtMetaModel; 35 import com.github.javaparser.metamodel.JavaParserMetaModel; 36 import javax.annotation.Generated; 37 import com.github.javaparser.TokenRange; 38 import java.util.function.Consumer; 39 import java.util.Optional; 40 41 /** 42 * Usage of the synchronized keyword. 43 * <br/>In <code>synchronized (a123) { ... }</code> the expression is a123 and { ... } is the body 44 * 45 * @author Julio Vilmar Gesser 46 */ 47 public final class SynchronizedStmt extends Statement implements NodeWithBlockStmt<SynchronizedStmt>, NodeWithExpression<SynchronizedStmt> { 48 49 private Expression expression; 50 51 private BlockStmt body; 52 53 public SynchronizedStmt() { 54 this(null, new NameExpr(), new BlockStmt()); 55 } 56 57 @AllFieldsConstructor 58 public SynchronizedStmt(final Expression expression, final BlockStmt body) { 59 this(null, expression, body); 60 } 61 62 /** 63 * This constructor is used by the parser and is considered private. 64 */ 65 @Generated("com.github.javaparser.generator.core.node.MainConstructorGenerator") 66 public SynchronizedStmt(TokenRange tokenRange, Expression expression, BlockStmt body) { 67 super(tokenRange); 68 setExpression(expression); 69 setBody(body); 70 customInitialization(); 71 } 72 73 @Override 74 @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") 75 public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) { 76 return v.visit(this, arg); 77 } 78 79 @Override 80 @Generated("com.github.javaparser.generator.core.node.AcceptGenerator") 81 public <A> void accept(final VoidVisitor<A> v, final A arg) { 82 v.visit(this, arg); 83 } 84 85 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 86 public Expression getExpression() { 87 return expression; 88 } 89 90 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 91 public SynchronizedStmt setExpression(final Expression expression) { 92 assertNotNull(expression); 93 if (expression == this.expression) { 94 return (SynchronizedStmt) this; 95 } 96 notifyPropertyChange(ObservableProperty.EXPRESSION, this.expression, expression); 97 if (this.expression != null) 98 this.expression.setParentNode(null); 99 this.expression = expression; 100 setAsParentNodeOf(expression); 101 return this; 102 } 103 104 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 105 public BlockStmt getBody() { 106 return body; 107 } 108 109 @Generated("com.github.javaparser.generator.core.node.PropertyGenerator") 110 public SynchronizedStmt setBody(final BlockStmt body) { 111 assertNotNull(body); 112 if (body == this.body) { 113 return (SynchronizedStmt) this; 114 } 115 notifyPropertyChange(ObservableProperty.BODY, this.body, body); 116 if (this.body != null) 117 this.body.setParentNode(null); 118 this.body = body; 119 setAsParentNodeOf(body); 120 return this; 121 } 122 123 @Override 124 @Generated("com.github.javaparser.generator.core.node.RemoveMethodGenerator") 125 public boolean remove(Node node) { 126 if (node == null) 127 return false; 128 return super.remove(node); 129 } 130 131 @Override 132 @Generated("com.github.javaparser.generator.core.node.CloneGenerator") 133 public SynchronizedStmt clone() { 134 return (SynchronizedStmt) accept(new CloneVisitor(), null); 135 } 136 137 @Override 138 @Generated("com.github.javaparser.generator.core.node.GetMetaModelGenerator") 139 public SynchronizedStmtMetaModel getMetaModel() { 140 return JavaParserMetaModel.synchronizedStmtMetaModel; 141 } 142 143 @Override 144 @Generated("com.github.javaparser.generator.core.node.ReplaceMethodGenerator") 145 public boolean replace(Node node, Node replacementNode) { 146 if (node == null) 147 return false; 148 if (node == body) { 149 setBody((BlockStmt) replacementNode); 150 return true; 151 } 152 if (node == expression) { 153 setExpression((Expression) replacementNode); 154 return true; 155 } 156 return super.replace(node, replacementNode); 157 } 158 159 @Override 160 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 161 public boolean isSynchronizedStmt() { 162 return true; 163 } 164 165 @Override 166 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 167 public SynchronizedStmt asSynchronizedStmt() { 168 return this; 169 } 170 171 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 172 public void ifSynchronizedStmt(Consumer<SynchronizedStmt> action) { 173 action.accept(this); 174 } 175 176 @Override 177 @Generated("com.github.javaparser.generator.core.node.TypeCastingGenerator") 178 public Optional<SynchronizedStmt> toSynchronizedStmt() { 179 return Optional.of(this); 180 } 181 } 182