1 20 21 package org.apache.directory.ldapstudio.dsmlv2; 22 23 24 import java.io.IOException ; 25 import java.util.HashMap ; 26 27 import org.xmlpull.v1.XmlPullParser; 28 import org.xmlpull.v1.XmlPullParserException; 29 30 31 38 public abstract class AbstractGrammar implements IGrammar 39 { 40 41 46 protected HashMap <Tag, GrammarTransition>[] transitions; 47 48 49 protected String name; 50 51 52 protected IStates statesEnum; 53 54 55 60 public String getName() 61 { 62 return name; 63 } 64 65 66 72 public void setName( String name ) 73 { 74 this.name = name; 75 } 76 77 78 87 public GrammarTransition getTransition( int state, Tag tag ) 88 { 89 return transitions[state].get( tag ); 90 } 91 92 93 99 public IStates getStatesEnum() 100 { 101 return statesEnum; 102 } 103 104 105 111 public void setStatesEnum( IStates statesEnum ) 112 { 113 this.statesEnum = statesEnum; 114 } 115 116 117 120 public void executeAction( Dsmlv2Container container ) throws XmlPullParserException, IOException 121 { 122 XmlPullParser xpp = container.getParser(); 123 124 int eventType = xpp.getEventType(); 125 do 126 { 127 if ( eventType == XmlPullParser.START_DOCUMENT ) 128 { 129 container.setState( Dsmlv2StatesEnum.INIT_GRAMMAR_STATE ); 130 } 131 else if ( eventType == XmlPullParser.END_DOCUMENT ) 132 { 133 container.setState( Dsmlv2StatesEnum.END_STATE ); 134 } 135 else if ( eventType == XmlPullParser.START_TAG ) 136 { 137 processTag( container, Tag.START ); 138 } 139 else if ( eventType == XmlPullParser.END_TAG ) 140 { 141 processTag( container, Tag.END ); 142 } 143 eventType = xpp.next(); 144 } 145 while ( eventType != XmlPullParser.END_DOCUMENT ); 146 } 147 148 149 159 private void processTag( Dsmlv2Container container, int tagType ) throws XmlPullParserException 160 { 161 XmlPullParser xpp = container.getParser(); 162 163 String tagName = xpp.getName().toLowerCase(); 164 165 GrammarTransition transition = getTransition( container.getState(), new Tag( tagName, tagType ) ); 166 167 if ( transition != null ) 168 { 169 container.setState( transition.getNextState() ); 170 171 if ( transition.hasAction() ) 172 { 173 transition.getAction().action( container ); 174 } 175 } 176 else 177 { 178 throw new XmlPullParserException( "The tag " + new Tag( tagName, tagType ) 179 + " can't be found at this position", xpp, null ); 180 } 181 } 182 } 183 | Popular Tags |