~fredericp/zaluum/rt

« back to all changes in this revision

Viewing changes to org.zaluum.model/src/org/zaluum/model/ModelObject.java

  • Committer: Frederic Perez Ordeig
  • Date: 2010-04-07 07:55:38 UTC
  • mfrom: (308.1.63 wip-scala)
  • Revision ID: frederic@zaluum.com-20100407075538-muaneuoz134fqu5o
merged

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.zaluum.model;
 
2
 
 
3
import java.util.concurrent.CopyOnWriteArrayList;
 
4
 
 
5
import org.zaluum.util.Observable;
 
6
import org.zaluum.util.Observer;
 
7
 
 
8
public abstract class ModelObject<
 
9
                P extends ModelObject<?,?>,
 
10
                T extends ModelObject<?,?>>     
 
11
                implements 
 
12
                        Observable,FQNamable, Copyable<T>, ResourceKey{
 
13
        private P parent;
 
14
        private final CopyOnWriteArrayList<Observer> observers;
 
15
        
 
16
        public ModelObject() {
 
17
                parent =null;
 
18
                observers = new CopyOnWriteArrayList<Observer>();
 
19
        }
 
20
        public ModelObject(ModelObject<P, T> n) {
 
21
                observers = new CopyOnWriteArrayList<Observer>();
 
22
                parent =null;
 
23
        }
 
24
        public boolean isRoot(){
 
25
                return parent==null;
 
26
        }
 
27
        public P getParent(){
 
28
                return parent;
 
29
        }
 
30
        public void setParent(P parent){
 
31
                if (this.parent!=null){
 
32
                        this.parent.removeChild(this);
 
33
                }
 
34
                if (parent!=null){
 
35
                        this.parent = parent; 
 
36
                        parent.addChild(this);
 
37
                }
 
38
        }
 
39
        protected abstract void addChild(ModelObject<?,?> c);
 
40
        protected abstract void removeChild(ModelObject<?,?> c);
 
41
 
 
42
        public abstract <V extends ModelObject<?,?>> Iterable<V> getChildren();
 
43
        protected void notifyObservers(){
 
44
                for (Observer o : observers)
 
45
                        o.update();
 
46
        }
 
47
        
 
48
        @Override
 
49
        public void addObserver(Observer o) {
 
50
                if (!observers.contains(o))
 
51
                        observers.add(o);
 
52
        }
 
53
        @Override
 
54
        public void removeObserver(Observer o) {
 
55
                observers.remove(o);
 
56
        }
 
57
        protected void acceptVisitor(ModelVisitor visitor){
 
58
                for (ModelObject<?,?> c:  getChildren()){
 
59
                        c.acceptVisitor(visitor);
 
60
                }
 
61
        }
 
62
        public <V extends NamedObject<?, ?>> V getChildByName(String name, Iterable<V> it){
 
63
                for (V v : it){
 
64
                        if (v.getName().equals(name))
 
65
                                return v;
 
66
                }
 
67
                return null;
 
68
        }
 
69
}