Merge branch 'release/5.45.0'
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / common / MapWrapper.java
1 /**
2 * Copyright (C) 2009 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 package eu.etaxonomy.cdm.io.common;
10
11 import java.util.Collection;
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 org.apache.logging.log4j.LogManager;
19 import org.apache.logging.log4j.Logger;
20
21 import eu.etaxonomy.cdm.api.service.IService;
22 import eu.etaxonomy.cdm.model.common.CdmBase;
23
24 /**
25 * @author a.mueller
26 */
27 public class MapWrapper<T extends CdmBase> {
28
29 private static final Logger logger = LogManager.getLogger();
30
31 private Map internalMap;
32 private IService<CdmBase> service = null;
33
34 public MapWrapper(IService<CdmBase> service){
35 makeNewMap(service);
36 }
37
38 public void put(Object id, T cdmBase){
39 if (service != null){
40 throw new RuntimeException();
41 }else{
42 internalMap.put(id, cdmBase);
43 }
44 }
45
46 public void put(Object id, UUID uuid){
47 if (service == null){
48 throw new RuntimeException();
49 }else{
50 //TODO
51 //service.save(cdmBase);
52 internalMap.put(id, uuid);
53 }
54 }
55
56 public T get(Object id){
57 T result;
58 if (service == null){
59 result = (T)internalMap.get(id);
60 }else{
61 result = getObjectFromService(id);
62 }
63 return result;
64 }
65
66 /**
67 * Returns all values that are either stored in the wrapper or the database.
68 * If <code>service</code> is null then only the elements stored in the wrapper are returned.
69 * @return
70 */
71 public Set<T> getAllValues(){
72 Set<T> result = new HashSet<T>();
73 if (service == null){
74 result.addAll(internalMap.values());
75 }else{
76 result.addAll(internalMap.values());
77 logger.warn("getAll not yet implemented !!");
78 //TODO Set<T> persitentAll = service.getAll();
79 //result.addAll(persistentALl);
80 }
81 return result;
82 }
83
84 public boolean containsId(Object id){
85 return internalMap.containsKey(id);
86 }
87
88 public Collection<T> objects(){
89 //TODO from service
90 return internalMap.values();
91 }
92
93 private T getObjectFromService(Object id){
94 if (service == null){
95 throw new RuntimeException("no service defined");
96 }else{
97 T result = null;
98 UUID uuid = (UUID)internalMap.get(id);
99 if (uuid == null){
100 result = null;
101 }else{
102 //logger.warn(uuid);
103 //TODO
104 //result = (T)service.getObjectUuid(uuid); //.getCdmObjectByUuid(uuid);// taxonService.getTaxonByUuid(taxonUuid);
105 }
106 return result;
107 }
108 }
109
110 public boolean makeEmpty(){
111 return makeNewMap(service);
112 }
113
114 public boolean makeNewMap(IService<CdmBase> service){
115 if (service == null){
116 internalMap = new HashMap<Integer, CdmBase>();
117 }else{
118 this.service = service;
119 internalMap = new HashMap<Integer, UUID>();
120 }
121 return true;
122 }
123
124 public int size() {
125 return internalMap.size();
126 }
127
128 public Collection<T> objects(int start, int limit) {
129
130 Map internalPartMap = new HashMap<Integer, CdmBase>();
131 int index = 0;
132
133 for (int i = 0; i < limit; i++) {
134
135 int j = start + i;
136
137 Object object = internalMap.get(j);
138 if(object != null) {
139 internalPartMap.put(index, internalMap.get(j));
140 index++;
141 } else {
142 if (logger.isDebugEnabled()) { logger.debug("Object (" + j + ") is null"); }
143 }
144 }
145 return internalPartMap.values();
146 }
147
148
149 public Collection<T> removeObjects(int start, int limit) {
150
151 for (int i = start; i < start + limit; i++) {
152 internalMap.remove(i);
153 if (logger.isDebugEnabled()) { logger.debug("Object (" + i + ") removed"); }
154 }
155 return internalMap.values();
156 }
157
158
159 public Set<Object> keySet() {
160 return internalMap.keySet();
161 }
162
163 }