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 }