Project

General

Profile

Download (5.19 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9

    
10
package eu.etaxonomy.cdm.model.common;
11

    
12
import java.util.HashMap;
13
import java.util.HashSet;
14
import java.util.Map;
15
import java.util.Set;
16
import java.util.UUID;
17

    
18
/**
19
 * @author a.mueller
20
 *
21
 */
22
public class EnumeratedTermVoc<T extends IEnumTerm<T>> {
23

    
24
	private static Map<Class<? extends IEnumTerm<?>>,EnumeratedTermVoc<?>> vocsMap= new HashMap<>();
25

    
26
	private final Map<T,SingleEnumTerm<T>> lookup = new HashMap<>();
27

    
28
//	public interface EnumTerm<R extends EnumTerm<?>> extends ISimpleTerm<R>{
29
//		public String getKey();
30
//	}
31

    
32
	private class SingleEnumTerm<S extends T> implements IEnumTerm<T>{
33
		private final S term;
34
		private final String label;
35
		private final UUID uuid;
36
		private final String key;
37
		private final Set<S> children = new HashSet<S>();
38
		private final S parent;
39

    
40

    
41

    
42
		private	SingleEnumTerm(S term, UUID uuid, String defaultString, String key, S parent){
43
			this.term = term;
44
			this.label = defaultString;
45
			this.key = key;
46
			this.uuid = uuid;
47
			this.parent = parent;
48
			SingleEnumTerm<T> parentSingleEnum = lookup.get(parent);
49
			if (parentSingleEnum != null){
50
				parentSingleEnum.children.add(term);
51
			}
52
		}
53

    
54
		@Override
55
		public UUID getUuid() {	return uuid;}
56
		@Override
57
		public T getKindOf() {return parent;}
58
		public T getTerm() {return term;}
59
		@Override
60
		public String getKey() {return key;	}
61

    
62
		@Override
63
		public String getMessage() {return getMessage(Language.DEFAULT());}
64

    
65
		@Override
66
		public String getMessage(Language language) {
67
			//TODO make multi-lingual
68
			return label;
69
		}
70

    
71
		@Override
72
		public Set<T> getGeneralizationOf() {
73
//			return Collections.unmodifiableSet( children );   //TODO creates stack overflow
74
			return new HashSet<T>(children);
75
		}
76

    
77
		@Override
78
		public boolean isKindOf(T ancestor) {
79
			if (parent == null || ancestor == null){
80
				return false;
81
			}else if (parent.equals(ancestor)){
82
				return true;
83
			}else{
84
				return parent.isKindOf(ancestor);
85
			}
86
		}
87

    
88
		@Override
89
		public Set<T> getGeneralizationOf(boolean recursive) {
90
			Set<T> result = new HashSet<T>();
91
			result.addAll(this.children);
92
			if (recursive){
93
				for (T child : this.children){
94
					result.addAll(child.getGeneralizationOf(recursive));
95
				}
96
			}
97
			return result;
98
		}
99

    
100
	} //end of inner class
101

    
102
//******************* DELEGATE NETHODS ************************
103

    
104
	public String getKey(T term) {return lookup.get(term).getKey();}
105

    
106
	public UUID getUuid(T term) {return lookup.get(term).getUuid();}
107

    
108
	public T getKindOf(T term) {return lookup.get(term).getKindOf();}
109

    
110
	public Set<T> getGeneralizationOf(T term) {return lookup.get(term).getGeneralizationOf();}
111

    
112
//******************* DELEGATE CLASS NETHODS ************************
113

    
114

    
115
	public static <S extends IEnumTerm<?>> IEnumTerm<?> addTerm(Class<? extends IEnumTerm<?>> clazz, S term, UUID uuid, String defaultString, String key, S parent){
116
		if (vocsMap.get(clazz) == null){
117
			vocsMap.put(clazz, new EnumeratedTermVoc<>());
118
		}
119
		IEnumTerm<?> myTerm = vocsMap.get(clazz).add(term, uuid, defaultString, key, parent);
120
		return myTerm;
121
	}
122

    
123
	private  SingleEnumTerm<T> add(ISimpleTerm<?> term, UUID uuid, String defaultString, String key, ISimpleTerm<?> parent) {
124
		SingleEnumTerm<T> singleTerm = new SingleEnumTerm<T>((T)term, uuid, defaultString, key, (T)parent);
125
		if (containsKey(lookup, key)){
126
			throw new RuntimeException(String.format("Key must be unique in enumeration but was not for '%s'", key));
127
		}
128
		if (containsUuid(lookup, uuid)){
129
			throw new RuntimeException(String.format("UUID must be unique in enumeration but was not for '%s'", uuid));
130
		}
131
		lookup.put((T)term, singleTerm);
132
		return singleTerm;
133
	}
134

    
135
	public boolean containsKey(Map<T, SingleEnumTerm<T>> lookup, String key) {
136
		for (SingleEnumTerm<T> term : lookup.values()){
137
			if (term.getKey().equals(key)){
138
				return true;
139
			}
140
		}
141
		return false;
142
	}
143

    
144
	public boolean containsUuid(Map<T, SingleEnumTerm<T>> lookup, UUID uuid) {
145
		for (SingleEnumTerm<T> term : lookup.values()){
146
			if (term.getUuid().equals(uuid)){
147
				return true;
148
			}
149
		}
150
		return false;
151
	}
152

    
153
	public static <R extends IEnumTerm<R>> R byKey(Class<R> clazz, String key) {
154
		EnumeratedTermVoc<R> voc = getVoc(clazz);
155
		return voc == null? null:voc.getByKey(key);
156
	}
157

    
158
	public static <R extends IEnumTerm<R>> R byUuid(Class<R> clazz, UUID uuid) {
159
		EnumeratedTermVoc<R> voc = getVoc(clazz);
160
		return voc == null? null:voc.getByUuid(uuid);
161
	}
162

    
163

    
164
	public T getByKey(String key) {
165
		for (SingleEnumTerm<T> term : lookup.values()){
166
			if (term.getKey().equals(key)){
167
				return term.getTerm();
168
			}
169
		}
170
		return null;
171
	}
172

    
173
	public T getByUuid(UUID uuid) {
174
		for (SingleEnumTerm<T> term : lookup.values()){
175
			if (term.getUuid().equals(uuid)){
176
				return term.getTerm();
177
			}
178
		}
179
		return null;
180
	}
181

    
182
	public static <R extends IEnumTerm<R>> EnumeratedTermVoc<R> getVoc(Class<R> clazz) {
183
		return (EnumeratedTermVoc<R>)vocsMap.get(clazz);
184
	}
185

    
186
}
(10-10/83)