1
2
3
4
5
6
7
8
9
10 package tsukuba_bunko.resource;
11
12 import java.util.List;
13
14 import org.xml.sax.Attributes;
15 import org.xml.sax.ContentHandler;
16 import org.xml.sax.SAXException;
17
18
19 /***
20 * List 構造を取得する <code>ValueDescerializer</code> です.
21 * @author $Author: ppoi $
22 */
23 public class ListDeserializer extends BasicDeserializer {
24
25 /***
26 * リスト
27 */
28 private List _list = null;
29
30 /***
31 * 要素を解析するための ResourceDeserializer
32 */
33 private ResourceDeserializer _itemDeserializer = null;
34
35 /***
36 * 要素を解析するための ContentHandler
37 */
38 private ContentHandler _itemHandler = null;
39
40 /***
41 * リスト要素のデータ型
42 */
43 private String _itemType = null;
44
45 /***
46 * レベル
47 */
48 private int _level = 0;
49
50
51 /***
52 * <code>ListDeserializer</code> のインスタンスを作成します.
53 */
54 public ListDeserializer()
55 {
56 super();
57 }
58
59
60
61
62
63 public void setTypeName( String typeName )
64 {
65 super.setTypeName( typeName );
66 int index = typeName.indexOf( '/' );
67 if( index == -1 ) {
68 throw new IllegalArgumentException( "illegal list item type. \"" + typeName + "\"" );
69 }
70 else {
71 _itemType = typeName.substring( index + 1 );
72 }
73 }
74
75
76
77
78
79 public void startDocument()
80 {
81 _list = null;
82 _level = 0;
83 }
84
85 public void endDocument()
86 {
87 setValue( _list );
88 _list = null;
89 }
90
91 public void startPrefixMapping( String namespaceURI, String prefix )
92 throws SAXException
93 {
94 if( _itemHandler != null ) {
95 _itemHandler.startPrefixMapping( namespaceURI, prefix );
96 }
97 }
98
99 public void endPrefixMapping( String namespaceURI )
100 throws SAXException
101 {
102 if( _itemHandler != null ) {
103 _itemHandler.endPrefixMapping( namespaceURI );
104 }
105 }
106
107 public void startElement( String namespaceURI, String localName, String qName, Attributes attrs )
108 throws SAXException
109 {
110 if( _list == null ) {
111 _list = new java.util.ArrayList();
112 _itemDeserializer = _mapping.getResourceDeserializer( _itemType );
113 if( _itemDeserializer == null ) {
114 throw new SAXException( "no deserializer for \"" + _itemType + "\"" );
115 }
116 }
117 else if( _itemHandler == null ) {
118 if( localName.equals("item") ) {
119 _level++;
120 _itemHandler = _itemDeserializer;
121 _itemHandler.startElement( namespaceURI, localName, qName, attrs );
122 }
123 else {
124 throw new SAXException( "illegal structure. : non-item element \"" + qName + "\"" );
125 }
126 }
127 else {
128 _level++;
129 _itemHandler.startElement( namespaceURI, localName, qName, attrs );
130 }
131 }
132
133 public void endElement( String namespaceURI, String localName, String qName )
134 throws SAXException
135 {
136 try {
137 if( _itemHandler != null ) {
138 _level--;
139 _itemHandler.endElement( namespaceURI, localName, qName );
140 if( _level == 0 ) {
141 _list.add( _itemDeserializer.getValue() );
142 _itemHandler = null;
143 }
144 }
145 }catch( Exception e ) {
146 e.printStackTrace();
147 }
148 }
149
150 public void processingInstruction( String target, String data )
151 throws SAXException
152 {
153 if( _itemHandler != null ) {
154 _itemHandler.processingInstruction( target, data );
155 }
156 }
157
158 public void skippedEntity( String name )
159 throws SAXException
160 {
161 if( _itemHandler != null ) {
162 _itemHandler.skippedEntity( name );
163 }
164 }
165
166 public void characters( char[] ch, int begin, int length )
167 throws SAXException
168 {
169 if( _itemHandler != null ) {
170 _itemHandler.characters( ch, begin, length );
171 }
172 }
173
174 public void ignorableWhitespace( char[] ch, int begin, int length )
175 throws SAXException
176 {
177 if( _itemHandler != null ) {
178 _itemHandler.ignorableWhitespace( ch, begin, length );
179 }
180 }
181 }