KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > de > gulden > framework > amoda > generic > data > GenericCompositeGroup


1 /*
2  * Project: AMODA - Abstract Modeled Application
3  * Class: de.gulden.framework.amoda.generic.data.GenericCompositeGroup
4  * Version: snapshot-beautyj-1.1
5  *
6  * Date: 2004-09-29
7  *
8  * This is a snapshot version of the AMODA 0.2 development branch,
9  * it is not released as a seperate version.
10  * For AMODA, see http://amoda.berlios.de/.
11  *
12  * This is licensed under the GNU Lesser General Public License (LGPL)
13  * and comes with NO WARRANTY.
14  *
15  * Author: Jens Gulden
16  * Email: amoda@jensgulden.de
17  */

18
19 package de.gulden.framework.amoda.generic.data;
20
21 import de.gulden.framework.amoda.generic.behaviour.*;
22 import de.gulden.framework.amoda.generic.core.GenericApplicationMemberAbstract;
23 import de.gulden.framework.amoda.model.data.*;
24 import de.gulden.framework.amoda.model.data.CompositeGroup;
25 import java.lang.*;
26 import java.util.*;
27
28 /**
29  * Class GenericCompositeGroup.
30  *
31  * @author Jens Gulden
32  * @version snapshot-beautyj-1.1
33  */

34 public class GenericCompositeGroup extends GenericApplicationMemberAbstract implements CompositeGroup {
35
36     // ------------------------------------------------------------------------
37
// --- field ---
38
// ------------------------------------------------------------------------
39

40     public Map all = new de.gulden.util.OrderedHashMap();
41
42
43     // ------------------------------------------------------------------------
44
// --- methods ---
45
// ------------------------------------------------------------------------
46

47     public void add(CompositeMember member) {
48         member.setParent(this);
49         all.put(member.getId(),member);
50     }
51
52     public void clear() {
53         for (Iterator it=all.values().iterator();it.hasNext();) {
54             CompositeMember m=(CompositeMember)it.next();
55             m.setParent(null);
56         }
57         all.clear();
58     }
59
60     public CompositeMember get(String JavaDoc id) {
61         CompositeMember result = get(id,true);
62         if (result == null) {
63             if (id.indexOf('.')!=-1) {
64                 result = getAbsolute(id);
65             }
66            }
67         return result;
68     }
69
70     public CompositeMember get(String JavaDoc id, boolean deep) {
71         CompositeMember m=(CompositeMember)getAll().get(id); // NO Direct access on all to allow overwriting getAll()
72
if ((m==null)&&(deep)) {
73             for (Iterator it=getGroups().values().iterator();it.hasNext();) {
74                 CompositeGroup g=(CompositeGroup)it.next();
75                 m=g.get(id,true);
76                 if (m!=null) {
77                     return m;
78                 }
79             }
80         }
81         return m;
82     }
83
84     public Map getAll(Class JavaDoc type, boolean deep) {
85         // type may be null
86
de.gulden.util.OrderedHashMap all=(de.gulden.util.OrderedHashMap)getAll(); // don't use this.all, as getAll might be re-implemented
87
Map map=(Map)all.clone();
88         if (type!=null) {
89             for (Iterator it=all.values().iterator();it.hasNext();) {
90                 Object JavaDoc o=it.next();
91                 if (!type.isAssignableFrom(o.getClass())) {
92                     map.remove(((CompositeMember)o).getId());
93                 }
94             }
95         }
96         if (deep) {
97             Map groups=getGroups();
98             for (Iterator it=groups.values().iterator();it.hasNext();) {
99                 CompositeGroup g=(CompositeGroup)it.next();
100                 map.putAll(g.getAll(type,true));
101             }
102         }
103         return map;
104     }
105
106     public Map getEntries() {
107         Map map=(Map)((de.gulden.util.OrderedHashMap)all).clone();
108         for (Iterator it=all.values().iterator();it.hasNext();) {
109             Object JavaDoc o=it.next();
110             if (o instanceof CompositeGroup) {
111                 map.remove(((CompositeMember)o).getId());
112             }
113         }
114         return map;
115     }
116
117     public Map getGroups() {
118         Map map=(Map)((de.gulden.util.OrderedHashMap)all).clone();
119         for (Iterator it=all.values().iterator();it.hasNext();) {
120             Object JavaDoc o=it.next();
121             if (!(o instanceof CompositeGroup)) {
122                 map.remove(((CompositeMember)o).getId());
123             }
124         }
125         return map;
126     }
127
128     public Map getAll() {
129         return all;
130     }
131
132     public void setAll(Map _all) {
133         clear();
134         addAll(_all.values());
135     }
136
137     public void addAll(Collection members) {
138         for (Iterator it=members.iterator();it.hasNext();) {
139             CompositeMember member=(CompositeMember)it.next();
140             this.add(member);
141         }
142     }
143
144     public int countMaxDepth() {
145         de.gulden.framework.amoda.generic.behaviour.GenericCondition cond=new de.gulden.framework.amoda.generic.behaviour.GenericCondition() {
146             public boolean test() {
147                 return true;
148             }
149         };
150         return countMaxDepth(cond);
151     }
152
153     public int countMaxDepth(GenericCondition cond) {
154         int depth=0;
155         Map subGroups=getGroups();
156         for (Iterator it=subGroups.values().iterator();it.hasNext();) {
157             GenericCompositeGroup g=(GenericCompositeGroup)it.next();
158             if (cond.test(g)) {
159                 int gDepth=g.countMaxDepth(cond);
160                 if ((gDepth>0)&&((gDepth+1)>depth)) {
161                     depth=gDepth+1;
162                 }
163             }
164         }
165         if (depth==0) { // no groups, or only empty ones
166
Map m=getEntries();
167             for (Iterator it=m.values().iterator();(depth==0)&&it.hasNext();) {
168                 if (cond.test(it.next())) {
169                     depth=1; // set to 1 constantly to indicate that this group has art leaat one element
170
}
171             }
172         }
173         return depth;
174     }
175
176     protected CompositeMember getAbsolute(String JavaDoc id) {
177         StringTokenizer st=new StringTokenizer(id,".",false);
178         String JavaDoc tok=st.nextToken();
179         CompositeGroup g=this;
180         while (st.hasMoreTokens()) { // not last entry yet: group name
181
Object JavaDoc member=g.get(tok,false);
182             if (member instanceof CompositeGroup) {
183                 g=(CompositeGroup)member; // drill into child group
184
} else { // also covers case member==null
185
return null;
186             }
187             tok=st.nextToken();
188         }
189         return g.get(tok);
190     }
191
192 } // end GenericCompositeGroup
193
Popular Tags