1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.api.dsmlv2;
21
22
23 import java.io.IOException;
24 import java.util.HashMap;
25
26 import org.apache.directory.api.i18n.I18n;
27 import org.apache.directory.api.util.Strings;
28 import org.xmlpull.v1.XmlPullParser;
29 import org.xmlpull.v1.XmlPullParserException;
30
31
32
33
34
35
36
37
38 public abstract class AbstractGrammar implements Grammar
39 {
40
41
42
43
44
45 protected HashMap<Tag, GrammarTransition>[] transitions;
46
47
48 protected String name;
49
50
51 protected Enum<Dsmlv2StatesEnum>[] statesEnum;
52
53
54
55
56
57
58
59 public String getName()
60 {
61 return name;
62 }
63
64
65
66
67
68
69
70 public void setName( String name )
71 {
72 this.name = name;
73 }
74
75
76
77
78
79
80
81
82
83 public GrammarTransition getTransition( Enum<Dsmlv2StatesEnum> state, Tag tag )
84 {
85 return transitions[state.ordinal()].get( tag );
86 }
87
88
89
90
91
92
93
94 public Enum<Dsmlv2StatesEnum>[] getStatesEnum()
95 {
96 return Dsmlv2StatesEnum.values();
97 }
98
99
100
101
102
103 public void executeAction( Dsmlv2Container container ) throws XmlPullParserException, IOException
104 {
105 XmlPullParser xpp = container.getParser();
106
107 int eventType = xpp.getEventType();
108
109 do
110 {
111 switch ( eventType )
112 {
113 case XmlPullParser.START_DOCUMENT:
114 container.setState( Dsmlv2StatesEnum.INIT_GRAMMAR_STATE );
115 break;
116
117 case XmlPullParser.END_DOCUMENT:
118 container.setState( Dsmlv2StatesEnum.GRAMMAR_END );
119 break;
120
121 case XmlPullParser.START_TAG:
122 processTag( container, Tag.START );
123 break;
124
125 case XmlPullParser.END_TAG:
126 processTag( container, Tag.END );
127 break;
128 }
129
130 eventType = xpp.next();
131 }
132 while ( eventType != XmlPullParser.END_DOCUMENT );
133 }
134
135
136
137
138
139
140
141
142
143 private void processTag( Dsmlv2Container container, int tagType ) throws XmlPullParserException
144 {
145 XmlPullParser xpp = container.getParser();
146
147 String tagName = Strings.toLowerCase( xpp.getName() );
148
149 GrammarTransition transition = getTransition( container.getState(), new Tag( tagName, tagType ) );
150
151 if ( transition != null )
152 {
153 container.setState( transition.getNextState() );
154
155 if ( transition.hasAction() )
156 {
157 GrammarAction action = transition.getAction();
158 action.action( container );
159 }
160 }
161 else
162 {
163 throw new XmlPullParserException( I18n.err( I18n.ERR_03036, new Tag( tagName, tagType ) ), xpp, null );
164 }
165 }
166 }