Project

General

Profile

1 25725 antonis.le
package eu.dnetlib.data.search.solr;
2
3 47316 katerina.i
import com.google.gson.Gson;
4 49870 katerina.i
import eu.dnetlib.api.data.SearchServiceException;
5 47316 katerina.i
import eu.dnetlib.data.search.transform.Transformer;
6
import eu.dnetlib.data.search.transform.TransformerException;
7
import eu.dnetlib.data.search.utils.solr.SolrResultSetOptionsUtil;
8
import eu.dnetlib.data.search.utils.solr.SolrResultsFormatter;
9 25725 antonis.le
import eu.dnetlib.domain.EPR;
10
import gr.uoa.di.driver.enabling.resultset.ResultSet;
11 56601 katerina.i
import io.micrometer.core.instrument.Timer;
12
import io.micrometer.prometheus.PrometheusMeterRegistry;
13 25786 antonis.le
import org.apache.commons.lang.StringEscapeUtils;
14 25725 antonis.le
import org.apache.log4j.Logger;
15 55643 katerina.i
import org.apache.solr.client.solrj.SolrClient;
16 25725 antonis.le
import org.apache.solr.client.solrj.SolrServerException;
17 55643 katerina.i
import org.apache.solr.client.solrj.impl.CloudSolrClient;
18 25725 antonis.le
import org.apache.solr.client.solrj.response.FacetField;
19
import org.apache.solr.client.solrj.response.QueryResponse;
20
import org.apache.solr.common.SolrDocumentList;
21
import org.apache.solr.common.params.SolrParams;
22
import org.apache.solr.common.util.NamedList;
23
import org.z3950.zing.cql.CQLParseException;
24
25 47316 katerina.i
import javax.ws.rs.core.MediaType;
26 25725 antonis.le
import java.io.IOException;
27 49850 katerina.i
import java.io.OutputStream;
28 55643 katerina.i
import java.util.*;
29 25725 antonis.le
30
/**
31
 * Created by antleb on 2/4/14.
32
 */
