JavaParser Source Viewer

Home|JavaParser/com/github/javaparser/ast/observer/PropagatingAstObserver.java
1/*
2 * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser.
3 * Copyright (C) 2011, 2013-2020 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
22package com.github.javaparser.ast.observer;
23
24import com.github.javaparser.ast.Node;
25import com.github.javaparser.ast.NodeList;
26
27/**
28 * This AstObserver attach itself to all new nodes added to the nodes already observed.
29 */
30public abstract class PropagatingAstObserver implements AstObserver {
31
32    /**
33     * Wrap a given observer to make it self-propagating. If the given observer is an instance of PropagatingAstObserver
34     * the observer is returned without changes.
35     */
36    public static PropagatingAstObserver transformInPropagatingObserver(final AstObserver observer) {
37        if (observer instanceof PropagatingAstObserver) {
38            return (PropagatingAstObserverobserver;
39        }
40        return new PropagatingAstObserver() {
41            @Override
42            public void concretePropertyChange(Node observedNodeObservableProperty propertyObject oldValueObject newValue) {
43                observer.propertyChange(observedNodepropertyoldValuenewValue);
44            }
45
46            @Override
47            public void concreteListChange(NodeList<?> observedNodeListChangeType typeint indexNode nodeAddedOrRemoved) {
48                observer.listChange(observedNodetypeindexnodeAddedOrRemoved);
49            }
50
51            @Override
52            public void parentChange(Node observedNodeNode previousParentNode newParent) {
53                observer.parentChange(observedNodepreviousParentnewParent);
54            }
55        };
56    }
57
58    @Override
59    public final void propertyChange(Node observedNodeObservableProperty propertyObject oldValueObject newValue) {
60        considerRemoving(oldValue);
61        considerAdding(newValue);
62        concretePropertyChange(observedNodepropertyoldValuenewValue);
63    }
64
65    @Override
66    public final void listChange(NodeList<?> observedNodeListChangeType typeint indexNode nodeAddedOrRemoved) {
67        if (type == ListChangeType.REMOVAL) {
68            considerRemoving(nodeAddedOrRemoved);
69        } else if (type == ListChangeType.ADDITION) {
70            considerAdding(nodeAddedOrRemoved);
71        }
72        concreteListChange(observedNodetypeindexnodeAddedOrRemoved);
73    }
74
75    @Override
76    public void listReplacement(NodeList<?> observedNodeint indexNode oldNodeNode newNode) {
77        if (oldNode == newNode) {
78            return;
79        }
80        considerRemoving(oldNode);
81        considerAdding(newNode);
82        concreteListReplacement(observedNodeindexoldNodenewNode);
83    }
84
85    public void concretePropertyChange(Node observedNodeObservableProperty propertyObject oldValueObject newValue) {
86        // do nothing
87    }
88
89    public void concreteListChange(NodeList<?> observedNodeListChangeType typeint indexNode nodeAddedOrRemoved) {
90        // do nothing
91    }
92
93    public void concreteListReplacement(NodeList<?> observedNodeint indexNode oldValueNode newValue) {
94        // do nothing
95    }
96
97    @Override
98    public void parentChange(Node observedNodeNode previousParentNode newParent) {
99        // do nothing
100    }
101
102    private void considerRemoving(Object element) {
103        if (element instanceof Observable) {
104            if (((Observableelement).isRegistered(this)) {
105                ((Observableelement).unregister(this);
106            }
107        }
108    }
109
110    private void considerAdding(Object element) {
111        if (element instanceof Node) {
112            ((Nodeelement).registerForSubtree(this);
113        } else if (element instanceof Observable) {
114            ((Observableelement).register(this);
115        }
116    }
117
118}
119
MembersX
PropagatingAstObserver:listChange
PropagatingAstObserver:transformInPropagatingObserver:Block:concretePropertyChange
PropagatingAstObserver:transformInPropagatingObserver
PropagatingAstObserver:concretePropertyChange
PropagatingAstObserver:parentChange
PropagatingAstObserver:considerAdding
PropagatingAstObserver:considerRemoving
PropagatingAstObserver:concreteListChange
PropagatingAstObserver:concreteListReplacement
PropagatingAstObserver:listReplacement
PropagatingAstObserver:transformInPropagatingObserver:Block:concreteListChange
PropagatingAstObserver:transformInPropagatingObserver:Block:parentChange
PropagatingAstObserver:propertyChange
Members
X