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