2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.model
.common
;
12 import java
.util
.HashMap
;
13 import java
.util
.HashSet
;
16 import java
.util
.UUID
;
22 public class EnumeratedTermVoc
<T
extends IEnumTerm
<T
>> {
24 private static Map
<Class
<?
extends IEnumTerm
<?
>>,EnumeratedTermVoc
<?
>> vocsMap
= new HashMap
<>();
26 private final Map
<T
,SingleEnumTerm
<T
>> lookup
= new HashMap
<>();
28 // public interface EnumTerm<R extends EnumTerm<?>> extends ISimpleTerm<R>{
29 // public String getKey();
32 private class SingleEnumTerm
<S
extends T
> implements IEnumTerm
<T
>{
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
;
42 private SingleEnumTerm(S term
, UUID uuid
, String defaultString
, String key
, S parent
){
44 this.label
= defaultString
;
48 SingleEnumTerm
<T
> parentSingleEnum
= lookup
.get(parent
);
49 if (parentSingleEnum
!= null){
50 parentSingleEnum
.children
.add(term
);
55 public UUID
getUuid() { return uuid
;}
57 public T
getKindOf() {return parent
;}
58 public T
getTerm() {return term
;}
60 public String
getKey() {return key
; }
63 public String
getMessage() {return getMessage(Language
.DEFAULT());}
66 public String
getMessage(Language language
) {
67 //TODO make multi-lingual
72 public Set
<T
> getGeneralizationOf() {
73 // return Collections.unmodifiableSet( children ); //TODO creates stack overflow
74 return new HashSet
<T
>(children
);
78 public boolean isKindOf(T ancestor
) {
79 if (parent
== null || ancestor
== null){
81 }else if (parent
.equals(ancestor
)){
84 return parent
.isKindOf(ancestor
);
89 public Set
<T
> getGeneralizationOf(boolean recursive
) {
90 Set
<T
> result
= new HashSet
<T
>();
91 result
.addAll(this.children
);
93 for (T child
: this.children
){
94 result
.addAll(child
.getGeneralizationOf(recursive
));
100 } //end of inner class
102 //******************* DELEGATE NETHODS ************************
104 public String
getKey(T term
) {return lookup
.get(term
).getKey();}
106 public UUID
getUuid(T term
) {return lookup
.get(term
).getUuid();}
108 public T
getKindOf(T term
) {return lookup
.get(term
).getKindOf();}
110 public Set
<T
> getGeneralizationOf(T term
) {return lookup
.get(term
).getGeneralizationOf();}
112 //******************* DELEGATE CLASS NETHODS ************************
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
<>());
119 IEnumTerm
<?
> myTerm
= vocsMap
.get(clazz
).add(term
, uuid
, defaultString
, key
, parent
);
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
));
128 if (containsUuid(lookup
, uuid
)){
129 throw new RuntimeException(String
.format("UUID must be unique in enumeration but was not for '%s'", uuid
));
131 lookup
.put((T
)term
, singleTerm
);
135 public boolean containsKey(Map
<T
, SingleEnumTerm
<T
>> lookup
, String key
) {
136 for (SingleEnumTerm
<T
> term
: lookup
.values()){
137 if (term
.getKey().equals(key
)){
144 public boolean containsUuid(Map
<T
, SingleEnumTerm
<T
>> lookup
, UUID uuid
) {
145 for (SingleEnumTerm
<T
> term
: lookup
.values()){
146 if (term
.getUuid().equals(uuid
)){
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
);
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
);
164 public T
getByKey(String key
) {
165 for (SingleEnumTerm
<T
> term
: lookup
.values()){
166 if (term
.getKey().equals(key
)){
167 return term
.getTerm();
173 public T
getByUuid(UUID uuid
) {
174 for (SingleEnumTerm
<T
> term
: lookup
.values()){
175 if (term
.getUuid().equals(uuid
)){
176 return term
.getTerm();
182 public static <R
extends IEnumTerm
<R
>> EnumeratedTermVoc
<R
> getVoc(Class
<R
> clazz
) {
183 return (EnumeratedTermVoc
<R
>)vocsMap
.get(clazz
);