33 56601 katerina.i
34 25725 antonis.le
public class SolrResultSet implements ResultSet<String> {
35
36
    private Logger logger = Logger.getLogger(getClass());
37
38
    private EPR epr = null;
39 55643 katerina.i
    public SolrClient solrClient = null;
40 25725 antonis.le
41
    private NamedList<String> queryOpts = new NamedList<String>();
42 47316 katerina.i
    long size = -1;
43 25725 antonis.le
44 56601 katerina.i
    private PrometheusMeterRegistry registry;
45 25725 antonis.le
46 56601 katerina.i
    public SolrResultSet(EPR epr, CloudSolrClient cloudSolrClient, PrometheusMeterRegistry registry) throws IOException, CQLParseException {
47 55643 katerina.i
        logger.debug("Setting solr client " + cloudSolrClient);
48 25725 antonis.le
        this.epr = epr;
49 55643 katerina.i
        this.solrClient = cloudSolrClient;
50 47316 katerina.i
        this.queryOpts = SolrResultSetOptionsUtil.extractQueryOptions(epr.getParameter("query"));
51 25725 antonis.le
52
        String layout = epr.getParameter("layout");
53
        String mdformat = epr.getParameter("mdformat");
54
        String interpretation = epr.getParameter("interpretation");
55
56 55643 katerina.i
        ((CloudSolrClient)solrClient).setDefaultCollection(mdformat + "-" + layout + "-" + interpretation);
57 56601 katerina.i
58
        this.registry = registry;
59 25725 antonis.le
    }
60
61
    @Override
62
    public boolean isOpen() {
63
        return true;
64
    }
65
66
    @Override
67
    public boolean isAlive() {
68
        return true;
69
    }
70
71
    @Override
72
    public void close() {
73 55643 katerina.i
/*
74
        try {
75
            logger.debug("!!!!!!!!! !!!!!!! CLOSING !!!!!!!!! !!!!!!!!!! ");
76
            solrClient.close();
77
78
        } catch (IOException e) {
79
            logger.error("Error closing result set.", e);
80
        }
81
*/
82 25725 antonis.le
    }
83
84
    @Override
85
    public int size() {
86 47316 katerina.i
        return (int) size;
87
    }
88 25725 antonis.le
89 47316 katerina.i
    @Override
90
    @Deprecated
91
    public List<String> getElements(int from, int to) {
92
        return get(from, to);
93 25725 antonis.le
    }
94
95 47316 katerina.i
    List<FacetField> facetFields = null;
96
97
    @Override
98
    @Deprecated
99
    public List<String> get(int from, int to) {
100
        List<String> res = new ArrayList<String>();
101
102 33670 katerina.i
        QueryResponse rsp = null;
103 47316 katerina.i
104
        HashMap<String, List<String>> map = new HashMap<String, List<String>>();
105
106
        logger.debug("from: " + from);
107
        logger.debug("to: " + to);
108
109
110
        queryOpts.add("start", from+1 + "");
111
        queryOpts.add("rows", to + 1+"");
112
113
        try {
114 56601 katerina.i
115 33670 katerina.i
            rsp = solrClient.query(SolrParams.toSolrParams(queryOpts));
116 56601 katerina.i
117 47316 katerina.i
            facetFields = rsp.getFacetFields();
118
            SolrDocumentList docs = rsp.getResults();
119 33670 katerina.i
120 47316 katerina.i
            if (facetFields!=null && !facetFields.isEmpty()) {
121
                for (int i = from - 1; i < to; i++) {
122
                    for (FacetField field : facetFields) {
123
                        if (field.getValueCount() > i) {
124
                            BrowseField bf = new BrowseField();
125
                            bf.setId(field.getValues().get(i).getName());
126
                            bf.setName(field.getValues().get(i).getName());
127
                            bf.setCount(field.getValues().get(i).getCount() + "");
128
                            if (map.get(field.getName()) == null) {
129
                                map.put(field.getName(), new ArrayList<String>());
130
                            }
131 30806 katerina.i
132 47316 katerina.i
                            map.get(field.getName()).add(new Gson().toJson(bf));
133
                        }
134
                    }
135
                }
136 25725 antonis.le
137 47316 katerina.i
                for (Map.Entry<String, List<String>> facetEntry : map.entrySet()) {
138
                    StringBuilder builder = new StringBuilder();
139
                    builder.append("\"" + facetEntry.getKey() + "\"" + " : ");
140
                    builder.append(facetEntry.getValue());
141
                    res.add(builder.toString());
142
                }
143 25725 antonis.le
            }
144
145 47316 katerina.i
            logger.debug("time: " + rsp.getElapsedTime());
146
            logger.debug("found: " + docs.getNumFound());
147
            logger.debug("docs: " + docs.size());
148
149
            for (int i = 0; i < docs.size(); i++) {
150 55643 katerina.i
                String result = (String) docs.get(i).get("__result");
151 47316 katerina.i
                res.add(result);
152
            }
153
154
            return res;
155
156
        } catch (SolrServerException sse) {
157
            logger.error("Fail to get results from Solr. ", sse);
158 55643 katerina.i
159
        } catch (IOException ioe) {
160
            logger.error("Fail to get results from Solr. ", ioe);
161 25725 antonis.le
        }
162
163 47316 katerina.i
        return null;
164 25725 antonis.le
    }
165
166 49850 katerina.i
    @Override
167
    public EPR getEpr() {
168
        return null;
169
    }
170
171 47316 katerina.i
    public Map<String,List<String>> newGet(int from, int to, String format, Transformer transformer, Transformer oldRefineTransformer) {
172
        List<String> refineSolrResults = new ArrayList<String>();
173
        List<String> searchSolrResults = new ArrayList<String>();
174 25725 antonis.le
175 47316 katerina.i
        QueryResponse rsp = null;
176
        HashMap<String, List<String>> map = new HashMap<String, List<String>>();
177 25725 antonis.le
178 47316 katerina.i
        queryOpts.add("start", from*to + "");
179
        queryOpts.add("rows", to +"");
180 57207 katerina.i
        //queryOpts.add("f.resulthostingdatasource.facet.limit", "2");
181 25725 antonis.le
182 56601 katerina.i
        long startTime = System.nanoTime();
183
184 47316 katerina.i
        try {
185 56601 katerina.i
            io.micrometer.core.instrument.Timer.Sample timer = Timer.start(registry);
186
            rsp = solrClient.query(SolrParams.toSolrParams(queryOpts));
187
            timer.stop(registry.timer("solr.server.response.duration"));
188 55643 katerina.i
189 56601 katerina.i
190 47316 katerina.i
            long estimatedTime = System.nanoTime() - startTime;
191
            logger.info("Solrj time " + estimatedTime/1000000 +  " milliseconds for query:" + queryOpts.get("q") +
192
                    " and facets " + queryOpts.getAll("facet.field") + " and fq " + queryOpts.getAll("fq") + " from: "
193
                    + from + " and size " + to);
194 25725 antonis.le
195 47316 katerina.i
            facetFields = rsp.getFacetFields();
196 25725 antonis.le
197 47316 katerina.i
            SolrDocumentList docs = rsp.getResults();
198 25725 antonis.le
199 47316 katerina.i
            this.size = docs.getNumFound();
200 25725 antonis.le
201 47316 katerina.i
            if (facetFields!=null && !facetFields.isEmpty()) {
202
                if (format != null && format.equals(MediaType.APPLICATION_JSON)) {
203
                    for (FacetField field : facetFields) {
204
                        map.put(field.getName(), new ArrayList<String>());
205
                        BrowseField bf = null;
206
                        for (int i = 0; i < field.getValueCount(); i++) {
207
                            bf = new BrowseField();
208 47770 katerina.i
                            //bf.setId(org.apache.commons.lang3.StringEscapeUtils.escapeJson(field.getValues().get(i).getName()));
209
                            bf.setId(field.getValues().get(i).getName());
210
                            String[] facetedValues = field.getValues().get(i).getName().split("\\|\\|",2);
211 25725 antonis.le
212 55643 katerina.i
213
                            logger.debug("faceted values " + Arrays.toString(facetedValues));
214
215 47316 katerina.i
                            if (facetedValues.length > 1) {
216 47770 katerina.i
                                //bf.setName(org.apache.commons.lang3.StringEscapeUtils.escapeJson(facetedValues[1]));
217
                                bf.setName(facetedValues[1]);
218 55643 katerina.i
                                logger.debug("faceted values [1] " + facetedValues[1]);
219 47316 katerina.i
220
                            } else if (field.getValues().get(i).getName().split("_\\:\\:",2).length > 1) {
221 47770 katerina.i
                                //bf.setName(org.apache.commons.lang3.StringEscapeUtils.escapeJson(field.getValues().get(i).getName().split("\\:\\:",2)[1]).replaceAll("\\:\\:", "\\|"));
222
                                bf.setName(field.getValues().get(i).getName().split("\\:\\:",2)[1].replaceAll("\\:\\:", "\\|"));
223 47316 katerina.i
224
                            } else {
225 47770 katerina.i
                                //bf.setName(org.apache.commons.lang3.StringEscapeUtils.escapeJson(field.getValues().get(i).getName()));
226
                                bf.setName(field.getValues().get(i).getName());
227 47316 katerina.i
                            }
228
229
                            bf.setCount(field.getValues().get(i).getCount() + "");
230
                            map.get(field.getName()).add(new Gson().toJson(bf));
231 45684 katerina.i
                        }
232 47316 katerina.i
233 25725 antonis.le
                    }
234 47316 katerina.i
235
                    StringBuilder builder = null;
236
237
                    for (Map.Entry<String, List<String>> facetEntry : map.entrySet()) {
238
                        builder = new StringBuilder();
239
                        builder.append("\"" + facetEntry.getKey() + "\"" + " : ");
240
                        builder.append(facetEntry.getValue());
241
                        refineSolrResults.add(builder.toString());
242
                    }
243
244 55643 katerina.i
                } else { //the old implementation & xml as default
245 47316 katerina.i
                    logger.debug("Creating old browse results.");
246
                    createXmlRefineFields(refineSolrResults, oldRefineTransformer);
247 25725 antonis.le
                }
248 47316 katerina.i
            }
249 25725 antonis.le
250 47316 katerina.i
            for (int i = 0; i < docs.size(); i++) {
251 55643 katerina.i
                String result = (String) docs.get(i).get("__result");
252
253
                logger.debug("["+ i +"]: " + docs.get(i).get("__result"));
254
255 47316 katerina.i
                try {
256
                    if (transformer != null) {
257 55643 katerina.i
                        logger.debug("1 >>>>>>" + result);
258 47316 katerina.i
                        String xml = result.replaceAll("<em>","").replaceAll("</em>","");
259
                        result = transformer.transform(xml);
260 55643 katerina.i
                        logger.debug("2 >>>>>>" + result);
261 47316 katerina.i
                    }
262 55643 katerina.i
263 47316 katerina.i
                } catch (TransformerException te) {
264
                    logger.warn("Error transforming " + result, te);
265
                    continue;
266
                }
267
268
                if (format != null && format.equals(MediaType.APPLICATION_JSON)) {
269
                    searchSolrResults.add(SolrResultsFormatter.xml2Json(result));
270
                } else { // default xml
271
                    searchSolrResults.add(result);
272
                }
273 25725 antonis.le
            }
274
275 47316 katerina.i
            Map<String,List<String>> response = new HashMap<String, List<String>>();
276 45684 katerina.i
277 55643 katerina.i
            //logger.debug("refine results " + refineSolrResults);
278 56601 katerina.i
            //logger.info("search results SIZE " + searchSolrResults.size());
279
            //logger.info("search results " + searchSolrResults);
280 47316 katerina.i
281 56601 katerina.i
282 47316 katerina.i
            response.put("refine",refineSolrResults);
283
            response.put("search", searchSolrResults);
284
285
            return response;
286
287
        } catch (SolrServerException sse) {
288
            logger.error("Error calling Solr.", sse);
289 55643 katerina.i
290
        } catch (IOException ioe) {
291
            logger.error("Error calling Solr.", ioe);
292 56601 katerina.i
293 47316 katerina.i
        }
294 56601 katerina.i
295 47316 katerina.i
        return null;
296 25725 antonis.le
    }
297
298 57207 katerina.i
    /**
299
     * limit is the maximum number of results the cursor get is allowed to fetch. If limit is set to -1 all
300
     * results are returned.
301
     */
302
    public void cursorGet(Transformer transformer, int limit, OutputStream os) throws SolrServerException, SearchServiceException {
303
304
        int rows = 500;
305
        int limitCounter = -1;
306
307 49850 katerina.i
        queryOpts.add("start", "0");
308 49870 katerina.i
        queryOpts.add("rows", "0");
309
        queryOpts.remove("rows");
310 57207 katerina.i
        queryOpts.add("rows", rows+"");
311 49850 katerina.i
        queryOpts.add("fl", "__result");
312
        queryOpts.add("shards.tolerant","true");
313
        queryOpts.add("cursorMark", "*");
314
        queryOpts.add("sort", "__indexrecordidentifier asc");
315
316
        String cursorMark = "*";
317
        String nextCursorMark = "";
318
319 57207 katerina.i
        if ( limit > 0 ) {
320
            limitCounter = limit/rows;
321
            logger.info("limit counter " + limitCounter);
322
        }
323
324 55643 katerina.i
        try {
325
            QueryResponse resp = solrClient.query(SolrParams.toSolrParams(queryOpts));
326 49850 katerina.i
327 57207 katerina.i
            while (!cursorMark.equals(nextCursorMark) && ( limitCounter > 0 || limitCounter == -1)) {
328
                //logger.info(">> " + limitCounter);
329 55643 katerina.i
                resp = solrClient.query(SolrParams.toSolrParams(queryOpts));
330
                cursorMark = nextCursorMark;
331
                nextCursorMark = resp.getNextCursorMark();
332 49850 katerina.i
333 55643 katerina.i
                for (int i = 0; i < resp.getResults().size(); i++) {
334
                    if (transformer != null) {
335
                        String result = null;
336
                        try {
337 57207 katerina.i
                            logger.debug("PRE RESULT " + resp.getResults().get(i).get("__result"));
338 55643 katerina.i
                            result = transformer.transform((String) resp.getResults().get(i).get("__result"));
339
                            logger.debug("RESULT " + result);
340 49870 katerina.i
341 55643 katerina.i
                        } catch (TransformerException te) {
342
                            logger.warn("Error transforming " + result, te);
343
                            continue;
344
                        }
345 50018 katerina.i
346 55643 katerina.i
                        try {
347
                            os.write(result.getBytes());
348
                            os.flush();
349
                        } catch (IOException e) {
350
                            logger.error("Cursor get... ", e);
351
                            continue;
352
                        }
353 50018 katerina.i
                    }
354 49850 katerina.i
                }
355 55643 katerina.i
356
                queryOpts.remove("cursorMark");
357
                queryOpts.add("cursorMark", nextCursorMark);
358 57207 katerina.i
                limitCounter--;
359 49850 katerina.i
            }
360
361 55643 katerina.i
        } catch (IOException ioe) {
362
            logger.error("Error executing solr query. ", ioe);
363 49870 katerina.i
        }
364 49850 katerina.i
    }
365
366 50401 katerina.i
367 47316 katerina.i
    //TODO get rid of this as soon as Joomla portal is out
368
    //Just copied and refactored the old one...
369
    @Deprecated
370
    private void createXmlRefineFields(List<String> res, Transformer oldRefineTransformer) {
371
        int max = -12;
372 25725 antonis.le
373 47316 katerina.i
        for (FacetField field:facetFields) {
374
            logger.debug("field " + field.getName() + " has count " + field.getValueCount());
375 25725 antonis.le
376 47316 katerina.i
            if (field.getValueCount() > max) {
377
                max = field.getValueCount();
378
            }
379
        }
380 25725 antonis.le
381 47316 katerina.i
        logger.debug("max " + max);
382 25725 antonis.le
383 47316 katerina.i
        for (int i = 0; i < max; i++) {
384
            StringBuilder sb = new StringBuilder();
385 25725 antonis.le
386 47316 katerina.i
            sb.append("<row>");
387
            for (FacetField field:facetFields) {
388
                if (field.getValueCount() > i) {
389
                    sb.append("<groupresult field=\"").append(field.getName()).append("\">");
390
                    sb.append("<count>").append(field.getValues().get(i).getCount()).append("</count>");
391
                    sb.append("<originalValue>").append(StringEscapeUtils.escapeXml(field.getValues().get(i).getName())).append("</originalValue>");
392 25725 antonis.le
393 47316 katerina.i
                    String[] facetValues = field.getValues().get(i).getName().split("\\|\\|");
394
                    if(facetValues.length > 1) {
395
                        sb.append("<value>").append(StringEscapeUtils.escapeXml(facetValues[1])).append("</value>");
396
                    } else {
397
                        sb.append("<value>").append(StringEscapeUtils.escapeXml(facetValues[0])).append("</value>");
398
                    }
399
                    sb.append("</groupresult>");
400
                }
401 25725 antonis.le
            }
402 47316 katerina.i
            sb.append("</row>");
403 25725 antonis.le
404 47316 katerina.i
            try {
405
                //logger.debug("row: " + sb.toString());
406
                //logger.debug("row2: " + oldRefineTransformer.transform(sb.toString()));
407
408
                //TODO remove
409
                res.add(oldRefineTransformer.transform(sb.toString()));
410
411
            } catch (TransformerException te) {
412
                logger.error("Cannot transform refine for: " + sb.toString(), te);
413
            }
414 25725 antonis.le
        }
415
    }
416
417 55652 katerina.i
 /*   public static void main(String[] args) throws IOException, CQLParseException, SolrServerException {
418 47316 katerina.i
        CloudSolrServer solrClient = new CloudSolrServer("beta.solr.openaire.eu:9983");
419 55652 katerina.i
        solrClient.setDefaultCollection("DMF-index-openaire");
420 49850 katerina.i
421 47316 katerina.i
        NamedList<String> queryOpts = new NamedList<String>();
422 25725 antonis.le
423 49850 katerina.i
        //q=*:*&start=0&rows=10&cursorMark=*&sort=dateofcollection asc
424 55652 katerina.i
        queryOpts.add("q", new CqlTranslatorImpl().getTranslatedQuery("objIdentifier = acm_________::0002c24f82c295e925a2bdf7bbf49bfc").asLucene());
425 49850 katerina.i
        queryOpts.add("start", "0");
426 55652 katerina.i
        queryOpts.add("rows", "1");
427
        queryOpts.add("fl", "__result");
428 49850 katerina.i
        queryOpts.add("shards.tolerant","true");
429 55652 katerina.i
        queryOpts.add("cursorMark", "*");
430
        queryOpts.add("sort", "__indexrecordidentifier asc");
431 49850 katerina.i
432
433
        //queryOpts.add("q", new CqlTranslatorImpl().getTranslatedQuery("oaftype exact project").asLucene());
434 47316 katerina.i
        NamedList<String> extraOpts = new NamedList<String>();
435 30806 katerina.i
436 49850 katerina.i
        QueryResponse resp = solrClient.query(SolrParams.toSolrParams(queryOpts));
437
438
        System.out.println("results " + resp.getResults().size());
439
440 55652 katerina.i
        String cursorMark = "*";
441 49850 katerina.i
        String nextCursorMark = "";
442
443
        int curs = 0;
444
        while (!cursorMark.equals(nextCursorMark)) {
445
            System.out.println("cursor " + cursorMark);
446
            System.out.println("next cursor " + nextCursorMark);
447
            cursorMark = nextCursorMark;
448
            for (int i = 0; i < resp.getResults().size(); i++) {
449
                String result = ((ArrayList<String>) resp.getResults().get(i).get("__result")).get(0);
450
                //System.out.println(result);
451
                resp = solrClient.query(SolrParams.toSolrParams(queryOpts));
452
            }
453
            nextCursorMark = resp.getNextCursorMark();
454
            queryOpts.add("cursorMark", nextCursorMark);
455
456
            System.out.println("CURS " + curs);
457
            curs ++;
458
459
        }
460
461
462
        //System.out.println((new CqlTranslatorImpl().getTranslatedQuery("objIdentifier = acm_________::0002c24f82c295e925a2bdf7bbf49bfc").asLucene()));
463
464
465
466 47316 katerina.i
        //extraOpts.add("start", "1");
467
       // extraOpts.add("rows", "10");
468
       // extraOpts.addAll(queryOpts);
469 45684 katerina.i
470 49850 katerina.i
        //queryOpts.add("facet", "true");
471 47316 katerina.i
        //TranslatedQuery translatedQuery = new CqlTranslatorImpl().getTranslatedQuery("oaftype=result sortBy resultdateofacceptance/sort.descending");
472 45684 katerina.i
473 47316 katerina.i
     //   queryOpts.add("q", "oaftype=project");
474 49850 katerina.i
        //queryOpts.add("facet", "true");
475
        //queryOpts.add("facet.mincount", "1");
476
        //queryOpts.add("fq", "popularity");
477 45684 katerina.i
478 25725 antonis.le
479
480 47316 katerina.i
//        queryOpts.put("fq", new CqlTranslatorImpl().getTranslatedQuery("").asLucene());
481
       // queryOpts.add("facet.field", "contextid");
482
       //  queryOpts.add("facet.field", "contextname");
483
       //  queryOpts.add("facet.mincount", "1");
484
       //  queryOpts.add("facet.threads", "10");
485
       // System.out.println(translatedQuery.getOptions().getSort().getMode());
486
       // System.out.println(translatedQuery.getOptions().getSort().getField());
487 30806 katerina.i
488 47316 katerina.i
        //queryOpts.add("sort", translatedQuery.getOptions().getSort().getField() + " " + translatedQuery.getOptions().getSort().getMode() );
489 25725 antonis.le
490
491 49850 katerina.i
492 47316 katerina.i
/*        QueryResponse resp = null;
493
        synchronized (solrClient) {
494
            resp = solrClient.query(SolrParams.toSolrParams(extraOpts));
495
        }*/
496
//        System.out.println("time: " + resp.getElapsedTime());
497
    //System.out.println("results: " + resp.getResults());
498 25725 antonis.le
499 47316 katerina.i
/*      System.out.println(resp.getFacetField("contextname").getValueCount());
500 25725 antonis.le
501 47316 katerina.i
        for (FacetField.Count count:resp.getFacetField("contextname").getValues())
502
            System.out.println(count.getName() + " : " +  count.getCount());
503 25725 antonis.le
504
505 47316 katerina.i
        int max = -12;
506 45684 katerina.i
507 47316 katerina.i
        for (FacetField field:resp.getFacetFields()) {
508
            if (field.getValueCount() > max)
509
                max = field.getValueCount();
510 45684 katerina.i
511 25725 antonis.le
        }
512
513 47316 katerina.i
        System.out.println("max: " + max);
514
*/
515 55652 katerina.i
 //   }
516 25725 antonis.le
517 49850 katerina.i
//    @Override
518
//    public EPR getEpr() {
519
//        return epr;
520
//   }
521 47316 katerina.i
}
522 45684 katerina.i
523 47316 katerina.i
class BrowseField {
524
    String name;
525 45684 katerina.i
526 47316 katerina.i
    public String getName() {
527
        return name;
528
    }
529
530
    public void setName(String name) {
531
        this.name = name;
532
    }
533
534
    public String getId() {
535
        return id;
536
    }
537
538
    public void setId(String id) {
539
        this.id = id;
540
    }
541
542
    public String getCount() {
543
        return count;
544
    }
545
546
    public void setCount(String count) {
547
        this.count = count;
548
    }
549
550
    String id;
551
    String count;
552
553
554 25725 antonis.le
}