1 package com.leonarduk.clearcheckbook.dto;
2
3 import java.awt.List;
4 import java.util.ArrayList;
5 import java.util.Arrays;
6 import java.util.HashMap;
7 import java.util.Map;
8
9 import org.apache.log4j.Logger;
10
11 import com.leonarduk.clearcheckbook.ClearcheckbookException;
12
13 abstract public class AbstractDataType<U extends AbstractDataType<?>> {
14
15 public enum ControlField {
16 ID, LIMIT, PAGE
17 }
18
19 private static final Logger _logger = Logger
20 .getLogger(AbstractDataType.class);
21
22 /***
23 * @return the fieldsMap
24 */
25 protected Map<String, String> getFieldsMap() {
26 return fieldsMap;
27 }
28
29 /***
30 * Helper method for use in get method.
31 *
32 * @param id
33 * @return
34 */
35 public static ParsedNameValuePair getIdParameter(long id) {
36 return new ParsedNameValuePair(ControlField.ID.name().toLowerCase(),
37 String.valueOf(id));
38 };
39
40 public static ParsedNameValuePair getLimitParameter(int limit) {
41 return new ParsedNameValuePair(ControlField.LIMIT.name().toLowerCase(),
42 String.valueOf(limit));
43 }
44
45 public static ParsedNameValuePair getPageParameter(int page) {
46 return new ParsedNameValuePair(ControlField.PAGE.name().toLowerCase(),
47 String.valueOf(page));
48 }
49
50 final private Map<String, String> fieldsMap;
51
52 protected AbstractDataType() {
53 this.fieldsMap = new HashMap<String, String>();
54 }
55
56 public AbstractDataType(Map<String, String> map) {
57 this.fieldsMap = map;
58 }
59
60 public AbstractDataType(U original) {
61 this(original.getFieldsMap());
62 }
63
64 protected void addField(Enum<?> field, String value) {
65 this.getFieldsMap().put(field.name().toLowerCase(), value);
66 }
67
68 @Override
69 public boolean equals(Object obj) {
70 if (null == obj || !obj.getClass().equals(this.getClass())) {
71 _logger.info("not equal " + this + " vs " + obj);
72 return false;
73 }
74 @SuppressWarnings("unchecked")
75 U that = (U) obj;
76 Enum<?>[] fields = getFields();
77 ArrayList<Enum> ignore = getFieldsToIgnoreInEqualsMethod();
78 for (int i = 0; i < fields.length; i++) {
79 if (!ignore.contains(fields[i])
80 && !getNonNullValue(fields[i]).equals(
81 that.getNonNullValue(fields[i]))) {
82 _logger.info(fields[i].name() + " don't match. This:"
83 + getNonNullValue(fields[i]) + " vs That:"
84 + that.getNonNullValue(fields[i]));
85 return false;
86 }
87 }
88 return true;
89 }
90
91 @SuppressWarnings("rawtypes")
92 protected ArrayList<Enum> getFieldsToIgnoreInEqualsMethod() {
93 return new ArrayList<Enum>();
94 }
95
96 protected Boolean getBooleanValue(Enum<?> field) {
97 String value = getValue(field);
98 if (null == value)
99 return null;
100 return Boolean.valueOf(value);
101 }
102
103 protected Double getDoubleValue(Enum<?> field) {
104 String value = getValue(field);
105 if (null == value)
106 return null;
107 return Double.valueOf(value);
108 }
109
110 protected Enum<?>[] getEditFields() {
111 throw new IllegalArgumentException("Not implemented");
112 }
113
114 public ParsedNameValuePair[] getEditParameters() {
115 Enum<?>[] insertFields = getEditFields();
116 return getParameters(insertFields);
117 }
118
119 abstract protected Enum<?>[] getFields();
120
121 public long getId() {
122 String value = getIdParameter().getValue();
123 if (null == value) {
124 return 0;
125 }
126 return Long.valueOf(value);
127 }
128
129 public ParsedNameValuePair getIdParameter() {
130 return getNameValuePair(ControlField.ID);
131 }
132
133 protected Enum<?>[] getInsertFields() {
134 throw new IllegalArgumentException("Not implemented");
135 }
136
137 public ParsedNameValuePair[] getInsertParameters() {
138 Enum<?>[] insertFields = getInsertFields();
139 return getParameters(insertFields);
140 }
141
142 protected Integer getIntegerValue(Enum<?> field) {
143 String value = getValue(field);
144 if (null == value)
145 return null;
146 return Integer.valueOf(value);
147 }
148
149 protected Long getLongValue(Enum<?> field) {
150 String value = getValue(field);
151 if (null == value)
152 return 0L;
153 return Long.valueOf(value);
154 }
155
156 /***
157 *
158 * @param field
159 * @return
160 */
161 protected ParsedNameValuePair getNameValuePair(Enum<?> field) {
162 String lowerKey = field.name().toLowerCase();
163 ParsedNameValuePair nameValuePair = new ParsedNameValuePair(lowerKey,
164 getValue(lowerKey));
165 _logger.debug("getNameValuePair : " + lowerKey + " -> " + nameValuePair);
166 return nameValuePair;
167 }
168
169 protected String getNonNullValue(Enum<?> fields) {
170 String value = getValue(fields);
171 if (null == value) {
172 return "";
173 }
174 return value;
175 }
176
177 private ParsedNameValuePair[] getParameters(Enum<?>[] fields) {
178 ParsedNameValuePair[] parameters = new ParsedNameValuePair[fields.length];
179 for (int i = 0; i < fields.length; i++) {
180 parameters[i] = getNameValuePair(fields[i]);
181 }
182 _logger.debug("getParameters: " + Arrays.asList(parameters));
183 return parameters;
184 }
185
186 protected String getValue(Enum<?> field) {
187 String key = field.name().toLowerCase();
188 return getValue(key);
189 }
190
191 protected String getValue(String key) {
192 String value = this.getFieldsMap().get(key);
193 _logger.debug("getValue : " + key + "=" + value);
194 return value;
195 }
196
197 public String[] getValues() throws ClearcheckbookException {
198 Enum<?>[] fields = getFields();
199 String[] values = new String[fields.length];
200 for (int i = 0; i < values.length; i++) {
201 values[i] = getNonNullValue(fields[i]);
202 }
203 return values;
204 }
205
206 protected void setIntValueFromBooleanString(Enum<?> field, String value) {
207 _logger.debug("setIntValueFromBooleanString: " + field.name() + "="
208 + value);
209 switch (value) {
210 case "false":
211 value = "0";
212 break;
213 case "true":
214 value = "1";
215 break;
216 }
217 _logger.debug("setIntValueFromBooleanString: " + field.name() + "="
218 + value);
219 setValue(field, value);
220 }
221
222 protected void setValue(Enum<?> field, Object value) {
223 if (null == value || value.equals("")) {
224 this.getFieldsMap().put(field.name().toLowerCase(), null);
225 } else {
226 this.getFieldsMap().put(field.name().toLowerCase(),
227 value.toString());
228 }
229 }
230
231 @Override
232 public String toString() {
233 return "AbstractDataType [fieldsMap=" + getFieldsMap() + "]";
234 }
235
236 }