3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
11 package eu
.etaxonomy
.cdm
.model
.common
;
13 import java
.util
.HashMap
;
14 import java
.util
.HashSet
;
17 import java
.util
.UUID
;
23 public class EnumeratedTermVoc
<T
extends IEnumTerm
<T
>> {
25 private static Map
<Class
<?
extends IEnumTerm
<?
>>,EnumeratedTermVoc
<?
>> vocsMap
= new HashMap
<Class
<?
extends IEnumTerm
<?
>>, EnumeratedTermVoc
<?
>>();
27 private final Map
<T
,SingleEnumTerm
<T
>> lookup
= new HashMap
<T
, SingleEnumTerm
<T
>>();
29 // public interface EnumTerm<R extends EnumTerm<?>> extends ISimpleTerm<R>{
30 // public String getKey();
33 private class SingleEnumTerm
<S
extends T
> implements IEnumTerm
<T
>{
38 private Set
<S
> children
= new HashSet
<S
>();
43 private SingleEnumTerm(S term
, UUID uuid
, String defaultString
, String key
, S parent
){
45 this.label
= defaultString
;
49 SingleEnumTerm
<T
> parentSingleEnum
= lookup
.get(parent
);
50 if (parentSingleEnum
!= null){
51 parentSingleEnum
.children
.add(term
);
56 public UUID
getUuid() { return uuid
;}
58 public T
getKindOf() {return parent
;}
59 public T
getTerm() {return term
;}
61 public String
getKey() {return key
; }
64 public String
getMessage() {return getMessage(Language
.DEFAULT());}
67 public String
getMessage(Language language
) {
68 //TODO make multi-lingual
73 public Set
<T
> getGeneralizationOf() {
74 // return Collections.unmodifiableSet( children ); //TODO creates stack overflow
75 return new HashSet
<T
>(children
);
79 public boolean isKindOf(T ancestor
) {
80 if (parent
== null || ancestor
== null){
82 }else if (parent
.equals(ancestor
)){
85 return parent
.isKindOf(ancestor
);
90 public Set
<T
> getGeneralizationOf(boolean recursive
) {
91 Set
<T
> result
= new HashSet
<T
>();
92 result
.addAll(this.children
);
94 for (T child
: this.children
){
95 result
.addAll(child
.getGeneralizationOf());
101 } //end of inner class
103 //******************* DELEGATE NETHODS ************************
105 public String
getKey(T term
) {return lookup
.get(term
).getKey();}
107 public UUID
getUuid(T term
) {return lookup
.get(term
).getUuid();}
109 public T
getKindOf(T term
) {return lookup
.get(term
).getKindOf();}
111 public Set
<T
> getGeneralizationOf(T term
) {return lookup
.get(term
).getGeneralizationOf();}
113 //******************* DELEGATE CLASS NETHODS ************************
116 public static <S
extends IEnumTerm
<?
>> IEnumTerm
addTerm(Class
<?
extends IEnumTerm
<?
>> clazz
, S term
, UUID uuid
, String defaultString
, String key
, S parent
){
117 if (vocsMap
.get(clazz
) == null){
118 vocsMap
.put(clazz
, new EnumeratedTermVoc());
120 IEnumTerm myTerm
= vocsMap
.get(clazz
).add(term
, uuid
, defaultString
, key
, parent
);
124 private SingleEnumTerm
<T
> add(ISimpleTerm
<?
> term
, UUID uuid
, String defaultString
, String key
, ISimpleTerm
<?
> parent
) {
125 SingleEnumTerm
<T
> singleTerm
= new SingleEnumTerm
<T
>((T
)term
, uuid
, defaultString
, key
, (T
)parent
);
126 if (containsKey(lookup
, key
)){
127 throw new RuntimeException(String
.format("Key must be unique in enumeration but was not for '%s'", key
));
129 if (containsUuid(lookup
, uuid
)){
130 throw new RuntimeException(String
.format("UUID must be unique in enumeration but was not for '%s'", uuid
));
132 lookup
.put((T
)term
, singleTerm
);
136 public boolean containsKey(Map
<T
, SingleEnumTerm
<T
>> lookup
, String key
) {
137 for (SingleEnumTerm
<T
> term
: lookup
.values()){
138 if (term
.getKey().equals(key
)){
145 public boolean containsUuid(Map
<T
, SingleEnumTerm
<T
>> lookup
, UUID uuid
) {
146 for (SingleEnumTerm
<T
> term
: lookup
.values()){
147 if (term
.getUuid().equals(uuid
)){
154 public static <R
extends IEnumTerm
<R
>> R
byKey(Class
<R
> clazz
, String key
) {
155 EnumeratedTermVoc
<R
> voc
= getVoc(clazz
);
156 return voc
== null?
null:voc
.getByKey(key
);
159 public static <R
extends IEnumTerm
<R
>> R
byUuid(Class
<R
> clazz
, UUID uuid
) {
160 EnumeratedTermVoc
<R
> voc
= getVoc(clazz
);
161 return voc
== null?
null:voc
.getByUuid(uuid
);
165 public T
getByKey(String key
) {
166 for (SingleEnumTerm
<T
> term
: lookup
.values()){
167 if (term
.getKey().equals(key
)){
168 return term
.getTerm();
174 public T
getByUuid(UUID uuid
) {
175 for (SingleEnumTerm
<T
> term
: lookup
.values()){
176 if (term
.getUuid().equals(uuid
)){
177 return term
.getTerm();
183 public static <R
extends IEnumTerm
<R
>> EnumeratedTermVoc
<R
> getVoc(Class
<R
> clazz
) {
184 return (EnumeratedTermVoc
<R
>)vocsMap
.get(clazz
);