Make List type safe. Remove/suppress all warnings.
[marc4j.git] / src / org / marc4j / marc / impl / LeaderImpl.java
1 // $Id: LeaderImpl.java,v 1.3 2006/08/04 12:32:37 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 package org.marc4j.marc.impl;\r
22 \r
23 import java.text.DecimalFormat;\r
24 \r
25 import org.marc4j.marc.Leader;\r
26 \r
27 /**\r
28  * Represents a record label in a MARC record.\r
29  * \r
30  * @author Bas Peters\r
31  * @version $Revision: 1.3 $\r
32  * \r
33  */\r
34 public class LeaderImpl implements Leader {\r
35 \r
36     /**\r
37      * \r
38     */\r
39     private static final long serialVersionUID = 6483942612907658766L;\r
40 \r
41     private Long id;\r
42 \r
43     /** The logical record length (Position 0-4). */\r
44     private int recordLength;\r
45 \r
46     /** The record status (Position 5). */\r
47     private char recordStatus;\r
48 \r
49     /** Type of record (Position 6). */\r
50     private char typeOfRecord;\r
51 \r
52     /** Implementation defined (Position 7-8). */\r
53     private char[] implDefined1;\r
54 \r
55     /** Character coding scheme (Position 9). */\r
56     private char charCodingScheme;\r
57 \r
58     /** The indicator count (Position 10). */\r
59     private int indicatorCount;\r
60 \r
61     /** The subfield code length (Position 11). */\r
62     private int subfieldCodeLength;\r
63 \r
64     /** The base address of data (Position 12-16). */\r
65     private int baseAddressOfData;\r
66 \r
67     /** Implementation defined (Position 17-18) */\r
68     private char[] implDefined2;\r
69 \r
70     /** Entry map (Position 19-23). */\r
71     private char[] entryMap;\r
72 \r
73     /** number format for both record length and base address of data */\r
74     DecimalFormat df = new DecimalFormat("00000");\r
75 \r
76     /**\r
77      * Default constructor.\r
78      */\r
79     public LeaderImpl() {\r
80     }\r
81 \r
82     /**\r
83      * Creates a new leader from a String object.\r
84      * \r
85      * @param ldr\r
86      *            the leader string value\r
87      */\r
88     public LeaderImpl(String ldr) {\r
89         unmarshal(ldr);\r
90     }\r
91 \r
92     /**\r
93      * Sets the logical record length (positions 00-04).\r
94      * \r
95      * @param recordLength\r
96      *            integer representing the record length\r
97      */\r
98     public void setRecordLength(int recordLength) {\r
99         this.recordLength = recordLength;\r
100     }\r
101 \r
102     /**\r
103      * Sets the record status (position 05).\r
104      * \r
105      * @param recordStatus\r
106      *            character representing the record status\r
107      */\r
108     public void setRecordStatus(char recordStatus) {\r
109         this.recordStatus = recordStatus;\r
110     }\r
111 \r
112     /**\r
113      * Sets the type of record (position 06).\r
114      * \r
115      * @param typeOfRecord\r
116      *            character representing the type of record\r
117      */\r
118     public void setTypeOfRecord(char typeOfRecord) {\r
119         this.typeOfRecord = typeOfRecord;\r
120     }\r
121 \r
122     /**\r
123      * Sets implementation defined values (position 07-08).\r
124      * \r
125      * @param implDefined1\r
126      *            character array representing the implementation defined data\r
127      */\r
128     public void setImplDefined1(char[] implDefined1) {\r
129         this.implDefined1 = implDefined1;\r
130     }\r
131 \r
132     /**\r
133      * Sets the character encoding scheme (position 09).\r
134      * \r
135      * @param charCodingScheme\r
136      *            character representing the character encoding\r
137      */\r
138     public void setCharCodingScheme(char charCodingScheme) {\r
139         this.charCodingScheme = charCodingScheme;\r
140     }\r
141 \r
142     /**\r
143      * Sets the indicator count (position 10).\r
144      * \r
145      * @param indicatorCount\r
146      *            integer representing the number of indicators present in a\r
147      *            data field\r
148      */\r
149     public void setIndicatorCount(int indicatorCount) {\r
150         this.indicatorCount = indicatorCount;\r
151     }\r
152 \r
153     /**\r
154      * Sets the subfield code length (position 11).\r
155      * \r
156      * @param subfieldCodeLength\r
157      *            integer representing the subfield code length\r
158      */\r
159     public void setSubfieldCodeLength(int subfieldCodeLength) {\r
160         this.subfieldCodeLength = subfieldCodeLength;\r
161     }\r
162 \r
163     /**\r
164      * Sets the base address of data (positions 12-16).\r
165      * \r
166      * @param baseAddressOfData\r
167      *            integer representing the base address of data\r
168      */\r
169     public void setBaseAddressOfData(int baseAddressOfData) {\r
170         this.baseAddressOfData = baseAddressOfData;\r
171     }\r
172 \r
173     /**\r
174      * Sets implementation defined values (positions 17-19).\r
175      * \r
176      * @param implDefined2\r
177      *            character array representing the implementation defined data\r
178      */\r
179     public void setImplDefined2(char[] implDefined2) {\r
180         this.implDefined2 = implDefined2;\r
181     }\r
182 \r
183     /**\r
184      * Sets the entry map (positions 20-23).\r
185      * \r
186      * @param entryMap\r
187      *            character array representing the entry map\r
188      */\r
189     public void setEntryMap(char[] entryMap) {\r
190         this.entryMap = entryMap;\r
191     }\r
192 \r
193     /**\r
194      * Returns the logical record length (positions 00-04).\r
195      * \r
196      * @return <code>int</code>- the record length\r
197      */\r
198     public int getRecordLength() {\r
199         return recordLength;\r
200     }\r
201 \r
202     /**\r
203      * Returns the record status (positions 05).\r
204      * \r
205      * @return <code>char</code>- the record status\r
206      */\r
207     public char getRecordStatus() {\r
208         return recordStatus;\r
209     }\r
210 \r
211     /**\r
212      * Returns the record type (position 06).\r
213      * \r
214      * @return <code>char</code>- the record type\r
215      */\r
216     public char getTypeOfRecord() {\r
217         return typeOfRecord;\r
218     }\r
219 \r
220     /**\r
221      * Returns implementation defined values (positions 07-08).\r
222      * \r
223      * @return <code>char[]</code>- implementation defined values\r
224      */\r
225     public char[] getImplDefined1() {\r
226         return implDefined1;\r
227     }\r
228 \r
229     /**\r
230      * Returns the character coding scheme (position 09).\r
231      * \r
232      * @return <code>char</code>- the character coding scheme\r
233      */\r
234     public char getCharCodingScheme() {\r
235         return charCodingScheme;\r
236     }\r
237 \r
238     /**\r
239      * Returns the indicator count (positions 10).\r
240      * \r
241      * @return <code>int</code>- the indicator count\r
242      */\r
243     public int getIndicatorCount() {\r
244         return indicatorCount;\r
245     }\r
246 \r
247     /**\r
248      * Returns the subfield code length (position 11).\r
249      * \r
250      * @return <code>int</code>- the subfield code length\r
251      */\r
252     public int getSubfieldCodeLength() {\r
253         return subfieldCodeLength;\r
254     }\r
255 \r
256     /**\r
257      * Returns the base address of data (positions 12-16).\r
258      * \r
259      * @return <code>int</code>- the base address of data\r
260      */\r
261     public int getBaseAddressOfData() {\r
262         return baseAddressOfData;\r
263     }\r
264 \r
265     /**\r
266      * Returns implementation defined values (positions 17-19).\r
267      * \r
268      * @return <code>char[]</code>- implementation defined values\r
269      */\r
270     public char[] getImplDefined2() {\r
271         return implDefined2;\r
272     }\r
273 \r
274     /**\r
275      * Returns the entry map (positions 20-23).\r
276      * \r
277      * @return <code>char[]</code>- the entry map\r
278      */\r
279     public char[] getEntryMap() {\r
280         return entryMap;\r
281     }\r
282 \r
283     /**\r
284      * <p>\r
285      * Creates a leader object from a string object.\r
286      * </p>\r
287      * \r
288      * <p>\r
289      * Indicator count and subfield code length are defaulted to 2 if they are\r
290      * not integer values.\r
291      * </p>\r
292      * \r
293      * @param ldr\r
294      *            the leader\r
295      */\r
296     public void unmarshal(String ldr) {\r
297         try {\r
298             String s;\r
299             s = ldr.substring(0, 5);\r
300             if (isInteger(s))\r
301                 setRecordLength(Integer.parseInt(s));\r
302             else\r
303                 setRecordLength(0);\r
304             setRecordStatus(ldr.charAt(5));\r
305             setTypeOfRecord(ldr.charAt(6));\r
306             setImplDefined1(ldr.substring(7, 9).toCharArray());\r
307             setCharCodingScheme(ldr.charAt(9));\r
308             s = String.valueOf(ldr.charAt(10));\r
309             if (isInteger(s))\r
310                 setIndicatorCount(Integer.parseInt(s));\r
311             else\r
312                 setIndicatorCount(2);\r
313             s = String.valueOf(ldr.charAt(10));\r
314             if (isInteger(s))\r
315                 setSubfieldCodeLength(Integer.parseInt(s));\r
316             else\r
317                 setSubfieldCodeLength(2);\r
318             s = ldr.substring(12, 17);\r
319             if (isInteger(s))\r
320                 setBaseAddressOfData(Integer.parseInt(s));\r
321             else\r
322                 setBaseAddressOfData(0);\r
323             setImplDefined2(ldr.substring(17, 20).toCharArray());\r
324             setEntryMap(ldr.substring(20, 24).toCharArray());\r
325         } catch (NumberFormatException e) {\r
326             throw new RuntimeException("Unable to parse leader", e);\r
327         }\r
328     }\r
329 \r
330     /**\r
331      * Creates a string object from this leader object.\r
332      * \r
333      * @return String - the string object from this leader object\r
334      */\r
335     public String marshal() {\r
336         return this.toString();\r
337     }\r
338 \r
339     /**\r
340      * Returns a string representation of this leader.\r
341      * \r
342      * <p>\r
343      * Example:\r
344      * \r
345      * <pre>\r
346      *  00714cam a2200205 a 4500\r
347      * </pre>\r
348      */\r
349     public String toString() {\r
350         return new StringBuffer().append(format5.format(getRecordLength()))\r
351                 .append(getRecordStatus()).append(getTypeOfRecord()).append(\r
352                         getImplDefined1()).append(getCharCodingScheme())\r
353                 .append(getIndicatorCount()).append(getSubfieldCodeLength())\r
354                 .append(format5.format(getBaseAddressOfData())).append(\r
355                         getImplDefined2()).append(getEntryMap()).toString();\r
356     }\r
357 \r
358     private boolean isInteger(String value) {\r
359         int len = value.length();\r
360         if (len == 0)\r
361             return false;\r
362         int i = 0;\r
363         do {\r
364             switch (value.charAt(i)) {\r
365             case '0':\r
366             case '1':\r
367             case '2':\r
368             case '3':\r
369             case '4':\r
370             case '5':\r
371             case '6':\r
372             case '7':\r
373             case '8':\r
374             case '9':\r
375                 break;\r
376             default:\r
377                 return false;\r
378             }\r
379         } while (++i < len);\r
380         return true;\r
381     }\r
382 \r
383     private static DecimalFormat format5 = new DecimalFormat("00000");\r
384 \r
385     public void setId(Long id) {\r
386         this.id = id;\r
387     }\r
388 \r
389     public Long getId() {\r
390         return id;\r
391     }\r
392 \r
393 }\r