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
52
53
54
55
56 public String getName()
57 {
58 return name;
59 }
60
61
62
63
64
65
66
67 public void setName( String name )
68 {
69 this.name = name;
70 }
71
72
73
74
75
76
77
78
79
80 public GrammarTransition getTransition( Enum<Dsmlv2StatesEnum> state, Tag tag )
81 {
82 return transitions[state.ordinal()].get( tag );
83 }
84
85
86
87
88
89
90
91 public Enum<Dsmlv2StatesEnum>[] getStatesEnum()
92 {
93 return Dsmlv2StatesEnum.values();
94 }
95
96
97
98
99
100 public void executeAction( Dsmlv2Container container ) throws XmlPullParserException, IOException
101 {
102 XmlPullParser xpp = container.getParser();
103
104 int eventType = xpp.getEventType();
105
106 do
107 {
108 switch ( eventType )
109 {
110 case XmlPullParser.START_DOCUMENT:
111 container.setState( Dsmlv2StatesEnum.INIT_GRAMMAR_STATE );
112 break;
113
114 case XmlPullParser.END_DOCUMENT:
115 container.setState( Dsmlv2StatesEnum.GRAMMAR_END );
116 break;
117
118 case XmlPullParser.START_TAG:
119 processTag( container, Tag.START );
120 break;
121
122 case XmlPullParser.END_TAG:
123 processTag( container, Tag.END );
124 break;
125
126 default:
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.toLowerCaseAscii( 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 }