source: OAIHarvester/trunk/OAIHarvester/src/test/java/eu/clarin/cmdi/oai/harvester/HarvesterTest.java @ 1171

Last change on this file since 1171 was 1171, checked in by oschonef, 13 years ago
  • add description parser for OAI friends
  • Property svn:eol-style set to native
File size: 11.5 KB
Line 
1package eu.clarin.cmdi.oai.harvester;
2
3import java.io.BufferedInputStream;
4import java.io.File;
5import java.io.FileOutputStream;
6import java.io.IOException;
7import java.io.InputStream;
8import java.util.Date;
9import java.util.List;
10import java.util.zip.ZipEntry;
11import java.util.zip.ZipException;
12import java.util.zip.ZipOutputStream;
13
14import javax.xml.stream.XMLOutputFactory;
15import javax.xml.stream.XMLStreamConstants;
16import javax.xml.stream.XMLStreamReader;
17import javax.xml.stream.XMLStreamWriter;
18
19import eu.clarin.cmdi.oai.harvester.impl.SimpleHarvester;
20import eu.clarin.cmdi.oai.harvester.util.XMLStreamCopier;
21
22
23public class HarvesterTest {
24    private static XMLOutputFactory factory =
25        XMLOutputFactory.newInstance();
26
27    private static class MyHarvestHandler extends HarvestHandlerAdapter {
28        private ZipOutputStream output;
29        private int reqNum;
30        private String prefix;
31        private byte[] buffer = new byte[8192];
32
33        public MyHarvestHandler(File file) {
34            try {
35                FileOutputStream fos = new FileOutputStream(file);
36                output = new ZipOutputStream(fos);
37                output.setMethod(ZipOutputStream.DEFLATED);
38            } catch (Exception e) {
39                throw new RuntimeException("xxx", e);
40            }
41        }
42
43        public void close() {
44            try {
45                if (output != null) {
46                    output.flush();
47                    output.close();
48                    output = null;
49                }
50            } catch (ZipException e) {
51                /* IGNORE */
52            } catch (Exception e) {
53                throw new RuntimeException("xxx", e);
54            }
55        }
56
57        @Override
58        public void onIdentify(Repository repository) {
59            System.err.println("onIdentify");
60            System.err.println("     repositoryName: " +
61                    repository.getRepositoryName());
62            System.err.println("            baseURL: " +
63                    repository.getBaseURL());
64            System.err.println("    protocolVersion: " +
65                    repository.getProtocolVersion());
66            for (String adminEmail : repository.getAdminEmail()) {
67                System.err.println("         adminEmail: " + adminEmail);
68            }
69            System.err.println("  earliestTimestamp: " +
70                    repository.getEarliestTimestamp());
71            System.err.println("      deletedPolicy: " +
72                    repository.getDeletedNotion());
73            System.err.println("        granularity: " +
74                    repository.getGranularity());
75            StringBuilder sb = new StringBuilder();
76            final int mask = repository.getCompressionMask();
77            if (mask != 0) {
78                if ((mask & Repository.COMPRESSION_METHOD_DEFLATE) > 0) {
79                    sb.append("DEFLATE");
80                }
81                if ((mask & Repository.COMPRESSION_METHOD_GZIP) > 0) {
82                    if (sb.length() > 0) {
83                        sb.append(", ");
84                    }
85                    sb.append("GZIP");
86                }
87            } else {
88                sb.append("N/A");
89            }
90            System.err.println("        compression: " + sb.toString());
91            final List<Description> descs = repository.getDescriptions();
92            if (descs != null) {
93                for (Description desc : descs) {
94                    System.err.println("        description: " + desc);
95                }
96            }
97        }
98       
99        @Override
100        public void onListMetadataFormats(List<MetadataFormat> metadataFormats) {
101            System.err.println("onListMetadataFormats");
102            for (MetadataFormat format : metadataFormats) {
103                System.err.println("==> MetadataFormat");
104                System.err.println("    Prefix: " + format.getPrefix());
105                System.err.println("    Schema: " + format.getSchema());
106                System.err.println("    Namespace: " +format.getNamespace());
107            }
108        }
109
110        @Override
111        public void onStartListingRecords(String prefix) {
112            System.err.println("onStartListingRecords: " + prefix);
113            this.prefix = prefix;
114        }
115
116        @Override
117        public void onFinishListingRecords(String prefix, Date latestDatestamp) {
118            System.err.println("onFinishListingRecords: " + prefix +
119                ", latest = " + latestDatestamp);
120            this.prefix = null;
121        }
122
123
124        @Override
125        public void onRecordMetadata(Header header, XMLStreamReader reader) {
126            System.err.println("==> Record");
127            System.err.println("    Identifier: " + header.getIdentifier());
128            System.err.println("    Datestamp: " + header.getDatestamp());
129            if (header.getSets() != null) {
130                System.err.println("    Sets: " + header.getSets());
131            }
132            String filename = header.getIdentifier();
133            filename = replaceBadChars(filename) + ".xml";
134            if (prefix != null) {
135                filename = replaceBadChars(prefix) + "/" + filename; 
136            }
137            try {
138                ZipEntry entry = new ZipEntry(filename);
139                entry.setTime(header.getDatestamp().getTime());
140                output.putNextEntry(entry);
141                XMLStreamWriter writer =
142                    factory.createXMLStreamWriter(output);
143                XMLStreamCopier.copy(reader, writer);
144                writer.flush();
145                writer.close();
146                output.closeEntry();
147                output.flush();
148                reader.close();
149            } catch (Exception e) {
150                e.printStackTrace();
151                throw new RuntimeException("record failed");
152            }
153        }
154
155        @Override
156        public InputStream wrap(InputStream stream) throws IOException {
157            final int size = 16*1024*1024;
158            BufferedInputStream in =
159                new BufferedInputStream(stream, size);
160            in.mark(size);
161            String x = Integer.toHexString(reqNum++);
162            while (x.length() < 4) {
163                x = "0" + x;
164            }
165            final String filename = "request/0x" + x + ".xml";
166            System.err.println("FN: " + filename);
167            ZipEntry entry = new ZipEntry(filename);
168            output.putNextEntry(entry);
169            int r = -1;
170            do {
171                r = in.read(buffer, 0, buffer.length - 1);
172                if (r > 0) {
173                    output.write(buffer, 0, r);
174                }
175            } while (r > 0);
176            output.closeEntry();
177            output.flush();
178            in.reset();
179            return in;
180        }
181
182        private String replaceBadChars(String s) {
183            return s.replace(':', '_').replace('.', '_').replace('\\', '_')
184                    .replace('/', '_');
185        }
186    };
187   
188    public void run(String[] args) {
189        if (args.length < 2) {
190            System.err.println("Usage: [baseURI] [outfile]");
191            System.exit(1);
192        }
193        final String repos = args[0];
194        MyHarvestHandler handler = new MyHarvestHandler(new File(args[1]));
195
196        Harvester harvester = SimpleHarvester.newInstance();
197        try {
198            // configure harvester
199            harvester.setMaxNetworkRetryCount(16);
200            harvester.registerDescriptionParser(
201                    new OAIIdentifierDescriptionParser());
202            harvester.registerDescriptionParser(
203                    new OAIDublinCoreDescriptionParser());
204            harvester.registerDescriptionParser(
205                    new OAIFriendsDescriptionParser());
206
207            HarvestJob job = harvester.createJob(repos, handler);
208//            Calendar cal = Calendar.getInstance(TimeZone.getDefault());
209//            cal.clear();
210//            cal.set(2010, Calendar.DECEMBER, 15);
211//            job.setFrom(cal.getTime());
212//            job.setMetadataPrefixes(Arrays.asList("oai_dc", "cmdi"));
213            job.run();
214
215            while (job.isRunning()) {
216                try {
217                    Thread.sleep(1500);
218                } catch (InterruptedException e) {
219                }
220            }
221
222            System.err.println("==> " + job.getState() + ": "+
223                    job.getTotelRecordCount() + " total record(s) / " +
224                    job.getTotelRequestCount() + " total request(s) / " +
225                    job.getTotalBytesTransferred() +
226                        " total bytes transferred");
227            System.err.println("          " +
228                    (job.getTotalTime() / 1000f) + " total / " +
229                    (job.getNetworkTime() / 1000f) + " network / " +
230                    (job.getWaitTime() / 1000f) + " wait / " +
231                    (job.getProcessingTime() / 1000f) + " processing");
232            for (HarvestJob.Statistics stats : job.getStatistics()) {
233                System.err.println("          " + stats.getPrefix() + ": " +
234                        stats.getRecordCount() + " record(s) / " +
235                        stats.getRequestCount() + " requsts(s) [" +
236                        stats.getResumptionCount()  + " time(s) resumed] / " +
237                        stats.getBytesTransferred() + " byte(s) / latest = " +
238                        stats.getLatestDatestamp());
239            }
240        } catch (HarvesterProtocolErrorException e) {
241            System.err.println("Protocol error: ");
242            if (e.getErrors() != null) {
243                for (ProtocolError error : e.getErrors()) {
244                    System.err.println("  " + error);
245                }
246            }
247        } catch (Exception e) {
248            e.printStackTrace();
249        } finally {
250            handler.close();
251            harvester.shutdown();
252        }
253    }
254
255    public static void main(String[] args) {
256        HarvesterTest main = new HarvesterTest();
257        main.run(args);
258    }
259
260    @SuppressWarnings("unused")
261    private static void dump(XMLStreamReader reader) {
262        StringBuilder sb = new StringBuilder("Main: ");
263        switch (reader.getEventType()) {
264        case XMLStreamConstants.START_DOCUMENT:
265            sb.append("START_DOC");
266            break;
267        case XMLStreamConstants.END_DOCUMENT:
268            sb.append("END_DOC");
269            break;
270        case XMLStreamConstants.COMMENT:
271            sb.append("COMMENT[");
272            sb.append(reader.getTextCharacters(), reader.getTextStart(),
273                    reader.getTextLength());
274            sb.append("]");
275            break;
276        case XMLStreamConstants.START_ELEMENT:
277            sb.append("START[");
278            sb.append(reader.getNamespaceURI());
279            sb.append(",");
280            sb.append(reader.getLocalName());
281            sb.append("]");
282            break;
283        case XMLStreamConstants.END_ELEMENT:
284            sb.append("END[");
285            sb.append(reader.getNamespaceURI());
286            sb.append(",");
287            sb.append(reader.getLocalName());
288            sb.append("]");
289            break;
290        case XMLStreamConstants.CHARACTERS:
291            sb.append("CHARACTERS[");
292            String text = reader.getText();
293            text = text.replace("\n", "\\n").replace("\r", "\\r")
294                    .replace("\t", "\\t");
295            sb.append(text);
296            sb.append("]");
297            break;
298        case XMLStreamConstants.CDATA:
299            sb.append("CDATA[");
300            sb.append(reader.getText());
301            sb.append("]");
302            break;
303        default:
304            sb.append(Integer.toString(reader.getEventType()));
305        }
306        System.err.println(sb.toString());
307    }
308
309} // class HarvesterTest
Note: See TracBrowser for help on using the repository browser.