Project

General

Profile

Download (5.12 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.term;
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
import eu.etaxonomy.cdm.model.common.Language;
19

    
20
/**
21
 * Helper class to handle enumeration terms similar to vocabularies.
22
 *
23
 * @author a.mueller
24
 */
25
public class EnumeratedTermVoc<T extends IEnumTerm<T>> {
26

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

    
29
	private final Map<T,SingleEnumTerm<T>> lookup = new HashMap<>();
30

    
31
//	public interface EnumTerm<R extends EnumTerm<?>> extends ISimpleTerm<R>{
32
//		public String getKey();
33
//	}
34

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

    
43

    
44

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

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

    
65
		@Override
66
		public String getMessage() {return getMessage(Language.DEFAULT());}
67

    
68
		@Override
69
		public String getMessage(Language language) {
70
			//TODO make multi-lingual
71
			return label;
72
		}
73

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

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

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

    
103
	} //end of inner class
104

    
105
//******************* DELEGATE NETHODS ************************
106

    
107
	public String getKey(T term) {return lookup.get(term).getKey();}
108

    
109
	public UUID getUuid(T term) {return lookup.get(term).getUuid();}
110

    
111
	public T getKindOf(T term) {return lookup.get(term).getKindOf();}
112

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

    
115
//******************* DELEGATE CLASS NETHODS ************************
116

    
117

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

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

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

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

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

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

    
166

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

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

    
185
	public static <R extends IEnumTerm<R>> EnumeratedTermVoc<R> getVoc(Class<R> clazz) {
186
		return (EnumeratedTermVoc<R>)vocsMap.get(clazz);
187
	}
188

    
189
}
(4-4/23)