c07d9f7e5f71791ffe1acceb9e2b42c749dfb0a2
[marc4j.git] / src / org / marc4j / MarcXmlHandler.java
1 // $Id: MarcXmlHandler.java,v 1.1 2005/05/04 10:06:46 bpeters Exp $\r
2 /**\r
3  * Copyright (C) 2004 Bas Peters\r
4  *\r
5  * This file is part of MARC4J\r
6  *\r
7  * MARC4J is free software; you can redistribute it and/or\r
8  * modify it under the terms of the GNU Lesser General Public \r
9  * License as published by the Free Software Foundation; either \r
10  * version 2.1 of the License, or (at your option) any later version.\r
11  *\r
12  * MARC4J is distributed in the hope that it will be useful,\r
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
15  * Lesser General Public License for more details.\r
16  *\r
17  * You should have received a copy of the GNU Lesser General Public \r
18  * License along with MARC4J; if not, write to the Free Software\r
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
20  *\r
21  */\r
22 package org.marc4j;\r
23 \r
24 import java.util.HashMap;\r
25 \r
26 import org.marc4j.marc.ControlField;\r
27 import org.marc4j.marc.DataField;\r
28 import org.marc4j.marc.Leader;\r
29 import org.marc4j.marc.MarcFactory;\r
30 import org.marc4j.marc.Record;\r
31 import org.marc4j.marc.Subfield;\r
32 import org.xml.sax.Attributes;\r
33 import org.xml.sax.ContentHandler;\r
34 import org.xml.sax.Locator;\r
35 import org.xml.sax.SAXException;\r
36 \r
37 /**\r
38  * Creates <code>Record</code> objects from SAX events and pushes each item\r
39  * onto the top of the <code>RecordStack</code>.\r
40  * \r
41  * @author Bas Peters\r
42  * @version $Revision: 1.1 $\r
43  */\r
44 public class MarcXmlHandler implements ContentHandler {\r
45 \r
46   private RecordStack queue;\r
47 \r
48   //private InputSource input;\r
49 \r
50   private StringBuffer sb;\r
51 \r
52   private Subfield subfield;\r
53 \r
54   private ControlField controlField;\r
55 \r
56   private DataField dataField;\r
57 \r
58   private Record record;\r
59 \r
60   private String tag;\r
61 \r
62   /** Constants representing each valid tag type */\r
63   private static final int COLLECTION_ID = 1;\r
64 \r
65   private static final int LEADER_ID = 2;\r
66 \r
67   private static final int RECORD_ID = 3;\r
68 \r
69   private static final int CONTROLFIELD_ID = 4;\r
70 \r
71   private static final int DATAFIELD_ID = 5;\r
72 \r
73   private static final int SUBFIELD_ID = 6;\r
74 \r
75   /** The tag attribute name string */\r
76   private static final String TAG_ATTR = "tag";\r
77 \r
78   /** The code attribute name string */\r
79   private static final String CODE_ATTR = "code";\r
80 \r
81   /** The first indicator attribute name string */\r
82   private static final String IND_1_ATTR = "ind1";\r
83 \r
84   /** The second indicator attribute name string */\r
85   private static final String IND_2_ATTR = "ind2";\r
86 \r
87   /** Hashset for mapping of element strings to constants (Integer) */\r
88   private static final HashMap<String, Integer> elementMap;\r
89 \r
90   private MarcFactory factory = null;\r
91 \r
92   static {\r
93     elementMap = new HashMap<String, Integer>();\r
94     elementMap.put("collection", new Integer(COLLECTION_ID));\r
95     elementMap.put("leader", new Integer(LEADER_ID));\r
96     elementMap.put("record", new Integer(RECORD_ID));\r
97     elementMap.put("controlfield", new Integer(CONTROLFIELD_ID));\r
98     elementMap.put("datafield", new Integer(DATAFIELD_ID));\r
99     elementMap.put("subfield", new Integer(SUBFIELD_ID));\r
100   }\r
101 \r
102   /**\r
103    * Default constructor.\r
104    * \r
105    * @param queue\r
106    */\r
107   public MarcXmlHandler(RecordStack queue) {\r
108     this.queue = queue;\r
109     factory = MarcFactory.newInstance();\r
110   }\r
111 \r
112   public void startDocument() throws SAXException {\r
113   }\r
114 \r
115   public void startElement(String uri, String name, String qName,\r
116       Attributes atts) throws SAXException {\r
117 \r
118     String realname = (name.length() == 0) ? qName : name;\r
119     Integer elementType = (Integer) elementMap.get(realname);\r
120 \r
121     if (elementType == null)\r
122       return;\r
123 \r
124     switch (elementType.intValue()) {\r
125     case COLLECTION_ID:\r
126       break;\r
127     case RECORD_ID:\r
128       record = factory.newRecord();\r
129       break;\r
130     case LEADER_ID:\r
131       sb = new StringBuffer();\r
132       break;\r
133     case CONTROLFIELD_ID:\r
134       sb = new StringBuffer();\r
135       tag = atts.getValue(TAG_ATTR);\r
136       controlField = factory.newControlField(tag);\r
137       break;\r
138     case DATAFIELD_ID:\r
139       tag = atts.getValue(TAG_ATTR);\r
140       String ind1 = atts.getValue(IND_1_ATTR);\r
141       String ind2 = atts.getValue(IND_2_ATTR);\r
142       dataField = factory.newDataField(tag, ind1.charAt(0), ind2.charAt(0));\r
143       break;\r
144     case SUBFIELD_ID:\r
145       sb = new StringBuffer();\r
146       String code = atts.getValue(CODE_ATTR);\r
147       subfield = factory.newSubfield(code.charAt(0));\r
148     }\r
149   }\r
150 \r
151   public void characters(char[] ch, int start, int length) throws SAXException {\r
152     if (sb != null)\r
153       sb.append(ch, start, length);\r
154   }\r
155 \r
156   public void endElement(String uri, String name, String qName)\r
157       throws SAXException {\r
158 \r
159     String realname = (name.length() == 0) ? qName : name;\r
160     Integer elementType = (Integer) elementMap.get(realname);\r
161 \r
162     if (elementType == null)\r
163       return;\r
164 \r
165     switch (elementType.intValue()) {\r
166     case COLLECTION_ID:\r
167       break;\r
168     case RECORD_ID:\r
169       queue.push(record);\r
170       break;\r
171     case LEADER_ID:\r
172       Leader leader = factory.newLeader(sb.toString());\r
173       record.setLeader(leader);\r
174       break;\r
175     case CONTROLFIELD_ID:\r
176       controlField.setData(sb.toString());\r
177       record.addVariableField(controlField);\r
178       break;\r
179     case DATAFIELD_ID:\r
180       record.addVariableField(dataField);\r
181       break;\r
182     case SUBFIELD_ID:\r
183       subfield.setData(sb.toString());\r
184       dataField.addSubfield(subfield);\r
185     }\r
186 \r
187   }\r
188 \r
189   public void endDocument() throws SAXException {\r
190     queue.end();\r
191   }\r
192 \r
193   public void ignorableWhitespace(char[] data, int offset, int length)\r
194       throws SAXException {\r
195     // not implemented\r
196   }\r
197 \r
198   public void endPrefixMapping(String prefix) throws SAXException {\r
199   }\r
200 \r
201   public void skippedEntity(String name) throws SAXException {\r
202     // not implemented\r
203   }\r
204 \r
205   public void setDocumentLocator(Locator locator) {\r
206     // not implemented\r
207   }\r
208 \r
209   public void processingInstruction(String target, String data)\r
210       throws SAXException {\r
211     // not implemented\r
212   }\r
213 \r
214   public void startPrefixMapping(String prefix, String uri) throws SAXException {\r
215 //  not implemented\r
216   }\r
217 \r
218 }