1 package com.jbergin;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.Iterator;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.regex.Pattern;
9 import com.gargoylesoftware.htmlunit.Page;
10 import com.gargoylesoftware.htmlunit.html.DomNode;
11 import com.gargoylesoftware.htmlunit.html.HtmlElement;
12
13 final class DomNodeMemory
14 {
15 private final static Map memory = new HashMap();
16 static boolean preserve;
17
18 public void clear() {
19 memory.clear();
20 }
21 public void store(String key, Object value) {
22 memory.put(key, value);
23 }
24 public DomNode retrieve(String key) {
25 return (DomNode) memory.get(key);
26 }
27
28 int size() {
29 return memory.size();
30 }
31 boolean containsKey(String key) {
32 return memory.containsKey(key);
33 }
34
35 public void purgeElementsInPage(Page page) {
36 if (preserve) return;
37
38 for (Iterator itr = memory.keySet().iterator(); itr.hasNext();) {
39 String key = (String) itr.next();
40 HtmlElement element = (HtmlElement) memory.get(key);
41 if (element.getPage() == page) {
42 itr.remove();
43 }
44 }
45 }
46 public Object remove(Object key) {
47 return memory.remove(key);
48 }
49
50 private List getAnswers() {
51 List answers = (List)memory.get("answers");
52 if (answers == null) {
53 answers = new ArrayList();
54 store("answers", answers);
55 }
56 return answers;
57 }
58 public void addAnswer(String message, boolean answer) {
59 getAnswers().add(new Answer(message, answer));
60 }
61 public boolean getNextAnswer(String message) {
62 final List answers = getAnswers();
63 if (answers.isEmpty()) {
64 throw new ConfirmWithoutAnswerException("must use Answer command to answer javascript confirm('" +
65 message + "')");
66 }
67
68 final Answer answer = (Answer) answers.remove(0);
69 final String expectedMessage = answer.message;
70 if (Pattern.matches(expectedMessage, message)) {
71 return answer.answer;
72 }
73 throw new ConfirmMessageMismatchException("regex '" + expectedMessage + "' does not match '" + message + "'");
74 }
75
76 public boolean isPreserve() {
77 return preserve;
78 }
79 public void setPreserve(boolean preserve) {
80 DomNodeMemory.preserve = preserve;
81 }
82 private final static class Answer {
83 final String message;
84 final boolean answer;
85 Answer(String message, boolean answer) {
86 this.message = message;
87 this.answer = answer;
88 }
89 }
90 }