OSDN Git Service

imported from subversion repository
[xerial/xerial-core.git] / src / main / java / org / xerial / util / xml / impl / TreeEventQueue.java
1 /*--------------------------------------------------------------------------\r
2  *  Copyright 2009 Taro L. Saito\r
3  *\r
4  *  Licensed under the Apache License, Version 2.0 (the "License");\r
5  *  you may not use this file except in compliance with the License.\r
6  *  You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  *  Unless required by applicable law or agreed to in writing, software\r
11  *  distributed under the License is distributed on an "AS IS" BASIS,\r
12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  *  See the License for the specific language governing permissions and\r
14  *  limitations under the License.\r
15  *--------------------------------------------------------------------------*/\r
16 //--------------------------------------\r
17 // XerialJ\r
18 //\r
19 // TreeEventQueue.java\r
20 // Since: Mar 31, 2009 11:56:37 AM\r
21 //\r
22 // $URL: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core/src/main/java/org/xerial/util/xml/impl/TreeEventQueue.java $\r
23 // $Author: leo $\r
24 //--------------------------------------\r
25 package org.xerial.util.xml.impl;\r
26 \r
27 import java.util.Collection;\r
28 \r
29 import org.xerial.core.XerialError;\r
30 import org.xerial.core.XerialErrorCode;\r
31 import org.xerial.util.ArrayDeque;\r
32 import org.xerial.util.Deque;\r
33 import org.xerial.util.tree.TreeEvent;\r
34 \r
35 /**\r
36  * A queue for storing {@link TreeEvent}s\r
37  * \r
38  * @author leo\r
39  * \r
40  */\r
41 public class TreeEventQueue\r
42 {\r
43     private Deque<TreeEvent> eventQueue = new ArrayDeque<TreeEvent>();\r
44     private Deque<String> nodeNameStack = new ArrayDeque<String>();\r
45 \r
46     private static final String EMPTY_STRING = new String();\r
47 \r
48     public void push(TreeEvent e)\r
49     {\r
50         switch (e.event)\r
51         {\r
52         case VISIT:\r
53             nodeNameStack.addLast(e.nodeName == null ? EMPTY_STRING : e.nodeName);\r
54             break;\r
55         case LEAVE:\r
56             nodeNameStack.removeLast();\r
57             break;\r
58         }\r
59         eventQueue.addLast(e);\r
60     }\r
61 \r
62     public TreeEvent peekFirst()\r
63     {\r
64         return eventQueue.peekFirst();\r
65     }\r
66 \r
67     public TreeEvent peekLast()\r
68     {\r
69         return eventQueue.peekLast();\r
70     }\r
71 \r
72     public void push(Collection<TreeEvent> eventList)\r
73     {\r
74         for (TreeEvent each : eventList)\r
75         {\r
76             push(each);\r
77         }\r
78     }\r
79 \r
80     public void replaceLast(TreeEvent e)\r
81     {\r
82         if (e.event != eventQueue.peekLast().event)\r
83             throw new XerialError(XerialErrorCode.INVALID_STATE, String\r
84                     .format("replace Last must be applied for the same event type: %s, %s", e.event, eventQueue\r
85                             .getLast().event));\r
86 \r
87         eventQueue.removeLast();\r
88         eventQueue.addLast(e);\r
89     }\r
90 \r
91     public String getContextNodeName()\r
92     {\r
93         if (nodeNameStack.isEmpty())\r
94             return null;\r
95         else\r
96         {\r
97             String str = nodeNameStack.getLast();\r
98             if (str == EMPTY_STRING)\r
99                 return null;\r
100             else\r
101                 return str;\r
102         }\r
103     }\r
104 \r
105     public TreeEvent pop()\r
106     {\r
107         return eventQueue.removeFirst();\r
108     }\r
109 \r
110     public boolean isEmpty()\r
111     {\r
112         return eventQueue.isEmpty();\r
113     }\r
114 \r
115     @Override\r
116     public String toString()\r
117     {\r
118         return eventQueue.toString();\r
119     }\r
120 \r
121 }\r