1 24 25 package org.aspectj.compiler.crosscuts.joinpoints; 26 27 import org.aspectj.compiler.base.ast.*; 28 import org.aspectj.util.FuzzyBoolean; 29 import java.util.*; 30 31 public abstract class JpPlanner { 32 public boolean isStaticPlanner() { return false; } 33 34 40 41 42 73 74 protected abstract FuzzyBoolean fastMatch(JoinPoint jp); 75 76 public boolean alwaysMatches(JoinPoint jp) { 77 return fastMatch(jp).alwaysTrue(); 78 } 79 80 public boolean sometimesMatches(JoinPoint jp) { 81 return fastMatch(jp).maybeTrue(); 82 } 83 84 public JpPlan makePlan(JoinPoint jp) { 85 FuzzyBoolean m = fastMatch(jp); 86 if (m.alwaysTrue()) { 87 return JpPlan.ANY_PLAN; 88 } else if (m.alwaysFalse()) { 89 return JpPlan.NO_PLAN; 90 } else { 91 jp.getCompiler().internalError("bad fastMatch result from " + this); 92 return JpPlan.NEVER_PLAN; 93 } 94 } 95 96 public JpPlanner or(JpPlanner other) { 97 return new OrJpPlanner(this, other); 98 } 99 public JpPlanner and(JpPlanner other) { 100 return new AndJpPlanner(this, other); 101 } 102 public JpPlanner not() { 103 List newList = new ArrayList(); 104 newList.add(this); 105 return new AndJpPlanner(Collections.EMPTY_LIST, newList); 106 } 107 public void walk(Object data) {} 108 109 110 public static final JpPlanner NO_PLANNER = new JpPlanner() { 111 public FuzzyBoolean fastMatch(JoinPoint jp) { 112 return FuzzyBoolean.NO; 113 } 114 }; 115 } 116 117 class OrJpPlanner extends JpPlanner { 118 List list; 119 120 public OrJpPlanner(List list) { 121 this.list = list; 122 } 123 124 public OrJpPlanner(JpPlanner p1, JpPlanner p2) { 125 list = new ArrayList(); 126 list.add(p1); list.add(p2); 127 } 128 129 public void walk(Object data) { 130 for (Iterator i = list.iterator(); i.hasNext(); ) { 131 JpPlanner p = (JpPlanner)i.next(); 132 p.walk(data); 133 } 134 } 135 136 public FuzzyBoolean fastMatch(JoinPoint jp) { 137 FuzzyBoolean ret = FuzzyBoolean.NO; 138 for (Iterator i = list.iterator(); i.hasNext(); ) { 139 JpPlanner p = (JpPlanner)i.next(); 140 ret = ret.or(p.fastMatch(jp)); 141 } 142 return ret; 143 } 144 145 public JpPlan makePlan(JoinPoint jp) { 146 JpPlan plan = JpPlan.NO_PLAN; 147 for (Iterator i = list.iterator(); i.hasNext(); ) { 148 JpPlanner p = (JpPlanner)i.next(); 149 plan = p.makePlan(jp).or(plan); 150 } 151 return plan; 152 } 153 154 public JpPlanner or(JpPlanner other) { 155 List newList = new ArrayList(list); 156 if (other instanceof OrJpPlanner) { 157 newList.addAll(((OrJpPlanner)other).list); 158 } else { 159 newList.add(other); 160 } 161 return new OrJpPlanner(newList); 162 } 163 164 public JpPlanner and(JpPlanner other) { 165 List newList = new ArrayList(list.size()); 166 for (Iterator i = list.iterator(); i.hasNext(); ) { 167 JpPlanner p = (JpPlanner)i.next(); 168 newList.add(p.and(other)); 169 } 170 return new OrJpPlanner(newList); 171 } 172 173 public JpPlanner not() { 174 List newList = new ArrayList(list.size()); 175 for (Iterator i = list.iterator(); i.hasNext(); ) { 177 JpPlanner p = (JpPlanner)i.next(); 178 newList.add(p.not()); 179 } 180 return new AndJpPlanner(newList, Collections.EMPTY_LIST); 181 } 182 183 public String toString() { 184 StringBuffer buf = new StringBuffer (); 185 186 for (Iterator i = list.iterator(); i.hasNext(); ) { 187 JpPlanner p = (JpPlanner)i.next(); 188 buf.append(p.toString()); 189 if (i.hasNext()) buf.append(" || "); 190 } 191 return buf.toString(); 192 } 193 } 194 195 196 class AndJpPlanner extends JpPlanner { 197 List _true; 198 List _false; 199 200 public AndJpPlanner(List _true, List _false) { 201 this._true = _true; 202 this._false = _false; 203 } 204 205 public AndJpPlanner(JpPlanner p1, JpPlanner p2) { 206 _true = new ArrayList(); 207 _true.add(p1); _true.add(p2); 208 _false = new ArrayList(); 209 } 210 211 public void walk(Object data) { 212 for (Iterator i = _true.iterator(); i.hasNext(); ) { 213 JpPlanner p = (JpPlanner)i.next(); 214 p.walk(data); 215 } 216 for (Iterator i = _false.iterator(); i.hasNext(); ) { 217 JpPlanner p = (JpPlanner)i.next(); 218 p.walk(data); 219 } 220 } 221 222 public FuzzyBoolean fastMatch(JoinPoint jp) { 223 FuzzyBoolean ret = FuzzyBoolean.YES; 224 for (Iterator i = _true.iterator(); i.hasNext(); ) { 225 JpPlanner p = (JpPlanner)i.next(); 226 ret = ret.and(p.fastMatch(jp)); 227 } 228 229 for (Iterator i = _false.iterator(); i.hasNext(); ) { 230 JpPlanner p = (JpPlanner)i.next(); 231 ret = ret.and(p.fastMatch(jp).not()); 232 } 233 return ret; 234 } 235 236 public JpPlan makePlan(JoinPoint jp) { 237 JpPlan plan = JpPlan.ANY_PLAN; 239 for (Iterator i = _true.iterator(); i.hasNext(); ) { 240 JpPlanner p = (JpPlanner)i.next(); 241 plan = plan.and(p.makePlan(jp)); 242 } 243 for (Iterator i = _false.iterator(); i.hasNext(); ) { 244 JpPlanner p = (JpPlanner)i.next(); 245 249 plan = plan.and(p.makePlan(jp).not()); 250 } 251 return plan; 253 } 254 255 public JpPlanner or(JpPlanner other) { 256 return new OrJpPlanner(this, other); 257 } 258 259 public JpPlanner and(JpPlanner other) { 260 List newTrue = new ArrayList(_true); 261 List newFalse = new ArrayList(_false); 262 263 if (other instanceof AndJpPlanner) { 264 AndJpPlanner otherAnd = (AndJpPlanner)other; 265 newTrue.addAll(otherAnd._true); 266 newFalse.addAll(otherAnd._false); 267 } else { 268 newTrue.add(other); 269 } 270 return new AndJpPlanner(newTrue, newFalse); 271 } 272 273 public JpPlanner not() { 274 List newList = new ArrayList(); 275 for (Iterator i = _true.iterator(); i.hasNext(); ) { 276 JpPlanner p = (JpPlanner)i.next(); 277 newList.add(p.not()); 278 } 279 for (Iterator i = _false.iterator(); i.hasNext(); ) { 280 JpPlanner p = (JpPlanner)i.next(); 281 newList.add(p); 282 } 283 return new OrJpPlanner(newList); 284 } 285 286 public String toString() { 287 StringBuffer buf = new StringBuffer (); 288 289 for (Iterator i = _true.iterator(); i.hasNext(); ) { 290 JpPlanner p = (JpPlanner)i.next(); 291 buf.append(p.toString()); 292 if (i.hasNext() || _false.size() > 0) buf.append(" && "); 293 } 294 for (Iterator i = _false.iterator(); i.hasNext(); ) { 295 JpPlanner p = (JpPlanner)i.next(); 296 buf.append("!"); 297 buf.append(p.toString()); 298 if (i.hasNext()) buf.append(" && "); 299 } 300 return buf.toString(); 301 } 302 } 303 | Popular Tags |