- Timestamp:
- 10/24/14 14:01:20 (10 years ago)
- Location:
- SRUClient/trunk
- Files:
-
- 5 added
- 1 deleted
- 10 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
SRUClient/trunk/pom.xml
r2999 r5743 34 34 <groupId>org.apache.httpcomponents</groupId> 35 35 <artifactId>httpclient</artifactId> 36 <version>4. 2.5</version>36 <version>4.3.5</version> 37 37 </dependency> 38 38 -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUSimpleClient.java
r2997 r5743 32 32 33 33 import org.apache.http.HttpEntity; 34 import org.apache.http.HttpResponse;35 34 import org.apache.http.HttpStatus; 36 35 import org.apache.http.StatusLine; 37 36 import org.apache.http.client.ClientProtocolException; 38 import org.apache.http.client.HttpClient; 37 import org.apache.http.client.config.CookieSpecs; 38 import org.apache.http.client.config.RequestConfig; 39 import org.apache.http.client.methods.CloseableHttpResponse; 39 40 import 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; 41 import org.apache.http.config.SocketConfig; 42 import org.apache.http.impl.NoConnectionReuseStrategy; 43 import org.apache.http.impl.client.CloseableHttpClient; 44 import org.apache.http.impl.client.HttpClients; 45 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; 44 46 import org.slf4j.Logger; 45 47 import org.slf4j.LoggerFactory; … … 65 67 */ 66 68 public class SRUSimpleClient { 69 private static final String USER_AGENT = "SRU-Client/1.0.0"; 67 70 /** default version the client will use, if not otherwise specified */ 68 71 public static final SRUVersion DEFAULT_SRU_VERSION = SRUVersion.VERSION_1_2; … … 81 84 private final SRUVersion defaultVersion; 82 85 private final Map<String, SRURecordDataParser> parsers; 83 private final HttpClient httpClient;86 private final CloseableHttpClient httpClient; 84 87 private final XmlStreamReaderProxy proxy = new XmlStreamReaderProxy(); 85 88 private final SRUExplainRecordDataParser explainRecordParser = … … 138 141 this.defaultVersion = defaultVersion; 139 142 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); 143 149 } 144 150 … … 206 212 // create URI and perform request 207 213 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; 216 217 try { 218 final HttpEntity entity = response.getEntity(); 219 if (entity == null) { 220 throw new SRUClientException("cannot get entity"); 221 } 222 217 223 stream = entity.getContent(); 218 224 … … 257 263 258 264 /* make sure to release allocated resources */ 259 HttpClientUtils.closeQuietly(response); 265 try { 266 response.close(); 267 } catch (IOException e) { 268 /* IGNORE */ 269 } 260 270 } 261 271 } … … 292 302 // create URI and perform request 293 303 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; 302 307 try { 308 final HttpEntity entity = response.getEntity(); 309 if (entity == null) { 310 throw new SRUClientException("cannot get entity"); 311 } 303 312 stream = entity.getContent(); 304 313 … … 343 352 344 353 /* make sure to release allocated resources */ 345 HttpClientUtils.closeQuietly(response); 354 try { 355 response.close(); 356 } catch (IOException e) { 357 /* IGNORE */ 358 } 346 359 } 347 360 } … … 378 391 // create URI and perform request 379 392 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; 388 396 try { 397 final HttpEntity entity = response.getEntity(); 398 if (entity == null) { 399 throw new SRUClientException("cannot get entity"); 400 } 401 389 402 stream = entity.getContent(); 390 403 … … 429 442 430 443 /* 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; 439 457 try { 440 458 logger.debug("submitting HTTP request: {}", uri.toString()); 441 459 try { 442 request = new HttpGet(uri);443 response = httpClient.execute(request);460 HttpGet request = new HttpGet(uri); 461 response = httpClient.execute(request); 444 462 StatusLine status = response.getStatusLine(); 445 463 if (status.getStatusCode() != HttpStatus.SC_OK) { … … 451 469 } 452 470 } 471 forceClose = false; 453 472 return response; 454 473 } catch (ClientProtocolException e) { … … 471 490 * we've used 472 491 */ 473 if ( response != null) {492 if (forceClose && (response != null)) { 474 493 try { 475 EntityUtils.consume(response.getEntity());494 response.close(); 476 495 } catch (IOException ex) { 477 496 /* IGNORE */ 478 497 } 479 480 /* make sure to release allocated resources */481 HttpClientUtils.closeQuietly(response);482 }483 if (request != null) {484 request.abort();485 498 } 486 499 throw e; … … 1357 1370 1358 1371 1359 private SRUXMLStreamReader createReader(InputStream in, boolean wrap)1372 private static SRUXMLStreamReader createReader(InputStream in, boolean wrap) 1360 1373 throws XMLStreamException { 1361 1374 return new SRUXMLStreamReader(in, wrap); 1362 1375 } 1363 1376 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 1364 1411 } // class SRUSimpleClient -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/XmlStreamReaderUtils.java
r5439 r5743 247 247 248 248 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 249 263 public static void consumeStart(XMLStreamReader reader) 250 264 throws XMLStreamException { -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/fcs/ClarinFCSRecordData.java
r2467 r5743 30 30 * The record schema for CLARIN-FCS records. 31 31 */ 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"; 33 42 private final Resource resource; 34 43 … … 54 63 /** 55 64 * Get the CLARIN-FCS record resource. 56 * 65 * 57 66 * @return a {@link Resource} object 58 67 */ -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/fcs/ClarinFCSRecordDataParser.java
r3001 r5743 17 17 package eu.clarin.sru.client.fcs; 18 18 19 import java.util.LinkedList;20 19 import java.util.List; 21 20 22 21 import javax.xml.stream.XMLStreamException; 23 22 import javax.xml.stream.XMLStreamReader; 24 import org.slf4j.Logger; 25 import org.slf4j.LoggerFactory; 23 26 24 import eu.clarin.sru.client.SRUClientException; 27 25 import eu.clarin.sru.client.SRURecordData; 28 import eu.clarin.sru.client.SRURecordDataParser;29 import eu.clarin.sru.client.XmlStreamReaderUtils;30 26 31 27 32 28 /** 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. 34 30 */ 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 }; 31 public 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 46 52 47 53 … … 57 63 logger.debug("parsing CLARIN-FCS record"); 58 64 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); 152 66 } 153 67 -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/fcs/DataViewParserKWIC.java
r2938 r5743 29 29 private static final String FCS_KWIC_NS = "http://clarin.eu/fcs/1.0/kwic"; 30 30 private static final String KWIC_LEGACY_TYPE = "kwic"; 31 private static final String KWIC_TYPE = 32 "application/x-clarin-fcs-kwic+xml"; 31 33 private static final Logger logger = 32 34 LoggerFactory.getLogger(DataViewParserKWIC.class); … … 34 36 @Override 35 37 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); 38 39 } 39 40 … … 47 48 String ref) throws XMLStreamException, SRUClientException { 48 49 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"); 50 53 } 51 54 String left = null; … … 67 70 logger.debug("left='{}' keyword='{}', right='{}'", 68 71 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); 70 94 } 71 95 -
SRUClient/trunk/src/test/java/eu/clarin/sru/client/TestClient.java
r2936 r5743 20 20 import org.slf4j.LoggerFactory; 21 21 22 import eu.clarin.sru.client.fcs.ClarinFCS RecordParser;22 import eu.clarin.sru.client.fcs.ClarinFCSClientBuilder; 23 23 24 24 … … 31 31 if (args.length > 0) { 32 32 logger.info("initializing client ..."); 33 SRUClient client = new SRUClient();34 33 35 // register record data parsers 36 client.registerRecordParser(new ClarinFCSRecordParser()); 34 SRUClient client = ClarinFCSClientBuilder.create() 35 .defaults() 36 .unkownDataViewAsString() 37 .enableLegacySupport() 38 .buildClient(); 37 39 38 40 // explain -
SRUClient/trunk/src/test/java/eu/clarin/sru/client/TestSimpleClient.java
r2938 r5743 22 22 import org.slf4j.LoggerFactory; 23 23 24 import eu.clarin.sru.client.fcs.ClarinFCSClientBuilder; 24 25 import eu.clarin.sru.client.fcs.ClarinFCSRecordData; 25 import eu.clarin.sru.client.fcs.ClarinFCSRecordParser;26 26 27 27 … … 33 33 if (args.length > 0) { 34 34 logger.info("initializing client ..."); 35 SRUSimpleClient client = new SRUSimpleClient();36 35 37 // register record data parsers 38 client.registerRecordParser(new ClarinFCSRecordParser()); 36 SRUSimpleClient client = ClarinFCSClientBuilder 37 .create() 38 .defaults() 39 .unkownDataViewAsString() 40 .buildSimpleClient(); 39 41 40 42 /* -
SRUClient/trunk/src/test/java/eu/clarin/sru/client/TestThreadedClient.java
r2936 r5743 23 23 import org.slf4j.LoggerFactory; 24 24 25 import eu.clarin.sru.client.fcs.ClarinFCS RecordParser;25 import eu.clarin.sru.client.fcs.ClarinFCSClientBuilder; 26 26 27 27 @Deprecated … … 33 33 if (args.length > 0) { 34 34 logger.info("initializing client ..."); 35 SRUThreadedClient client = new SRUThreadedClient();36 35 37 // register record data parsers 38 client.registerRecordParser(new ClarinFCSRecordParser()); 36 SRUThreadedClient client = ClarinFCSClientBuilder 37 .create() 38 .defaults() 39 .buildThreadedClient(); 39 40 40 41 try { -
SRUClient/trunk/src/test/java/eu/clarin/sru/client/TestThreadedClientCallback.java
r2936 r5743 22 22 import org.slf4j.LoggerFactory; 23 23 24 import eu.clarin.sru.client.fcs.ClarinFCS RecordParser;24 import eu.clarin.sru.client.fcs.ClarinFCSClientBuilder; 25 25 26 26 … … 32 32 if (args.length > 0) { 33 33 logger.info("initializing client ..."); 34 SRUThreadedClient client = new SRUThreadedClient();35 34 36 // register record data parsers 37 client.registerRecordParser(new ClarinFCSRecordParser()); 35 SRUThreadedClient client = ClarinFCSClientBuilder 36 .create() 37 .defaults() 38 .buildThreadedClient(); 38 39 39 40 try { -
SRUClient/trunk/src/test/java/eu/clarin/sru/client/TestUtils.java
r2997 r5743 30 30 import eu.clarin.sru.client.fcs.DataViewGenericDOM; 31 31 import eu.clarin.sru.client.fcs.DataViewGenericString; 32 import eu.clarin.sru.client.fcs.DataView KWIC;32 import eu.clarin.sru.client.fcs.DataViewHits; 33 33 import eu.clarin.sru.client.fcs.Resource; 34 34 … … 60 60 SRUSearchRetrieveRequest request = new SRUSearchRetrieveRequest(baseURI); 61 61 request.setQuery(query); 62 request.setRecordSchema(ClarinFCSRecordData.RECORD_SCHEMA);62 // request.setRecordSchema(ClarinFCSRecordData.LEGACY_RECORD_SCHEMA); 63 63 request.setMaximumRecords(5); 64 64 request.setRecordPacking(SRURecordPacking.XML); … … 214 214 final DataViewGenericDOM view = (DataViewGenericDOM) dataview; 215 215 final Node root = view.getDocument().getFirstChild(); 216 logger.info("{}DataView : root element <{}> / {}",216 logger.info("{}DataView (generic dom): root element <{}> / {}", 217 217 s, root.getNodeName(), 218 218 root.getOwnerDocument().hashCode()); 219 219 } 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(); 228 248 } 229 249
Note: See TracChangeset
for help on using the changeset viewer.