1 20 package org.enhydra.barracuda.contrib.sam.models; 21 22 import java.util.*; 23 import java.text.*; 24 25 import org.enhydra.barracuda.core.comp.*; 26 import org.enhydra.barracuda.core.event.*; 27 28 import org.apache.log4j.*; 29 30 36 public class MapDecorator extends TemplateModelDecorator { 37 38 protected static Logger logger = Logger.getLogger(MapDecorator.class); 39 protected Map mapping; 40 41 public MapDecorator(TemplateModel tm) { 42 super(tm); 43 } 44 45 50 public MapDecorator(TemplateModel tm, Map mapping) { 51 super(tm); 52 setMapping(mapping); 53 } 54 55 public void setMapping(Map mapping) { 56 this.mapping = mapping; 57 if (logger.isDebugEnabled()) { 58 Iterator iter = mapping.entrySet().iterator(); 59 while (iter.hasNext()) { 60 Map.Entry entry = (Map.Entry)iter.next(); 61 logger.debug("Mapping table: key: " + entry.getKey() + " value: " + entry.getValue()); 62 } 63 } 64 } 65 66 82 public Object getItem(TemplateDirective td) { String key = td.getKeyName(); 86 logger.debug("getItem called, td : "+td); Object value = _templateModel.getItem(td); logger.debug("_templateModels's getItem called, value : "+value); 91 Object mapper = mapping.get(key); 92 if (logger.isDebugEnabled()) { 93 if (mapper==null) { 94 logger.debug("mapper is null"); 95 } else { 96 logger.debug("mapper's class is " + mapper.getClass().getName()); 97 } 98 } 99 100 if (mapper instanceof Map) { 101 value=mapItemAsLookup(key, _templateModel.getItem(td), (Map)mapper ); } else if (mapper instanceof NumberFormat) { 104 value=mapItemAsNumberFormat(key, _templateModel.getItem(td), (NumberFormat)mapper ); } else if (mapper instanceof DateFormat) { 107 value=mapItemAsDateFormat(key, _templateModel.getItem(td), (DateFormat)mapper ); } else if (mapper instanceof ControlEvent) { 110 value=mapItemAsEvent(key, _templateModel.getItem(td), (ControlEvent) mapper); } else if (mapper instanceof Link) { 113 value=mapItemAsLink(td, (Link) mapper); } else if (mapper instanceof UserMapping) { 116 value = mapItemAsUserMapping(key, (UserMapping)mapper); 117 } else if (mapper instanceof String ) { 118 value = mapper; 119 } else { 120 if (mapper == null) { 121 logger.info("mapper is null"); 122 } else { 123 logger.error("invalid mapper class: " + mapper.getClass().getName()); 124 } 125 } 126 return value; 127 } 128 129 private Object mapItemAsUserMapping(String key, UserMapping um) { 130 logger.debug("processing UserMapping"); 131 Object value=um.get(key, _templateModel); 132 logger.debug("got from UserMapping: " + value); 133 return value; 134 } 135 136 137 private Object mapItemAsLookup(String key, Object value, Map lookup) { 138 Object ret = lookup.get(value); 139 logger.debug("mapItemAsLookup " + key + " value " + value.getClass().getName()+ " ret " + ret); 140 logger.debug("lookup: "+ lookup); 141 if (ret == null) { 142 ret = lookup.get("default"); 143 if (ret == null) ret = value; 144 } 145 return ret; 146 } 147 148 private Object mapItemAsNumberFormat(String key, Object value, NumberFormat format) { 149 double d; 150 if (value instanceof String ) { 151 d = Double.parseDouble((String )value); 152 } else if (value instanceof Double ) { 153 d = ((Double )value).doubleValue(); 154 } else { 155 logger.warn("no number conversion possible: key : " + key + " value: " + value); 156 return value; 157 } 158 return format.format(d); 159 } 160 161 private Object mapItemAsDateFormat(String key, Object value, DateFormat format) { 162 java.util.Date d; 163 if (value instanceof String ) { 164 DateFormat dateFormatIn = new SimpleDateFormat(); 165 try { 166 d = dateFormatIn.parse((String )value); 167 } catch (ParseException ex) { 168 logger.error(ex.getMessage(), ex); 169 return value; 170 } 171 } else if (value instanceof java.util.Date ) { 172 d = (java.util.Date )value; 173 } else { 174 logger.warn("no number conversion possible: key : " + key + " value: " + value); 175 return value; 176 } 177 return format.format(d); 178 } 179 180 private Object mapItemAsEvent(String key, Object value, ControlEvent event) { 181 BAction ret = new BLink((String )value, event); 182 ret.setParam(key, (String )value); 183 return ret; 184 } 185 186 private Object mapItemAsLink(TemplateDirective td, Link link) { logger.debug("building link to " + link.getEvent().getClass().getName()); 189 String label = link.getLabel(); 190 if (!link.isLabelStatic()) { 191 label = (String )_templateModel.getItem(new TemplateDirective(td.getCommand(), td.getModelName(), label, td.getKeyData())); } 194 195 BAction ret; 196 if (label == null) { 197 ret = new BAction(link.getEvent()); 198 } else { 199 ret = new BLink(label, link.getEvent()); 200 } 201 202 Iterator iter = link.getIterator(); 204 while (iter.hasNext()) { 205 Map.Entry entry = (Map.Entry) iter.next(); 206 String k = (String ) entry.getKey(); 207 StringBoolCompound c = (StringBoolCompound) entry.getValue(); 208 209 String v = c.getString(); 210 if (!c.getBool()) { 211 v = (String ) _templateModel.getItem(new TemplateDirective(td.getCommand(), td.getModelName(), v, td.getKeyData())); } 214 ret.setParam(k, v); 215 logger.debug("setting link parameter " +k+ " to " + v); 216 217 } 218 return ret; 219 } 220 221 public static class Link { 222 protected ControlEvent event; 223 protected String label; 224 protected boolean isLabelStatic; 225 226 protected Map parameters = new HashMap(); 227 228 public Link(ControlEvent event, String label, boolean isLabelStatic) { 229 this.event = event; 230 this.label = label; 231 this.isLabelStatic = isLabelStatic; 232 } 233 234 public String getLabel() { 235 return label; 236 } 237 238 public ControlEvent getEvent() { 239 return event; 240 } 241 242 public boolean isLabelStatic() { 243 return isLabelStatic; 244 } 245 246 public Link addParameter(String key, String value, boolean isStatic) { 247 parameters.put(key, new StringBoolCompound(value, isStatic)); 248 return this; 249 } 250 251 public Iterator getIterator() { 252 return parameters.entrySet().iterator(); 253 } 254 } 255 256 public static class StringBoolCompound { 257 protected String string; 258 protected boolean bool; 259 public StringBoolCompound(String string, boolean bool) { 260 this.string = string; 261 this.bool = bool; 262 } 263 264 public String getString() { 265 return string; 266 } 267 268 public boolean getBool() { 269 return bool; 270 } 271 } 272 273 274 public static interface UserMapping { 275 public Object get(String s, TemplateModel tm ); 276 } 277 278 } 279 | Popular Tags |