Original 2.4
[marc4j.git] / src / org / marc4j / marc / impl / RecordImpl.java
1 // $Id: RecordImpl.java,v 1.5 2008/09/26 21:17:43 haschart 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.util.ArrayList;\r
24 import java.util.Collections;\r
25 import java.util.Iterator;\r
26 import java.util.List;\r
27 \r
28 import org.marc4j.marc.ControlField;\r
29 import org.marc4j.marc.IllegalAddException;\r
30 import org.marc4j.marc.Leader;\r
31 import org.marc4j.marc.Record;\r
32 import org.marc4j.marc.VariableField;\r
33 \r
34 /**\r
35  * Represents a MARC record.\r
36  * \r
37  * @author Bas Peters\r
38  * @version $Revision: 1.5 $\r
39  */\r
40 public class RecordImpl implements Record {\r
41 \r
42     private Long id;\r
43 \r
44     private Leader leader;\r
45 \r
46     private List controlFields;\r
47 \r
48     private List dataFields;\r
49 \r
50     private String type;\r
51 \r
52     /**\r
53      * Creates a new <code>Record</code>.\r
54      */\r
55     public RecordImpl() {\r
56         controlFields = new ArrayList();\r
57         dataFields = new ArrayList();\r
58     }\r
59 \r
60     public void setType(String type) {\r
61         this.type = type;\r
62     }\r
63 \r
64     public String getType() {\r
65         return type;\r
66     }\r
67 \r
68     public void setLeader(Leader leader) {\r
69         this.leader = leader;\r
70     }\r
71 \r
72     public Leader getLeader() {\r
73         return leader;\r
74     }\r
75 \r
76     /**\r
77      * Adds a <code>VariableField</code> being a <code>ControlField</code>\r
78      * or <code>DataField</code>.\r
79      * \r
80      * If the <code>VariableField</code> is a control number field (001) and\r
81      * the record already has a control number field, the field is replaced with\r
82      * the new instance.\r
83      * \r
84      * @param field\r
85      *            the <code>VariableField</code>\r
86      * @throws IllegalAddException\r
87      *             when the parameter is not a <code>VariableField</code>\r
88      *             instance\r
89      */\r
90     public void addVariableField(VariableField field) {\r
91         if (!(field instanceof VariableField))\r
92             throw new IllegalAddException("Expected VariableField instance");\r
93 \r
94         String tag = field.getTag();\r
95         if (Verifier.isControlNumberField(tag)) {\r
96             if (Verifier.hasControlNumberField(controlFields))\r
97                 controlFields.set(0, field);\r
98             else\r
99                 controlFields.add(0, field);\r
100             Collections.sort(controlFields);\r
101         } else if (Verifier.isControlField(tag)) {\r
102             controlFields.add(field);\r
103             Collections.sort(controlFields);\r
104         } else {\r
105             dataFields.add(field);\r
106             Collections.sort(dataFields);\r
107         }\r
108 \r
109     }\r
110 \r
111     public void removeVariableField(VariableField field) {\r
112         String tag = field.getTag();\r
113         if (Verifier.isControlField(tag))\r
114             controlFields.remove(field);\r
115         else\r
116             dataFields.remove(field);\r
117     }\r
118 \r
119     /**\r
120      * Returns the control number field or <code>null</code> if no control\r
121      * number field is available.\r
122      * \r
123      * @return ControlField - the control number field\r
124      */\r
125     public ControlField getControlNumberField() {\r
126         if (Verifier.hasControlNumberField(controlFields))\r
127             return (ControlField) controlFields.get(0);\r
128         else\r
129             return null;\r
130     }\r
131 \r
132     public List getControlFields() {\r
133         return controlFields;\r
134     }\r
135 \r
136     public List getDataFields() {\r
137         return dataFields;\r
138     }\r
139 \r
140     public VariableField getVariableField(String tag) {\r
141         Iterator i;\r
142         if (Verifier.isControlField(tag))\r
143             i = controlFields.iterator();\r
144         else\r
145             i = dataFields.iterator();\r
146         while (i.hasNext()) {\r
147             VariableField field = (VariableField) i.next();\r
148             if (field.getTag().equals(tag))\r
149                 return field;\r
150         }\r
151         return null;\r
152     }\r
153 \r
154     public List getVariableFields(String tag) {\r
155         List fields = new ArrayList();\r
156         Iterator i;\r
157         if (Verifier.isControlField(tag))\r
158             i = controlFields.iterator();\r
159         else\r
160             i = dataFields.iterator();\r
161         while (i.hasNext()) {\r
162             VariableField field = (VariableField) i.next();\r
163             if (field.getTag().equals(tag))\r
164                 fields.add(field);\r
165         }\r
166         return fields;\r
167     }\r
168 \r
169     public List getVariableFields() {\r
170         List fields = new ArrayList();\r
171         Iterator i;\r
172         i = controlFields.iterator();\r
173         while (i.hasNext())\r
174             fields.add(i.next());\r
175         i = dataFields.iterator();\r
176         while (i.hasNext())\r
177             fields.add(i.next());\r
178         return fields;\r
179     }\r
180 \r
181     public String getControlNumber() {\r
182         ControlField f = getControlNumberField();\r
183         String result = (f == null || f.getData() == null) ? null : new String(f.getData());\r
184         return(result);\r
185     }\r
186 \r
187     public List getVariableFields(String[] tags) {\r
188         List list = new ArrayList();\r
189         for (int i = 0; i < tags.length; i++) {\r
190             String tag = tags[i];\r
191             List fields = getVariableFields(tag);\r
192             if (fields.size() > 0)\r
193                 list.addAll(fields);\r
194         }\r
195         return list;\r
196     }\r
197 \r
198     /**\r
199      * Returns a string representation of this record.\r
200      * \r
201      * <p>\r
202      * Example:\r
203      * \r
204      * <pre>\r
205      *     \r
206      *      LEADER 00714cam a2200205 a 4500 \r
207      *      001 12883376 \r
208      *      005 20030616111422.0\r
209      *      008 020805s2002 nyu j 000 1 eng \r
210      *      020   $a0786808772 \r
211      *      020   $a0786816155 (pbk.) \r
212      *      040   $aDLC$cDLC$dDLC \r
213      *      100 1 $aChabon, Michael. \r
214      *      245 10$aSummerland /$cMichael Chabon. \r
215      *      250   $a1st ed. \r
216      *      260   $aNew York :$bMiramax Books/Hyperion Books for Children,$cc2002. \r
217      *      300   $a500 p. ;$c22 cm. \r
218      *      650  1$aFantasy. \r
219      *      650  1$aBaseball$vFiction. \r
220      *      650  1$aMagic$vFiction.\r
221      *      \r
222      * </pre>\r
223      * \r
224      * @return String - a string representation of this record\r
225      */\r
226     public String toString() {\r
227         StringBuffer sb = new StringBuffer();\r
228         sb.append("LEADER ");\r
229         sb.append(getLeader().toString());\r
230         sb.append('\n');\r
231         Iterator i = getVariableFields().iterator();\r
232         while (i.hasNext()) {\r
233             VariableField field = (VariableField) i.next();\r
234             sb.append(field.toString());\r
235             sb.append('\n');\r
236         }\r
237         return sb.toString();\r
238     }\r
239 \r
240     public List find(String pattern) {\r
241         List result = new ArrayList();\r
242         Iterator i = controlFields.iterator();\r
243         while (i.hasNext()) {\r
244             VariableField field = (VariableField) i.next();\r
245             if (field.find(pattern))\r
246                 result.add(field);\r
247         }\r
248         i = dataFields.iterator();\r
249         while (i.hasNext()) {\r
250             VariableField field = (VariableField) i.next();\r
251             if (field.find(pattern))\r
252                 result.add(field);\r
253         }\r
254         return result;\r
255     }\r
256 \r
257     public List find(String tag, String pattern) {\r
258         List result = new ArrayList();\r
259         Iterator i = getVariableFields(tag).iterator();\r
260         while (i.hasNext()) {\r
261             VariableField field = (VariableField) i.next();\r
262             if (field.find(pattern))\r
263                 result.add(field);\r
264         }\r
265         return result;\r
266     }\r
267 \r
268     public List find(String[] tag, String pattern) {\r
269         List result = new ArrayList();\r
270         Iterator i = getVariableFields(tag).iterator();\r
271         while (i.hasNext()) {\r
272             VariableField field = (VariableField) i.next();\r
273             if (field.find(pattern))\r
274                 result.add(field);\r
275         }\r
276         return result;\r
277     }\r
278 \r
279     public void setId(Long id) {\r
280         this.id = id;\r
281     }\r
282 \r
283     public Long getId() {\r
284         return id;\r
285     }\r
286 \r
287 }