source: OAIHarvester/trunk/OAIHarvester/src/main/java/eu/clarin/cmdi/oai/harvester/OAIDublinCoreDescriptionParser.java @ 1163

Last change on this file since 1163 was 1163, checked in by oschonef, 13 years ago
  • convert ealiestDatestamp to Date in Identify
  • add pluggable parser architecture for additional descriptions in Identify
  • add description parsers for OAI-identifier and OAI Dublin Core descriptions
  • Property svn:eol-style set to native
File size: 9.2 KB
Line 
1package eu.clarin.cmdi.oai.harvester;
2
3import java.util.ArrayList;
4import java.util.Collections;
5import java.util.HashMap;
6import java.util.List;
7import java.util.Map;
8
9import javax.xml.stream.XMLStreamConstants;
10import javax.xml.stream.XMLStreamException;
11import javax.xml.stream.XMLStreamReader;
12
13import eu.clarin.cmdi.oai.harvester.ext.DescriptionParser;
14
15public final class OAIDublinCoreDescriptionParser implements DescriptionParser {
16    private static class OAIDublinCoreDescriptionImpl implements
17            OAIDublinCoreDescription {
18        private final List<String> title;
19        private final List<String> creator;
20        private final List<String> subject;
21        private final List<String> description;
22        private final List<String> publisher;
23        private final List<String> contributor;
24        private final List<String> date;
25        private final List<String> type;
26        private final List<String> format;
27        private final List<String> identifier;
28        private final List<String> source;
29        private final List<String> language;
30        private final List<String> relation;
31        private final List<String> coverage;
32        private final List<String> rights;
33
34        private OAIDublinCoreDescriptionImpl(Map<String, List<String>> data) {
35            this.title = get(data, "title");
36            this.creator = get(data, "creators");
37            this.subject = get(data, "subjects");
38            this.description = get(data, "description");
39            this.publisher = get(data, "publisher");
40            this.contributor = get(data, "contributor");
41            this.date = get(data, "date");
42            this.type = get(data, "type");
43            this.format = get(data, "format");
44            this.identifier = get(data, "identifier");
45            this.source = data.get("source");
46            this.language = get(data, "language");
47            this.relation = get(data, "relation");
48            this.coverage = get(data, "coverage");
49            this.rights = get(data, "rights");
50        }
51
52        @Override
53        public String getNamespaceURI() {
54            return NAMESPACE_URI;
55        }
56
57        @Override
58        public String getLocalName() {
59            return LOCAL_NAME;
60        }
61
62        @Override
63        public List<String> getTitle() {
64            return title;
65        }
66       
67        @Override
68        public List<String> getCreator() {
69            return creator;
70        }
71       
72        @Override
73        public List<String> getSubject() {
74            return subject;
75        }
76       
77        @Override
78        public List<String> getDescription() {
79            return description;
80        }
81       
82        @Override
83        public List<String> getPublishere() {
84            return publisher;
85        }
86       
87        @Override
88        public List<String> getContributor() {
89            return contributor;
90        }
91       
92        @Override
93        public List<String> getDate() {
94            return date;
95        }
96       
97        @Override
98        public List<String> getType() {
99            return type;
100        }
101       
102        @Override
103        public List<String> getFormat() {
104            return format;
105        }
106       
107        @Override
108        public List<String> getIdentifier() {
109            return identifier;
110        }
111       
112        @Override
113        public List<String> getSource() {
114            return source;
115        }
116       
117        @Override
118        public List<String> getLanguage() {
119            return language;
120        }
121       
122        @Override
123        public List<String> getRelation() {
124            return relation;
125        }
126       
127        @Override
128        public List<String> getCoverage() {
129            return coverage;
130        }
131       
132        @Override
133        public List<String> getRight() {
134            return rights;
135        }
136
137        public String toString() {
138            StringBuilder sb = new StringBuilder("OAIDublinCoreDescription");
139            sb.append("[");
140            int i = 0;
141            if (title != null) {
142                sb.append("title=");
143                sb.append(title);
144                i++;
145            }
146            if (creator != null) {
147                if (i++ > 0) {
148                    sb.append(", ");
149                }
150                sb.append("creator=");
151                sb.append(creator);
152               
153            }
154            if (subject != null) {
155                if (i++ > 0) {
156                    sb.append(", ");
157                }
158                sb.append("subject=");
159                sb.append(subject);
160            }
161            if (description != null) {
162                if (i++ > 0) {
163                    sb.append(", ");
164                }
165                sb.append("descripton=");
166                sb.append(description);
167            }
168            if (publisher != null) {
169                if (i++ > 0) {
170                    sb.append(", ");
171                }
172                sb.append("publisher=");
173                sb.append(publisher);
174            }
175            if (contributor != null) {
176                if (i++ > 0) {
177                    sb.append(", ");
178                }
179                sb.append("contributor=");
180                sb.append(contributor);
181            }
182            if (date != null) {
183                if (i++ > 0) {
184                    sb.append(", ");
185                }
186                sb.append("date=");
187                sb.append(date);
188            }
189            if (type != null) {
190                if (i++ > 0) {
191                    sb.append(", ");
192                }
193                sb.append("type=");
194                sb.append(type);
195            }
196            if (format != null) {
197                if (i++ > 0) {
198                    sb.append(", ");
199                }
200                sb.append("format=");
201                sb.append(format);
202            }
203            if (identifier != null) {
204                if (i++ > 0) {
205                    sb.append(", ");
206                }
207                sb.append("identifier=");
208                sb.append(identifier);
209            }
210            if (source != null) {
211                if (i++ > 0) {
212                    sb.append(", ");
213                }
214                sb.append("source=");
215                sb.append(source);
216            }
217            if (language != null) {
218                if (i++ > 0) {
219                    sb.append(", ");
220                }
221                sb.append("language=");
222                sb.append(language);
223            }
224            if (relation != null) {
225                if (i++ > 0) {
226                    sb.append(", ");
227                }
228                sb.append("relation=");
229                sb.append(relation);
230            }
231            if (coverage != null) {
232                if (i++ > 0) {
233                    sb.append(", ");
234                }
235                sb.append("coverage=");
236                sb.append(coverage);
237            }
238            if (rights != null) {
239                if (i++ > 0) {
240                    sb.append(", ");
241                }
242                sb.append("rights=");
243                sb.append(rights);
244            }
245            sb.append("]");
246            return sb.toString();
247        }
248
249        private static List<String> get(Map<String, List<String>> data,
250                String key) {
251            List<String> list = data.get(key);
252            if (list != null) {
253                if (!list.isEmpty()) {
254                    list = Collections.unmodifiableList(list);
255                } else {
256                    list = null;
257                }
258            }
259            return list;
260        }
261
262    } // inner class OAIDublinCoreDescription
263
264    private static final String DC_NS = "http://purl.org/dc/elements/1.1/";
265
266   
267    @Override
268    public String getNamespaceURI() {
269        return OAIDublinCoreDescription.NAMESPACE_URI;
270    }
271
272    @Override
273    public String getLocalName() {
274        return OAIDublinCoreDescription.LOCAL_NAME;
275    }
276
277    @Override
278    public Description parseDescription(XMLStreamReader reader)
279            throws XMLStreamException, HarvesterException {
280        Map<String, List<String>> data = null;
281        reader.nextTag(); // skip "dc" end tag
282        for (;;) {
283            if (!DC_NS.equals(reader.getNamespaceURI())) {
284                break;
285            }
286            reader.require(XMLStreamConstants.START_ELEMENT, null, null);
287            final String localName = reader.getLocalName()
288                .trim().toLowerCase().intern();
289            reader.next(); // skip start tag
290            final String value = reader.getText().trim();
291            reader.next(); // skip content
292            reader.require(XMLStreamConstants.END_ELEMENT, DC_NS, localName);
293            reader.nextTag();
294            if (!value.isEmpty()) {
295                if (data == null) {
296                    data = new HashMap<String, List<String>>();
297                }
298                List<String> list = data.get(localName);
299                if (list == null) {
300                    list = new ArrayList<String>();
301                    data.put(localName, list);
302                }
303                list.add(value);
304            }
305        } // for
306        reader.nextTag(); // skip "dc" end tag
307        return (data != null) ? new OAIDublinCoreDescriptionImpl(data) : null;
308    }
309
310} // class OAIDublinCoreDescriptionParser
Note: See TracBrowser for help on using the repository browser.