1
2
3
4
5
6
7
8
9 package tsukuba_bunko.peko.scenario.select;
10
11 import java.util.Map;
12
13 import org.xml.sax.Attributes;
14 import org.xml.sax.SAXException;
15
16 import tsukuba_bunko.peko.Logger;
17
18 import tsukuba_bunko.peko.scenario.ElementHandler;
19 import tsukuba_bunko.peko.scenario.FlagScope;
20 import tsukuba_bunko.peko.scenario.PSMLUtil;
21
22
23 /***
24 * <samp>select</samp> 要素を処理する <code>ElementHandler</code> です。
25 * @author $Author: ppoi $
26 * @version $Revision: 1.2 $
27 */
28 public class SelectHandler extends ElementHandler {
29
30 /***
31 * id - 属性値リスト
32 */
33 private Map _attributes = new java.util.HashMap( 89 );
34
35 /***
36 * 現在パース中の選択肢 ID
37 */
38 private String _id = null;
39
40 /***
41 * テキストバッファ
42 */
43 private StringBuffer _text = null;
44
45 /***
46 * 選択肢名
47 */
48 private String _name = null;
49
50 /***
51 * スコープ
52 */
53 private FlagScope _scope = null;
54
55
56 /***
57 * <code>SelectHandler</code> のインスタンスを作成します。
58 */
59 public SelectHandler()
60 {
61 super();
62 }
63
64
65 /***
66 * SelectCanvas コーディネータを取得します。
67 * @return SelectCanvas コーディネータ
68 */
69 protected SelectCoordinator getSelectCoordinator()
70 {
71 return getSceneContext().getSceneProcessor().getSelectCoordinator();
72 }
73
74
75
76
77
78 public void startDocument()
79 {
80 _attributes.clear();
81 setEndOfScene( false );
82 }
83
84 public void endDocument()
85 {
86 SelectCoordinator coordinator = getSelectCoordinator();
87
88 String id = coordinator.select();
89 if( id == null ) {
90
91 return;
92 }
93 else {
94 getSceneContext().declareFlag( _name + ":" + id, _scope );
95 }
96
97 coordinator.end();
98 }
99
100 public void startElement( String namespaceURI, String localName, String qName, Attributes attrs )
101 throws SAXException
102 {
103 if( localName.equals("item") ) {
104 if( _id != null ) {
105 Logger.error( "[scenario.select] BUG! Invalid PSML Structure. location: " + getSceneContext().getCurrentPath() );
106 throw new SAXException( "Invalid PSML Structure." );
107 }
108
109 String id = PSMLUtil.getAttributeValue( attrs, "id" );
110 if( (id == null) || (id.length() == 0) ) {
111 Logger.warn( MessageIDs.SCN4002W, new Object[]{getSceneContext().getCurrentPath()} );
112 _id = null;
113 }
114 else {
115 _id = id;
116 _text = new StringBuffer();
117 }
118 }
119 else if( "select".equals(localName) ) {
120 String name = PSMLUtil.getAttributeValue( attrs, "name" );
121 if( (name == null) || (name.length() == 0) ) {
122 Logger.error( MessageIDs.SCN4001E, new Object[]{getSceneContext().getCurrentPath()} );
123 throw new SAXException( "invalid select element appeared." );
124 }
125 _name = PSMLUtil.getAttributeValue( attrs, "name" );
126
127 String flagScope = PSMLUtil.getAttributeValue( attrs, "scope" );
128 if( (flagScope == null) || flagScope.equals("session") ) {
129 _scope = FlagScope.SESSION;
130 }
131 else if( flagScope.equals("scene") ) {
132 _scope = FlagScope.SCENE;
133 }
134 else if( flagScope.equals("system") ) {
135 _scope = FlagScope.SYSTEM;
136 }
137 else {
138 Logger.warn( MessageIDs.SCN4004W, new Object[]{"session", getSceneContext().getCurrentPath()} );
139 _scope = FlagScope.SESSION;
140 }
141
142 getSelectCoordinator().begin();
143 }
144 }
145
146 public void endElement( String namespaceURI, String localName, String qName )
147 {
148 if( (_id != null) && localName.equals("item") ) {
149 if( _text.length() == 0 ) {
150 Logger.warn( MessageIDs.SCN4003W, new Object[]{getSceneContext().getCurrentPath()} );
151 }
152 else {
153 SelectCoordinator coordinator = getSceneContext().getSceneProcessor().getSelectCoordinator();
154 coordinator.addSelectItem( _id, new String(_text) );
155 }
156 _id = null;
157 _text = null;
158 }
159 }
160
161 public void characters( char[] ch, int begin, int length )
162 {
163 if( _text != null ) {
164 _text.append( ch, begin, length );
165 }
166 }
167 }