Changeset 5743 for SRUClient


Ignore:
Timestamp:
10/24/14 14:01:20 (10 years ago)
Author:
Oliver Schonefeld
Message:
  • more work-in-progress
Location:
SRUClient/trunk
Files:
5 added
1 deleted
10 edited
1 moved

Legend:

Unmodified
Added
Removed
  • SRUClient/trunk/pom.xml

    r2999 r5743  
    3434            <groupId>org.apache.httpcomponents</groupId>
    3535            <artifactId>httpclient</artifactId>
    36             <version>4.2.5</version>
     36            <version>4.3.5</version>
    3737        </dependency>
    3838
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUSimpleClient.java

    r2997 r5743  
    3232
    3333import org.apache.http.HttpEntity;
    34 import org.apache.http.HttpResponse;
    3534import org.apache.http.HttpStatus;
    3635import org.apache.http.StatusLine;
    3736import org.apache.http.client.ClientProtocolException;
    38 import org.apache.http.client.HttpClient;
     37import org.apache.http.client.config.CookieSpecs;
     38import org.apache.http.client.config.RequestConfig;
     39import org.apache.http.client.methods.CloseableHttpResponse;
    3940import org.apache.http.client.methods.HttpGet;
    40 import org.apache.http.client.utils.HttpClientUtils;
    41 import org.apache.http.impl.client.DefaultHttpClient;
    42 import org.apache.http.params.CoreProtocolPNames;
    43 import org.apache.http.util.EntityUtils;
     41import org.apache.http.config.SocketConfig;
     42import org.apache.http.impl.NoConnectionReuseStrategy;
     43import org.apache.http.impl.client.CloseableHttpClient;
     44import org.apache.http.impl.client.HttpClients;
     45import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    4446import org.slf4j.Logger;
    4547import org.slf4j.LoggerFactory;
     
    6567 */
    6668public class SRUSimpleClient {
     69    private static final String USER_AGENT = "SRU-Client/1.0.0";
    6770    /** default version the client will use, if not otherwise specified */
    6871    public static final SRUVersion DEFAULT_SRU_VERSION = SRUVersion.VERSION_1_2;
     
    8184    private final SRUVersion defaultVersion;
    8285    private final Map<String, SRURecordDataParser> parsers;
    83     private final HttpClient httpClient;
     86    private final CloseableHttpClient httpClient;
    8487    private final XmlStreamReaderProxy proxy = new XmlStreamReaderProxy();
    8588    private final SRUExplainRecordDataParser explainRecordParser =
     
    138141        this.defaultVersion = defaultVersion;
    139142        this.parsers        = parsers;
    140         this.httpClient     = new DefaultHttpClient();
    141         this.httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
    142                     "eu.clarin.sru.client/0.0.1");
     143
     144        // create HTTP client
     145        // FIXME: get timeout values from somewhere?
     146        final int connectTimeout = 30 * 1000;
     147        final int socketTimeout = 180 * 1000;
     148        httpClient = createHttpClient(connectTimeout, socketTimeout);
    143149    }
    144150
     
    206212        // create URI and perform request
    207213        final URI uri = request.makeURI(defaultVersion);
    208         HttpResponse response = executeRequest(uri);
    209         HttpEntity entity = response.getEntity();
    210         if (entity == null) {
    211             throw new SRUClientException("cannot get entity");
    212         }
    213 
    214         InputStream stream = null;
    215         SRUXMLStreamReader reader = null;
     214        CloseableHttpResponse response = executeRequest(uri);
     215        InputStream stream             = null;
     216        SRUXMLStreamReader reader      = null;
    216217        try {
     218            final HttpEntity entity = response.getEntity();
     219            if (entity == null) {
     220                throw new SRUClientException("cannot get entity");
     221            }
     222
    217223            stream = entity.getContent();
    218224
     
    257263
    258264            /* make sure to release allocated resources */
    259             HttpClientUtils.closeQuietly(response);
     265            try {
     266                response.close();
     267            } catch (IOException e) {
     268                /* IGNORE */
     269            }
    260270        }
    261271    }
     
    292302        // create URI and perform request
    293303        final URI uri = request.makeURI(defaultVersion);
    294         HttpResponse response = executeRequest(uri);
    295         HttpEntity entity = response.getEntity();
    296         if (entity == null) {
    297             throw new SRUClientException("cannot get entity");
    298         }
    299 
    300         InputStream stream = null;
    301         SRUXMLStreamReader reader = null;
     304        CloseableHttpResponse response = executeRequest(uri);
     305        InputStream stream             = null;
     306        SRUXMLStreamReader reader      = null;
    302307        try {
     308            final HttpEntity entity = response.getEntity();
     309            if (entity == null) {
     310                throw new SRUClientException("cannot get entity");
     311            }
    303312            stream = entity.getContent();
    304313
     
    343352
    344353            /* make sure to release allocated resources */
    345             HttpClientUtils.closeQuietly(response);
     354            try {
     355                response.close();
     356            } catch (IOException e) {
     357                /* IGNORE */
     358            }
    346359        }
    347360    }
     
    378391        // create URI and perform request
    379392        final URI uri = request.makeURI(defaultVersion);
    380         HttpResponse response = executeRequest(uri);
    381         HttpEntity entity = response.getEntity();
    382         if (entity == null) {
    383             throw new SRUClientException("cannot get entity");
    384         }
    385 
    386         InputStream stream = null;
    387         SRUXMLStreamReader reader = null;
     393        CloseableHttpResponse response = executeRequest(uri);
     394        InputStream stream             = null;
     395        SRUXMLStreamReader reader      = null;
    388396        try {
     397            final HttpEntity entity = response.getEntity();
     398            if (entity == null) {
     399                throw new SRUClientException("cannot get entity");
     400            }
     401
    389402            stream = entity.getContent();
    390403
     
    429442
    430443            /* make sure to release allocated resources */
    431             HttpClientUtils.closeQuietly(response);
    432         }
    433     }
    434 
    435 
    436     private HttpResponse executeRequest(URI uri) throws SRUClientException {
    437         HttpGet request = null;
    438         HttpResponse response = null;
     444            try {
     445                response.close();
     446            } catch (IOException e) {
     447                /* IGNORE */
     448            }
     449        }
     450    }
     451
     452
     453    private CloseableHttpResponse executeRequest(URI uri)
     454            throws SRUClientException {
     455        CloseableHttpResponse response = null;
     456        boolean forceClose             = true;
    439457        try {
    440458            logger.debug("submitting HTTP request: {}", uri.toString());
    441459            try {
    442                 request = new HttpGet(uri);
    443                 response = httpClient.execute(request);
     460                HttpGet request = new HttpGet(uri);
     461                response        = httpClient.execute(request);
    444462                StatusLine status = response.getStatusLine();
    445463                if (status.getStatusCode() != HttpStatus.SC_OK) {
     
    451469                    }
    452470                }
     471                forceClose = false;
    453472                return response;
    454473            } catch (ClientProtocolException e) {
     
    471490             * we've used
    472491             */
    473             if (response != null) {
     492            if (forceClose && (response != null)) {
    474493                try {
    475                     EntityUtils.consume(response.getEntity());
     494                    response.close();
    476495                } catch (IOException ex) {
    477496                    /* IGNORE */
    478497                }
    479 
    480                 /* make sure to release allocated resources */
    481                 HttpClientUtils.closeQuietly(response);
    482             }
    483             if (request != null) {
    484                 request.abort();
    485498            }
    486499            throw e;
     
    13571370
    13581371
    1359     private SRUXMLStreamReader createReader(InputStream in, boolean wrap)
     1372    private static SRUXMLStreamReader createReader(InputStream in, boolean wrap)
    13601373            throws XMLStreamException {
    13611374        return new SRUXMLStreamReader(in, wrap);
    13621375    }
    13631376
     1377
     1378    private static CloseableHttpClient createHttpClient(int connectTimeout,
     1379            int socketTimeout) {
     1380        final PoolingHttpClientConnectionManager manager =
     1381                new PoolingHttpClientConnectionManager();
     1382        manager.setDefaultMaxPerRoute(8);
     1383        manager.setMaxTotal(128);
     1384
     1385        final SocketConfig socketConfig = SocketConfig.custom()
     1386                .setSoReuseAddress(true)
     1387                .setSoLinger(0)
     1388                .build();
     1389
     1390        final RequestConfig requestConfig = RequestConfig.custom()
     1391                .setAuthenticationEnabled(false)
     1392                .setRedirectsEnabled(true)
     1393                .setMaxRedirects(4)
     1394                .setCircularRedirectsAllowed(false)
     1395                .setCookieSpec(CookieSpecs.IGNORE_COOKIES)
     1396                .setConnectTimeout(connectTimeout)
     1397                .setSocketTimeout(socketTimeout)
     1398                .setConnectionRequestTimeout(0) /* infinite */
     1399                .setStaleConnectionCheckEnabled(false)
     1400                .build();
     1401
     1402        return HttpClients.custom()
     1403                .setUserAgent(USER_AGENT)
     1404                .setConnectionManager(manager)
     1405                .setDefaultSocketConfig(socketConfig)
     1406                .setDefaultRequestConfig(requestConfig)
     1407                .setConnectionReuseStrategy(new NoConnectionReuseStrategy())
     1408                .build();
     1409    }
     1410
    13641411} // class SRUSimpleClient
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/XmlStreamReaderUtils.java

    r5439 r5743  
    247247
    248248
     249    public static boolean peekEnd(XMLStreamReader reader,
     250            String namespaceURI, String localName)
     251            throws XMLStreamException {
     252        if (reader.isWhiteSpace()) {
     253            consumeWhitespace(reader);
     254        }
     255        if (!reader.isEndElement()) {
     256            return false;
     257        }
     258        return namespaceURI.equals(reader.getNamespaceURI()) &&
     259                localName.equals(reader.getLocalName());
     260    }
     261
     262
    249263    public static void consumeStart(XMLStreamReader reader)
    250264            throws XMLStreamException {
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/fcs/ClarinFCSRecordData.java

    r2467 r5743  
    3030     * The record schema for CLARIN-FCS records.
    3131     */
    32     public static final String RECORD_SCHEMA = "http://clarin.eu/fcs/1.0";
     32    public static final String RECORD_SCHEMA =
     33            "http://clarin.eu/fcs/resource";
     34    /**
     35     * The legacy record schema for CLARIN-FCS records.
     36     *
     37     * @deprecated Only use to talk to legacy clients
     38     */
     39    @Deprecated
     40    public static final String LEGACY_RECORD_SCHEMA =
     41            "http://clarin.eu/fcs/1.0";
    3342    private final Resource resource;
    3443
     
    5463    /**
    5564     * Get the CLARIN-FCS record resource.
    56      * 
     65     *
    5766     * @return a {@link Resource} object
    5867     */
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/fcs/ClarinFCSRecordDataParser.java

    r3001 r5743  
    1717package eu.clarin.sru.client.fcs;
    1818
    19 import java.util.LinkedList;
    2019import java.util.List;
    2120
    2221import javax.xml.stream.XMLStreamException;
    2322import javax.xml.stream.XMLStreamReader;
    24 import org.slf4j.Logger;
    25 import org.slf4j.LoggerFactory;
     23
    2624import eu.clarin.sru.client.SRUClientException;
    2725import eu.clarin.sru.client.SRURecordData;
    28 import eu.clarin.sru.client.SRURecordDataParser;
    29 import eu.clarin.sru.client.XmlStreamReaderUtils;
    3026
    3127
    3228/**
    33  * A record parse to parse records conforming to CLARIN-FCS specification.
     29 * A record data parse to parse records conforming to CLARIN-FCS specification.
    3430 */
    35 public class ClarinFCSRecordParser implements SRURecordDataParser {
    36     private static final Logger logger =
    37             LoggerFactory.getLogger(ClarinFCSRecordParser.class);
    38     private static final String FCS_NS =
    39             ClarinFCSRecordData.RECORD_SCHEMA;
    40     // TODO: make this configurable
    41     private final DataViewParser[] parsers = new DataViewParser[] {
    42             new DataViewParserGenericDOM(),
    43 //            new DataViewParserGenericString(),
    44             new DataViewParserKWIC()
    45     };
     31public class ClarinFCSRecordDataParser extends
     32        AbstractClarinFCSRecordDataParser {
     33
     34
     35    /**
     36     * Constructor.
     37     *
     38     * @param parsers
     39     *            the list of data view parsers to be used by this record data
     40     *            parser. This list should contain one
     41     *            {@link DataViewParserGenericDOM} or
     42     *            {@link DataViewParserGenericString} instance.
     43     * @throws NullPointerException
     44     *             if parsers is <code>null</code>
     45     * @throws IllegalArgumentException
     46     *             if parsers is empty or contains duplicate entries
     47     */
     48    public ClarinFCSRecordDataParser(List<DataViewParser> parsers) {
     49        super(parsers);
     50    }
     51
    4652
    4753
     
    5763        logger.debug("parsing CLARIN-FCS record");
    5864
    59         // Resource
    60         XmlStreamReaderUtils.readStart(reader, FCS_NS, "Resource", true, true);
    61         String pid = XmlStreamReaderUtils.readAttributeValue(reader, null, "pid");
    62         String ref = XmlStreamReaderUtils.readAttributeValue(reader, null, "ref");
    63         XmlStreamReaderUtils.consumeStart(reader);
    64 
    65         // Resource/Resource (optional)
    66         if (XmlStreamReaderUtils.readStart(reader, FCS_NS, "Resource", false)) {
    67             logger.info("skipping nested <Resource> element");
    68             XmlStreamReaderUtils.readEnd(reader, FCS_NS, "Resource", true);
    69         }
    70 
    71         // Resource/DataView
    72         final List<DataView> dataviews = parseDataViews(reader);
    73 
    74         // Resource/ResourceFragment
    75         final List<Resource.ResourceFragment> resourceFragments =
    76                 parseResourceFragments(reader);
    77 
    78         XmlStreamReaderUtils.readEnd(reader, FCS_NS, "Resource", true);
    79 
    80         return new ClarinFCSRecordData(pid, ref, dataviews, resourceFragments);
    81     }
    82 
    83 
    84     private List<DataView> parseDataViews(XMLStreamReader reader)
    85             throws XMLStreamException, SRUClientException {
    86         List<DataView> dataviews = null;
    87 
    88         while (XmlStreamReaderUtils.readStart(reader, FCS_NS, "DataView", false, true)) {
    89             String pid = XmlStreamReaderUtils.readAttributeValue(reader, null, "pid");
    90             String ref = XmlStreamReaderUtils.readAttributeValue(reader, null, "ref");
    91             String type = XmlStreamReaderUtils.readAttributeValue(reader, null, "type");
    92             if ((type == null) || type.isEmpty()) {
    93                 throw new SRUClientException("element <DataView> needs a "
    94                         + "non-empty 'type' attribute");
    95             }
    96 
    97             // consume start element and get rid of any whitespace
    98             XmlStreamReaderUtils.consumeStart(reader);
    99             XmlStreamReaderUtils.consumeWhitespace(reader);
    100 
    101             logger.debug("processing <DataView> of type = {}", type);
    102 
    103             DataViewParser parser = null;
    104             for (int i = 0; i < parsers.length; i++) {
    105                 if (parsers[i].acceptType(type) &&
    106                         ((parser == null) ||
    107                          (parser.getPriority() < parsers[i].getPriority()))) {
    108                     parser = parsers[i];
    109                 }
    110             }
    111 
    112             DataView dataview = null;
    113             if (parser != null) {
    114                 dataview = parser.parse(reader, type, pid, ref);
    115             } else {
    116                 logger.warn("no parser found for <DataView> of type = {}", type);
    117             }
    118 
    119             XmlStreamReaderUtils.readEnd(reader, FCS_NS, "DataView", true);
    120 
    121             if (dataview != null) {
    122                 if (dataviews == null) {
    123                     dataviews = new LinkedList<DataView>();
    124                 }
    125                 dataviews.add(dataview);
    126             } else {
    127                 logger.warn("skipped <DataView> of type = {}", type);
    128             }
    129         } // while
    130         return dataviews;
    131     }
    132 
    133 
    134     private List<Resource.ResourceFragment> parseResourceFragments(
    135             XMLStreamReader reader) throws XMLStreamException,
    136             SRUClientException {
    137         List<Resource.ResourceFragment> resourceFragments = null;
    138         while (XmlStreamReaderUtils.readStart(reader, FCS_NS, "ResourceFragment", false, true)) {
    139             logger.debug("found ResourceFragment");
    140             String pid = XmlStreamReaderUtils.readAttributeValue(reader, null, "pid");
    141             String ref = XmlStreamReaderUtils.readAttributeValue(reader, null, "ref");
    142             XmlStreamReaderUtils.consumeStart(reader);
    143             final List<DataView> dataviews = parseDataViews(reader);
    144             XmlStreamReaderUtils.readEnd(reader, FCS_NS, "ResourceFragment", true);
    145 
    146             if (resourceFragments == null) {
    147                 resourceFragments = new LinkedList<Resource.ResourceFragment>();
    148             }
    149             resourceFragments.add(new Resource.ResourceFragment(pid, ref, dataviews));
    150         } // while
    151         return resourceFragments;
     65        return parse(reader, ClarinFCSRecordData.RECORD_SCHEMA);
    15266    }
    15367
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/fcs/DataViewParserKWIC.java

    r2938 r5743  
    2929    private static final String FCS_KWIC_NS = "http://clarin.eu/fcs/1.0/kwic";
    3030    private static final String KWIC_LEGACY_TYPE = "kwic";
     31    private static final String KWIC_TYPE =
     32            "application/x-clarin-fcs-kwic+xml";
    3133    private static final Logger logger =
    3234            LoggerFactory.getLogger(DataViewParserKWIC.class);
     
    3436    @Override
    3537    public boolean acceptType(String type) {
    36         return DataViewKWIC.TYPE.equals(type) ||
    37                 KWIC_LEGACY_TYPE.equals(type);
     38        return KWIC_TYPE.equals(type) || KWIC_LEGACY_TYPE.equals(type);
    3839    }
    3940
     
    4748            String ref) throws XMLStreamException, SRUClientException {
    4849        if (KWIC_LEGACY_TYPE.equals(type)) {
    49             logger.warn("type '" + KWIC_LEGACY_TYPE + "' is deprecteded for a KWIC <DataView>, please use '" + DataViewKWIC.TYPE + "' instead");
     50            logger.warn("type '" + KWIC_LEGACY_TYPE + "' is deprecated " +
     51                    "for a KWIC <DataView>, please use '" +
     52                    KWIC_TYPE + "' instead");
    5053        }
    5154        String left = null;
     
    6770        logger.debug("left='{}' keyword='{}', right='{}'",
    6871                left, keyword, right);
    69         return new DataViewKWIC(pid, ref, left, keyword, right);
     72
     73        logger.warn("Upgraded deprecated KWIC dataview to HITS dataview. " +
     74                "Please upgrade to the new CLARIN-FCS specification " +
     75                "as soon as possible.");
     76        final int[] offsets    = new int[3];
     77        final StringBuilder sb = new StringBuilder();
     78        if (left != null) {
     79            sb.append(left);
     80            if (!Character.isWhitespace(sb.charAt(sb.length() - 1))) {
     81                sb.append(" ");
     82            }
     83        }
     84        offsets[0] = sb.length();
     85        sb.append(keyword);
     86        offsets[1] = sb.length();
     87        if (right != null) {
     88            if (!Character.isWhitespace(sb.charAt(sb.length() - 1))) {
     89                sb.append(" ");
     90            }
     91            sb.append(right);
     92        }
     93        return new DataViewHits(pid, ref, sb.toString(), offsets, 3);
    7094    }
    7195
  • SRUClient/trunk/src/test/java/eu/clarin/sru/client/TestClient.java

    r2936 r5743  
    2020import org.slf4j.LoggerFactory;
    2121
    22 import eu.clarin.sru.client.fcs.ClarinFCSRecordParser;
     22import eu.clarin.sru.client.fcs.ClarinFCSClientBuilder;
    2323
    2424
     
    3131        if (args.length > 0) {
    3232            logger.info("initializing client ...");
    33             SRUClient client = new SRUClient();
    3433
    35             // register record data parsers
    36             client.registerRecordParser(new ClarinFCSRecordParser());
     34            SRUClient client = ClarinFCSClientBuilder.create()
     35                    .defaults()
     36                    .unkownDataViewAsString()
     37                    .enableLegacySupport()
     38                    .buildClient();
    3739
    3840            // explain
  • SRUClient/trunk/src/test/java/eu/clarin/sru/client/TestSimpleClient.java

    r2938 r5743  
    2222import org.slf4j.LoggerFactory;
    2323
     24import eu.clarin.sru.client.fcs.ClarinFCSClientBuilder;
    2425import eu.clarin.sru.client.fcs.ClarinFCSRecordData;
    25 import eu.clarin.sru.client.fcs.ClarinFCSRecordParser;
    2626
    2727
     
    3333        if (args.length > 0) {
    3434            logger.info("initializing client ...");
    35             SRUSimpleClient client = new SRUSimpleClient();
    3635
    37             // register record data parsers
    38             client.registerRecordParser(new ClarinFCSRecordParser());
     36            SRUSimpleClient client = ClarinFCSClientBuilder
     37                        .create()
     38                        .defaults()
     39                        .unkownDataViewAsString()
     40                        .buildSimpleClient();
    3941
    4042            /*
  • SRUClient/trunk/src/test/java/eu/clarin/sru/client/TestThreadedClient.java

    r2936 r5743  
    2323import org.slf4j.LoggerFactory;
    2424
    25 import eu.clarin.sru.client.fcs.ClarinFCSRecordParser;
     25import eu.clarin.sru.client.fcs.ClarinFCSClientBuilder;
    2626
    2727@Deprecated
     
    3333        if (args.length > 0) {
    3434            logger.info("initializing client ...");
    35             SRUThreadedClient client = new SRUThreadedClient();
    3635
    37             // register record data parsers
    38             client.registerRecordParser(new ClarinFCSRecordParser());
     36            SRUThreadedClient client = ClarinFCSClientBuilder
     37                    .create()
     38                    .defaults()
     39                    .buildThreadedClient();
    3940
    4041            try {
  • SRUClient/trunk/src/test/java/eu/clarin/sru/client/TestThreadedClientCallback.java

    r2936 r5743  
    2222import org.slf4j.LoggerFactory;
    2323
    24 import eu.clarin.sru.client.fcs.ClarinFCSRecordParser;
     24import eu.clarin.sru.client.fcs.ClarinFCSClientBuilder;
    2525
    2626
     
    3232        if (args.length > 0) {
    3333            logger.info("initializing client ...");
    34             SRUThreadedClient client = new SRUThreadedClient();
    3534
    36             // register record data parsers
    37             client.registerRecordParser(new ClarinFCSRecordParser());
     35            SRUThreadedClient client = ClarinFCSClientBuilder
     36                    .create()
     37                    .defaults()
     38                    .buildThreadedClient();
    3839
    3940            try {
  • SRUClient/trunk/src/test/java/eu/clarin/sru/client/TestUtils.java

    r2997 r5743  
    3030import eu.clarin.sru.client.fcs.DataViewGenericDOM;
    3131import eu.clarin.sru.client.fcs.DataViewGenericString;
    32 import eu.clarin.sru.client.fcs.DataViewKWIC;
     32import eu.clarin.sru.client.fcs.DataViewHits;
    3333import eu.clarin.sru.client.fcs.Resource;
    3434
     
    6060        SRUSearchRetrieveRequest request = new SRUSearchRetrieveRequest(baseURI);
    6161        request.setQuery(query);
    62         request.setRecordSchema(ClarinFCSRecordData.RECORD_SCHEMA);
     62//        request.setRecordSchema(ClarinFCSRecordData.LEGACY_RECORD_SCHEMA);
    6363        request.setMaximumRecords(5);
    6464        request.setRecordPacking(SRURecordPacking.XML);
     
    214214                final DataViewGenericDOM view = (DataViewGenericDOM) dataview;
    215215                final Node root = view.getDocument().getFirstChild();
    216                 logger.info("{}DataView: root element <{}> / {}",
     216                logger.info("{}DataView (generic dom): root element <{}> / {}",
    217217                        s, root.getNodeName(),
    218218                        root.getOwnerDocument().hashCode());
    219219            } else if (dataview instanceof DataViewGenericString) {
    220                 final DataViewGenericString view = (DataViewGenericString) dataview;
    221                 logger.info("{}DataView: data = {}", s, view.getContent());
    222             } else if (dataview.isMimeType(DataViewKWIC.TYPE)) {
    223                 final DataViewKWIC kw = (DataViewKWIC) dataview;
    224                 logger.info("{}DataView: {} / {} / {}",
    225                         s, kw.getLeft(), kw.getKeyword(), kw.getRight());
    226             }
    227         }
     220                final DataViewGenericString view =
     221                        (DataViewGenericString) dataview;
     222                logger.info("{}DataView (generic string): data = {}",
     223                        s, view.getContent());
     224            } else if (dataview instanceof DataViewHits) {
     225                final DataViewHits hits = (DataViewHits) dataview;
     226                logger.info("{}DataView: {}",
     227                        s, addHitHighlights(hits));
     228            } else {
     229                logger.info("{}DataView: cannot display " +
     230                        "contents of unexpected class '{}'",
     231                        s, dataview.getClass().getName());
     232            }
     233        }
     234    }
     235
     236
     237    private static String addHitHighlights(DataViewHits hits) {
     238        StringBuilder sb = new StringBuilder(hits.getText());
     239        int corr = 0;
     240        for (int i = 0; i < hits.getHitCount(); i++) {
     241            int[] offsets = hits.getHitOffsets(i);
     242            sb.insert(offsets[0] + corr, "[");
     243            corr += 1;
     244            sb.insert(offsets[1] + corr, "]");
     245            corr += 1;
     246        }
     247        return sb.toString();
    228248    }
    229249
Note: See TracChangeset for help on using the changeset viewer.