View Javadoc

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 }