1 | package eu.clarin.sru.fcs.aggregator.search; |
---|
2 | |
---|
3 | import eu.clarin.sru.client.SRUClientException; |
---|
4 | import eu.clarin.sru.client.SRURecord; |
---|
5 | import eu.clarin.sru.fcs.aggregator.scan.Corpus; |
---|
6 | import eu.clarin.sru.client.SRUSearchRetrieveResponse; |
---|
7 | import eu.clarin.sru.client.SRUSurrogateRecordData; |
---|
8 | import eu.clarin.sru.client.fcs.ClarinFCSRecordData; |
---|
9 | import eu.clarin.sru.client.fcs.DataView; |
---|
10 | import eu.clarin.sru.client.fcs.DataViewGenericDOM; |
---|
11 | import eu.clarin.sru.client.fcs.DataViewGenericString; |
---|
12 | import eu.clarin.sru.client.fcs.DataViewHits; |
---|
13 | import eu.clarin.sru.client.fcs.Resource; |
---|
14 | import java.util.ArrayList; |
---|
15 | import java.util.List; |
---|
16 | import org.w3c.dom.Node; |
---|
17 | import org.slf4j.LoggerFactory; |
---|
18 | |
---|
19 | /** |
---|
20 | * Represents the results of a SRU search-retrieve operation request. It |
---|
21 | * contains the endpoint/corpus (if specified in the request) to which a request |
---|
22 | * was sent, and the corresponding SRU search-retrieve response. |
---|
23 | * |
---|
24 | * @author Yana Panchenko |
---|
25 | * @author edima |
---|
26 | */ |
---|
27 | public final class Result { |
---|
28 | |
---|
29 | private static final org.slf4j.Logger log = LoggerFactory.getLogger(Result.class); |
---|
30 | |
---|
31 | private Request request; |
---|
32 | private List<Kwic> kwics = new ArrayList<Kwic>(); |
---|
33 | private SRUClientException exception; |
---|
34 | |
---|
35 | public List<Kwic> getKwics() { |
---|
36 | return kwics; |
---|
37 | } |
---|
38 | |
---|
39 | public Result(Request request, SRUSearchRetrieveResponse response, |
---|
40 | SRUClientException xc) { |
---|
41 | this.request = request; |
---|
42 | this.exception = xc; |
---|
43 | if (response != null && response.hasRecords()) { |
---|
44 | setResponse(response); |
---|
45 | } |
---|
46 | } |
---|
47 | |
---|
48 | public void setResponse(SRUSearchRetrieveResponse response) { |
---|
49 | for (SRURecord record : response.getRecords()) { |
---|
50 | if (record.isRecordSchema(ClarinFCSRecordData.RECORD_SCHEMA)) { |
---|
51 | ClarinFCSRecordData rd = (ClarinFCSRecordData) record.getRecordData(); |
---|
52 | Resource resource = rd.getResource(); |
---|
53 | setClarinRecord(resource); |
---|
54 | log.debug("Resource ref={0}, pid={1}, dataViews={2}", |
---|
55 | new Object[]{resource.getRef(), resource.getPid(), resource.hasDataViews()}); |
---|
56 | } else if (record.isRecordSchema(SRUSurrogateRecordData.RECORD_SCHEMA)) { |
---|
57 | SRUSurrogateRecordData r = (SRUSurrogateRecordData) record.getRecordData(); |
---|
58 | log.info("Surrogate diagnostic: uri={0}, message={1}, detail={2}", |
---|
59 | new Object[]{r.getURI(), r.getMessage(), r.getDetails()}); |
---|
60 | } else { |
---|
61 | log.info("Unsupported schema: {0}", record.getRecordSchema()); |
---|
62 | } |
---|
63 | } |
---|
64 | } |
---|
65 | |
---|
66 | private void setClarinRecord(Resource resource) { |
---|
67 | String pid = resource.getPid(); |
---|
68 | String reference = resource.getRef(); |
---|
69 | |
---|
70 | if (resource.hasDataViews()) { |
---|
71 | processDataViews(resource.getDataViews(), pid, reference); |
---|
72 | } |
---|
73 | |
---|
74 | if (resource.hasResourceFragments()) { |
---|
75 | for (Resource.ResourceFragment fragment : resource.getResourceFragments()) { |
---|
76 | log.debug("ResourceFragment: ref={0}, pid={1}, dataViews={2}", |
---|
77 | new Object[]{fragment.getRef(), fragment.getPid(), fragment.hasDataViews()}); |
---|
78 | if (fragment.hasDataViews()) { |
---|
79 | processDataViews(fragment.getDataViews(), |
---|
80 | fragment.getPid() != null ? fragment.getPid() : pid, |
---|
81 | fragment.getRef() != null ? fragment.getRef() : reference); |
---|
82 | } |
---|
83 | } |
---|
84 | } |
---|
85 | } |
---|
86 | |
---|
87 | private void processDataViews(List<DataView> dataViews, String pid, String reference) { |
---|
88 | for (DataView dataview : dataViews) { |
---|
89 | if (dataview instanceof DataViewGenericDOM) { |
---|
90 | final DataViewGenericDOM view = (DataViewGenericDOM) dataview; |
---|
91 | final Node root = view.getDocument().getFirstChild(); |
---|
92 | log.info("DataView (generic dom): root element <{}> / {}", |
---|
93 | root.getNodeName(), |
---|
94 | root.getOwnerDocument().hashCode()); |
---|
95 | } else if (dataview instanceof DataViewGenericString) { |
---|
96 | final DataViewGenericString view |
---|
97 | = (DataViewGenericString) dataview; |
---|
98 | log.info("DataView (generic string): data = {}", |
---|
99 | view.getContent()); |
---|
100 | } else if (dataview instanceof DataViewHits) { |
---|
101 | final DataViewHits hits = (DataViewHits) dataview; |
---|
102 | Kwic kwic = new Kwic(hits, pid, reference); |
---|
103 | kwics.add(kwic); |
---|
104 | log.info("DataViewHits: {}", kwic.getFragments()); |
---|
105 | } |
---|
106 | } |
---|
107 | } |
---|
108 | |
---|
109 | public SRUClientException getException() { |
---|
110 | return exception; |
---|
111 | } |
---|
112 | |
---|
113 | public int getStartRecord() { |
---|
114 | return request.getStartRecord(); |
---|
115 | } |
---|
116 | |
---|
117 | public int getEndRecord() { |
---|
118 | return request.getEndRecord(); |
---|
119 | } |
---|
120 | |
---|
121 | public Corpus getCorpus() { |
---|
122 | return request.getCorpus(); |
---|
123 | } |
---|
124 | |
---|
125 | public String getSearchString() { |
---|
126 | return request.getSearchString(); |
---|
127 | } |
---|
128 | |
---|
129 | } |
---|