1 16 package com.ibatis.sqlmap.engine.mapping.sql.dynamic.elements; 17 18 import java.io.PrintWriter ; 19 import java.io.StringWriter ; 20 import java.util.ArrayList ; 21 import java.util.HashMap ; 22 import java.util.LinkedList ; 23 import java.util.List ; 24 25 import com.ibatis.sqlmap.engine.mapping.parameter.ParameterMapping; 26 27 public class SqlTagContext { 28 29 private StringWriter sw; 30 private PrintWriter out; 31 32 private HashMap attributes; 33 34 private LinkedList removeFirstPrependStack; 35 private LinkedList iterateContextStack; 36 37 private ArrayList parameterMappings = new ArrayList (); 38 39 40 public SqlTagContext() { 41 sw = new StringWriter (); 42 out = new PrintWriter (sw); 43 attributes = new HashMap (); 44 removeFirstPrependStack = new LinkedList (); 45 iterateContextStack = new LinkedList (); 46 } 47 48 public PrintWriter getWriter() { 49 return out; 50 } 51 52 public String getBodyText() { 53 out.flush(); 54 return sw.getBuffer().toString(); 55 } 56 57 public void setAttribute(Object key, Object value) { 58 attributes.put(key, value); 59 } 60 61 public Object getAttribute(Object key) { 62 return attributes.get(key); 63 } 64 65 public void addParameterMapping(ParameterMapping mapping) { 66 parameterMappings.add(mapping); 67 } 68 69 public List getParameterMappings() { 70 return parameterMappings; 71 } 72 73 public boolean isEmptyRemoveFirtPrepend() { 74 return removeFirstPrependStack.size() <= 0; 75 } 76 77 81 public boolean peekRemoveFirstPrependMarker(SqlTag sqlTag) { 82 83 RemoveFirstPrependMarker removeFirstPrepend = 84 (RemoveFirstPrependMarker) removeFirstPrependStack.get(1); 85 86 return removeFirstPrepend.isRemoveFirstPrepend(); 87 } 88 89 95 public void popRemoveFirstPrependMarker(SqlTag tag) { 96 97 RemoveFirstPrependMarker removeFirstPrepend = 98 (RemoveFirstPrependMarker) removeFirstPrependStack.getFirst(); 99 100 if(tag == removeFirstPrepend.getSqlTag()) { 101 removeFirstPrependStack.removeFirst(); 102 } 103 } 104 105 110 public void pushRemoveFirstPrependMarker(SqlTag tag) { 111 112 if(tag.getHandler() instanceof DynamicTagHandler) { 113 if(tag.isPrependAvailable()) { 115 removeFirstPrependStack.addFirst( 116 new RemoveFirstPrependMarker(tag,true)); 117 } else { 118 removeFirstPrependStack.addFirst( 119 new RemoveFirstPrependMarker(tag,false)); 120 } 121 } else if("true".equals(tag.getRemoveFirstPrepend())){ 122 removeFirstPrependStack.addFirst( 126 new RemoveFirstPrependMarker(tag,true)); 127 } else if(!tag.isPrependAvailable() && 128 !"true".equals(tag.getRemoveFirstPrepend()) && 129 tag.getParent() != null) { 130 if("true".equals(tag.getParent().getRemoveFirstPrepend())) { 133 removeFirstPrependStack.addFirst( 134 new RemoveFirstPrependMarker(tag,true)); 135 } 136 } else { 137 removeFirstPrependStack.addFirst( 138 new RemoveFirstPrependMarker(tag,false)); 139 } 140 141 } 142 143 147 public void disableRemoveFirstPrependMarker() { 148 ((RemoveFirstPrependMarker) removeFirstPrependStack.get(1)).setRemoveFirstPrepend(false); 149 } 150 151 157 public void pushIterateContext(IterateContext iterateContext) { 158 iterateContextStack.addFirst(iterateContext); 159 } 160 161 167 public IterateContext popIterateContext() { 168 IterateContext retVal = null; 169 if(!iterateContextStack.isEmpty()) { 170 retVal = (IterateContext)iterateContextStack.removeFirst(); 171 } 172 return retVal; 173 } 174 175 181 public IterateContext peekIterateContext() { 182 IterateContext retVal = null; 183 if(!iterateContextStack.isEmpty()) { 184 retVal = (IterateContext)iterateContextStack.getFirst(); 185 } 186 return retVal; 187 } 188 189 } 190 191 199 class RemoveFirstPrependMarker { 200 201 private boolean removeFirstPrepend; 202 private SqlTag tag; 203 204 207 public RemoveFirstPrependMarker(SqlTag tag, boolean removeFirstPrepend) { 208 this.removeFirstPrepend = removeFirstPrepend; 209 this.tag = tag; 210 } 211 212 215 public boolean isRemoveFirstPrepend() { 216 return removeFirstPrepend; 217 } 218 219 222 public void setRemoveFirstPrepend(boolean removeFirstPrepend) { 223 this.removeFirstPrepend = removeFirstPrepend; 224 } 225 226 229 public SqlTag getSqlTag() { 230 return tag; 231 } 232 233 } | Popular Tags |