NodeList.java revision 0d8f8e5cc0e48d0cc27cf070155ab318fe160a00
176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti/* 276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Copyright (C) 2007-2010 Júlio Vilmar Gesser. 376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * Copyright (C) 2011, 2013-2016 The JavaParser Team. 476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * This file is part of JavaParser. 676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * JavaParser can be used either under the terms of 876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * a) the GNU Lesser General Public License as published by 976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * the Free Software Foundation, either version 3 of the License, or 1076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * (at your option) any later version. 1176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * b) the terms of the Apache License 1276f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 1376f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * You should have received a copy of both licenses in LICENCE.LGPL and 1476f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * LICENCE.APACHE. Please refer to those files for details. 1576f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * 1676f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * JavaParser is distributed in the hope that it will be useful, 1776f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * but WITHOUT ANY WARRANTY; without even the implied warranty of 1876f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1976f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti * GNU Lesser General Public License for more details. 2076f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti */ 2176f5dc9d043237e8ada0e6597d6c8d48b67f6d8fFederico Tomassetti 22515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenpackage com.github.javaparser.ast; 23515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 24db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggenimport com.github.javaparser.HasParentNode; 250f8bbe61c2d7132846b8ad13804ae70d62c5c8bcDanny van Bruggenimport com.github.javaparser.ast.observer.AstObserver; 260f8bbe61c2d7132846b8ad13804ae70d62c5c8bcDanny van Bruggenimport com.github.javaparser.ast.observer.Observable; 27515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenimport com.github.javaparser.ast.visitor.GenericVisitor; 28008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilienimport com.github.javaparser.ast.visitor.Visitable; 29515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenimport com.github.javaparser.ast.visitor.VoidVisitor; 30515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 316d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassettiimport java.util.*; 32c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettiimport java.util.function.Consumer; 33c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettiimport java.util.function.Predicate; 34c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettiimport java.util.function.UnaryOperator; 356d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassettiimport java.util.stream.Stream; 366d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 37515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen/** 38db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen * A list of nodes. 399dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen * It usually has a parent node. 4015c2aa05f936720e8f7efdedbbc68450a6f27fb3Danny van Bruggen * Unlike normal Nodes, this does not mean that it is a child of that parent. 419dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen * Instead, this list will make every node it contains a child of its parent. 429dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen * This way, a NodeList does not create an extra level inside the AST. 43515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen * 44515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen * @param <N> the type of nodes contained. 45515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen */ 46c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettipublic class NodeList<N extends Node> implements List<N>, Iterable<N>, HasParentNode<NodeList<N>>, Visitable, Observable { 47515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen private List<N> innerList = new ArrayList<>(0); 48515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 49db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen private Node parentNode; 50db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 51263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti private List<AstObserver> observers = new ArrayList<>(); 526d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 53515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public NodeList() { 54f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen this((Node) null); 55515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 56515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 57515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public NodeList(Node parent) { 58515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setParentNode(parent); 59515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 60515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 61796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen public NodeList(NodeList<N> n) { 62796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen this.addAll(n); 63796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen } 64796e7f15567eeeef96e224d8d00c27fdf1248413Danny van Bruggen 65f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 66f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean add(N node) { 676d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti notifyElementAdded(innerList.size(), node); 68515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen own(node); 69f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.add(node); 70515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 71515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 72515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen private void own(N node) { 73515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen if (node == null) { 74515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return; 75515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 76515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setAsParentNodeOf(node); 77515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 78515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 79515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean remove(Node node) { 80c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti int index = innerList.indexOf(node); 81c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti if (index != -1) { 82c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti notifyElementRemoved(index, node); 83c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti node.setParentNode(null); 84c0e1f8e102a33dc34c41318ba55469516fff0993Federico Tomassetti } 859dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen return innerList.remove(node); 86515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 87515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 889dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen @SafeVarargs 89515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(X... nodes) { 90515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 919dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen Collections.addAll(nodeList, nodes); 92515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 93515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 94515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 95515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(Collection<X> nodes) { 96515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 97515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen for (X node : nodes) { 98515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen nodeList.add(node); 99515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 100515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 101515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 102515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 103515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(NodeList<X> nodes) { 104515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 1059dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen nodeList.addAll(nodes); 106515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 107515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 108515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 109515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean contains(N node) { 110515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.contains(node); 111515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 112515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 113f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 114515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public Stream<N> stream() { 115515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.stream(); 116515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 117515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 118f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 119515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public int size() { 120515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.size(); 121515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 122515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 123f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 124515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public N get(int i) { 125515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.get(i); 126515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 127515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 128515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen @Override 129515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public Iterator<N> iterator() { 130515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen // TODO take care of "Iterator.remove" 131515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.iterator(); 132515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 133515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 134f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 135f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public N set(int index, N element) { 1360d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti notifyElementReplaced(index, element); 137515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setAsParentNodeOf(element); 138f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.set(index, element); 139515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 140515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 141f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 142f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public N remove(int index) { 143263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti notifyElementRemoved(index, innerList.get(index)); 144f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien N remove = innerList.remove(index); 145f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien if (remove != null) 146f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien remove.setParentNode(null); 147f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return remove; 148515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 149515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 150f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 151515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean isEmpty() { 152515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.isEmpty(); 153515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 154515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 155f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 156515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public void sort(Comparator<? super N> comparator) { 157515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen Collections.sort(innerList, comparator); 158515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 159515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 160515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public void addAll(NodeList<N> otherList) { 161515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen for (N node : otherList) { 162515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen add(node); 163515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 164515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 165515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 166f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 167f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void add(int index, N node) { 1686d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti notifyElementAdded(index, node); 169515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen own(node); 170515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen innerList.add(index, node); 171515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 172db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 173db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 174008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien public Optional<Node> getParentNode() { 175008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien return Optional.ofNullable(parentNode); 176db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 177db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 178008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien /** 179008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * Sets the parentNode 1804296abb695b767f7471dd255d0679516183b062aDanny van Bruggen * 181008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * @param parentNode the parentNode 182008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * @return this, the NodeList 183008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien */ 184db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 185db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public NodeList<N> setParentNode(Node parentNode) { 186db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen this.parentNode = parentNode; 187db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen setAsParentNodeOf(innerList); 188db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return this; 189db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 190db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 191db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 192db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public Node getParentNodeForChildren() { 193db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return parentNode; 194db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 195db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 196008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien @Override 197db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) { 198db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return v.visit(this, arg); 199db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 200db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 201008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien @Override 202db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public <A> void accept(final VoidVisitor<A> v, final A arg) { 203db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen v.visit(this, arg); 204db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 205db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 206f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 207f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.lang.Iterable#forEach(java.util.function.Consumer) 208f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 209f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 210f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void forEach(Consumer<? super N> action) { 211f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien innerList.forEach(action); 212f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 213f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 214f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 215f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#contains(java.lang.Object) 216f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 217f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 218f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean contains(Object o) { 219f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.contains(o); 220f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 221f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 222f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 223f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#toArray() 224f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 225f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 226f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Object[] toArray() { 227f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.toArray(); 228f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 229f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 230f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 231f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#toArray(java.lang.Object[]) 232f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 233f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 234f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public <T> T[] toArray(T[] a) { 235f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.toArray(a); 236f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 237f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 238f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 239f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#remove(java.lang.Object) 240f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 241f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 242f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean remove(Object o) { 243ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti if (o instanceof Node) { 2444296abb695b767f7471dd255d0679516183b062aDanny van Bruggen return remove((Node) o); 245ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti } else { 246ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti return false; 247ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti } 248f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 249f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 250f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 251f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#containsAll(java.util.Collection) 252f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 253f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 254f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean containsAll(Collection<?> c) { 255f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.containsAll(c); 256f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 257f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 258f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 259f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#addAll(java.util.Collection) 260f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 261f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 262f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean addAll(Collection<? extends N> c) { 2639dfe6cb2a1115f749a6a9adca05297d6b24eb046Danny van Bruggen c.forEach(this::add); 2643e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti return !c.isEmpty(); 265f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 266f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 267f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 268f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#addAll(int, java.util.Collection) 269f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 270f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 271f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean addAll(int index, Collection<? extends N> c) { 272150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti for (N e : c) { 273150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti add(index++, e); 2743e8757e510df2bbdb1ef8bedf92538b17a5e36c6Federico Tomassetti } 275150ecb8efecf1bbe22f23e6e2869ef4f59fe3523Federico Tomassetti return !c.isEmpty(); 276f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 277f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 278f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 279f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#removeAll(java.util.Collection) 280f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 281f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 282f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean removeAll(Collection<?> c) { 283ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti boolean changed = false; 284ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti for (Object e : c) { 285ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti changed = remove(e) || changed; 286f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 287ab4f6a5743de6a9fbb09da9d6a00678bbc2cd3d1Federico Tomassetti return changed; 288f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 289f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 290f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 291f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#retainAll(java.util.Collection) 292f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 293f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 294f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean retainAll(Collection<?> c) { 295cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti boolean changed = false; 296cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti for (Object e : this.stream().filter(it -> !c.contains(it)).toArray()) { 297cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti if (!c.contains(e)) { 298cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti changed = remove(e) || changed; 299cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti } 300cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti } 301cbaf4495c17eb3383e8d2b40db9a4fe92221d118Federico Tomassetti return changed; 302f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 303f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 304f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 305f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#replaceAll(java.util.function.UnaryOperator) 306f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 307f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 308f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void replaceAll(UnaryOperator<N> operator) { 3094296abb695b767f7471dd255d0679516183b062aDanny van Bruggen for (int i = 0; i < this.size(); i++) { 31034ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti set(i, operator.apply(this.get(i))); 31134ee4b944cf1534361d6d9ca7ba3f9876df5ddb4Federico Tomassetti } 312f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 313f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 314f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 315f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.Collection#removeIf(java.util.function.Predicate) 316f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 317f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 318f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean removeIf(Predicate<? super N> filter) { 31955d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti boolean changed = false; 3204296abb695b767f7471dd255d0679516183b062aDanny van Bruggen for (Object e : this.stream().filter(filter).toArray()) { 32155d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti changed = remove(e) || changed; 32255d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti } 32355d475bac6deff387e608ac7f200227a23488ea7Federico Tomassetti return changed; 324f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 325f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 326f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 327f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#clear() 328f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 329f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 330f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void clear() { 3314a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti while (!isEmpty()) { 3324a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti remove(0); 3334a25ff22c5db52fe1f21f8939e4a47a73ff2f61bFederico Tomassetti } 334f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 335f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 336f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 337f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#equals(java.lang.Object) 338f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 339f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 340f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean equals(Object o) { 341f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.equals(o); 342f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 343f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 344f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 345f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#hashCode() 346f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 347f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 348f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int hashCode() { 349f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.hashCode(); 350f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 351f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 352f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 353f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#indexOf(java.lang.Object) 354f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 355f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 356f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int indexOf(Object o) { 357f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.indexOf(o); 358f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 359f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 360f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 361f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#lastIndexOf(java.lang.Object) 362f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 363f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 364f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int lastIndexOf(Object o) { 365f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.lastIndexOf(o); 366f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 367f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 368f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 369f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#listIterator() 370f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 371f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 372f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public ListIterator<N> listIterator() { 373f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.listIterator(); 374f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 375f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 376f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 377f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#listIterator(int) 378f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 379f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 380f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public ListIterator<N> listIterator(int index) { 381f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.listIterator(index); 382f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 383f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 384f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 385f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.Collection#parallelStream() 386f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 387f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 388f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Stream<N> parallelStream() { 389f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.parallelStream(); 390f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 391f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 392f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 393f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#subList(int, int) 394f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 395f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 396f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public List<N> subList(int fromIndex, int toIndex) { 397f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.subList(fromIndex, toIndex); 398f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 399f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 400f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 401f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#spliterator() 402f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 403f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 404f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Spliterator<N> spliterator() { 405f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.spliterator(); 406c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassetti } 407263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti 4086d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti private void notifyElementAdded(int index, Node nodeAddedOrRemoved) { 40917c60f99a730acb68276303e7c6fcdf0a376258cFederico Tomassetti this.observers.forEach(o -> o.listChange(this, AstObserver.ListChangeType.ADDITION, index, nodeAddedOrRemoved)); 4106d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4116d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4126d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti private void notifyElementRemoved(int index, Node nodeAddedOrRemoved) { 41317c60f99a730acb68276303e7c6fcdf0a376258cFederico Tomassetti this.observers.forEach(o -> o.listChange(this, AstObserver.ListChangeType.REMOVAL, index, nodeAddedOrRemoved)); 4146d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4156d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4160d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti private void notifyElementReplaced(int index, Node nodeAddedOrRemoved) { 4170d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti this.observers.forEach(o -> o.listReplacement(this, index, this.get(index), nodeAddedOrRemoved)); 4180d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti } 4190d8f8e5cc0e48d0cc27cf070155ab318fe160a00Federico Tomassetti 4206d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti @Override 421263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public void unregister(AstObserver observer) { 4226d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti this.observers.remove(observer); 4236d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4246d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4256d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti @Override 426263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public void register(AstObserver observer) { 4276d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti this.observers.add(observer); 428263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti } 429263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti 430263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti @Override 431263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public boolean isRegistered(AstObserver observer) { 432263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti return this.observers.contains(observer); 433f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 434f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 435f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen /** 436f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen * Replaces the first node that is equal to "old" with "replacement". 437f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen * 438f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen * @return true if a replacement has happened. 439f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen */ 440f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen public boolean replace(N old, N replacement) { 441f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen int i = indexOf(old); 442f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen if (i == -1) { 443f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen return false; 444f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen } 445f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen set(i, replacement); 446f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen return true; 447f64e8f570cb375692d112e03d095040e88d109abDanny van Bruggen } 448515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen} 449