- Timestamp:
- 11/12/14 00:05:24 (10 years ago)
- Location:
- SRUClient/trunk/src/main/java/eu/clarin/sru/client
- Files:
-
- 3 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUAbstractResponse.java
r5750 r5797 20 20 import java.util.List; 21 21 22 import org.w3c.dom.DocumentFragment;23 24 22 25 23 … … 34 32 private final T request; 35 33 private final List<SRUDiagnostic> diagnostics; 36 private final DocumentFragmentextraResponseData;34 private final List<SRUExtraResponseData> extraResponseData; 37 35 private final int totalBytesTransferred; 38 36 private final long timeTotal; … … 68 66 protected SRUAbstractResponse(T request, 69 67 List<SRUDiagnostic> diagnostics, 70 DocumentFragmentextraResponseData,68 List<SRUExtraResponseData> extraResponseData, 71 69 int totalBytesTransferred, 72 70 long timeTotal, … … 78 76 ? Collections.unmodifiableList(diagnostics) 79 77 : null; 80 this.extraResponseData = extraResponseData; 78 this.extraResponseData = ((extraResponseData != null) && 79 !extraResponseData.isEmpty()) 80 ? Collections.unmodifiableList(extraResponseData) 81 : null; 81 82 this.totalBytesTransferred = totalBytesTransferred; 82 83 this.timeTotal = timeTotal; … … 125 126 * Get the extra response data for this result. 126 127 * 127 * @return get a n instance of {@link DocumentFragment} containing the XML128 * fragment for the extra response data from the SRU response or129 * <code>null</code> ifnone are available130 */ 131 public DocumentFragmentgetExtraResponseData() {128 * @return get a list of {@link SRUExtraResponseData} instances for the 129 * extra response data from the SRU response or <code>null</code> if 130 * none are available 131 */ 132 public List<SRUExtraResponseData> getExtraResponseData() { 132 133 return extraResponseData; 133 134 } -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUClient.java
r5785 r5797 18 18 19 19 import java.util.ArrayDeque; 20 import java.util.ArrayList; 20 21 import java.util.Deque; 21 22 import java.util.LinkedList; … … 24 25 25 26 import javax.xml.XMLConstants; 27 import javax.xml.namespace.QName; 26 28 import javax.xml.parsers.DocumentBuilder; 27 29 import javax.xml.parsers.DocumentBuilderFactory; … … 31 33 import javax.xml.stream.XMLStreamReader; 32 34 35 import org.slf4j.Logger; 36 import org.slf4j.LoggerFactory; 33 37 import org.w3c.dom.Attr; 34 38 import org.w3c.dom.DOMException; … … 49 53 */ 50 54 public class SRUClient { 55 private static final Logger logger = LoggerFactory.getLogger(SRUClient.class); 51 56 private final SRUSimpleClient client; 52 57 private final Handler handler; 53 58 /* common */ 54 59 private List<SRUDiagnostic> diagnostics; 55 private DocumentFragmentextraResponseData;60 private List<SRUExtraResponseData> extraResponseData; 56 61 /* scan */ 57 62 private List<SRUTerm> terms; … … 116 121 } 117 122 this.client = new SRUSimpleClient(config); 118 this.handler = new Handler( );123 this.handler = new Handler(config); 119 124 try { 120 125 synchronized (documentBuilderFactory) { … … 282 287 283 288 289 284 290 private class Handler extends SRUDefaultHandlerAdapter { 291 private final List<SRUExtraResponseDataParser> parsers; 292 293 294 private Handler(SRUClientConfig config) { 295 this.parsers = config.getExtraResponseDataParsers(); 296 } 297 298 285 299 @Override 286 300 public void onDiagnostics(List<SRUDiagnostic> diagnostics) … … 293 307 public void onExtraResponseData(XMLStreamReader reader) 294 308 throws XMLStreamException, SRUClientException { 295 SRUClient.this.extraResponseData = 296 copyStaxToDocumentFragment(documentBuilder, stack, reader); 309 if (reader.getEventType() == XMLStreamConstants.START_DOCUMENT) { 310 reader.next(); 311 } 312 313 while (reader.hasNext()) { 314 SRUExtraResponseData data = null; 315 316 XmlStreamReaderUtils.consumeWhitespace(reader); 317 switch (reader.getEventType()) { 318 case XMLStreamConstants.START_ELEMENT: 319 final QName root = reader.getName(); 320 logger.debug("@start: {}", root); 321 322 /* 323 * The content model of "extraResponseData" is a sequence 324 * of elements. Parse each child element into a separate 325 * entity, i.e. if a parse is available for handling the 326 * element use it, otherwise parse into a document fragment. 327 */ 328 if ((parsers != null) && !parsers.isEmpty()) { 329 for (SRUExtraResponseDataParser parser: parsers) { 330 if (parser.supports(root)) { 331 logger.debug("parsing extra response data with parser '{}'", 332 parser.getClass().getName()); 333 data = parser.parse(reader); 334 break; 335 } 336 } 337 } 338 if (data == null) { 339 logger.debug("parsing of extra response data (generic)"); 340 data = parseExtraResponseAsDocumentFragment( 341 root, documentBuilder, stack, reader); 342 } 343 break; 344 case XMLStreamConstants.END_DOCUMENT: 345 break; 346 default: 347 throw new SRUClientException("expected a start element at " + 348 "this location (event code = " + 349 reader.getEventType() + ")"); 350 } 351 352 if (data != null) { 353 if (SRUClient.this.extraResponseData == null) { 354 SRUClient.this.extraResponseData = 355 new ArrayList<SRUExtraResponseData>(); 356 } 357 SRUClient.this.extraResponseData.add(data); 358 } 359 } // while 360 297 361 } 298 362 … … 391 455 392 456 457 private static SRUExtraResponseData parseExtraResponseAsDocumentFragment( 458 QName name, DocumentBuilder builder, Deque<Node> stack, XMLStreamReader reader) 459 throws XMLStreamException { 460 return new SRUGenericExtraResponseData(name, 461 copyStaxToDocumentFragment(builder, stack, reader)); 462 } 463 464 393 465 private static DocumentFragment copyStaxToDocumentFragment( 394 466 DocumentBuilder builder, Deque<Node> stack, XMLStreamReader reader) … … 398 470 stack.push(doc.createDocumentFragment()); 399 471 400 while (reader.hasNext()) { 472 boolean stop = false; 473 while (!stop && reader.hasNext()) { 401 474 final Node parent = stack.peek(); 402 475 switch (reader.getEventType()) { … … 406 479 case XMLStreamConstants.END_ELEMENT: 407 480 stack.pop(); 481 if (stack.size() == 1) { 482 stop = true; 483 } 408 484 break; 409 485 case XMLStreamConstants.CHARACTERS: -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUClientConfig.java
r5750 r5797 35 35 private final int socketTimeout; 36 36 private final int threadCount; 37 private final List<SRURecordDataParser> parsers; 37 private final List<SRURecordDataParser> recordParsers; 38 private final List<SRUExtraResponseDataParser> extraDataParsers; 38 39 39 40 … … 85 86 */ 86 87 public List<SRURecordDataParser> getRecordDataParsers() { 87 return parsers; 88 return recordParsers; 89 } 90 91 92 /** 93 * Get the list of extra response data parsers to be used. 94 * 95 * @return the list of extra response data parsers. 96 */ 97 public List<SRUExtraResponseDataParser> getExtraResponseDataParsers() { 98 return extraDataParsers; 88 99 } 89 100 … … 93 104 throw new NullPointerException("builder == null"); 94 105 } 95 this.defaultVersion = builder.getDefaultVersion(); 96 this.connectTimeout = builder.getConnectTimeout(); 97 this.socketTimeout = builder.getSocketTimeout(); 98 this.parsers = builder.getRecordDataParsers(); 99 this.threadCount = builder.getThreadCount(); 106 this.defaultVersion = builder.getDefaultVersion(); 107 this.connectTimeout = builder.getConnectTimeout(); 108 this.socketTimeout = builder.getSocketTimeout(); 109 this.threadCount = builder.getThreadCount(); 110 this.recordParsers = builder.getRecordDataParsers(); 111 this.extraDataParsers = builder.getExtraResponseDataParsers(); 100 112 } 101 113 … … 113 125 private int threadCount = 114 126 Runtime.getRuntime().availableProcessors() * 2; 115 private List<SRURecordDataParser> parsers =127 private List<SRURecordDataParser> recordParsers = 116 128 new ArrayList<SRURecordDataParser>(); 129 private List<SRUExtraResponseDataParser> extraDataParsers = null; 117 130 118 131 … … 250 263 */ 251 264 public List<SRURecordDataParser> getRecordDataParsers() { 252 return Collections.unmodifiableList(parsers); 265 return Collections.unmodifiableList(recordParsers); 266 } 267 268 269 /** 270 * Get the list of extra response data parsers. 271 * 272 * @return the list of extra response data parsers 273 * @see SRUExtraResponseDataParser 274 */ 275 public List<SRUExtraResponseDataParser> getExtraResponseDataParsers() { 276 if (extraDataParsers != null) { 277 return Collections.unmodifiableList(extraDataParsers); 278 } else { 279 return null; 280 } 253 281 } 254 282 … … 261 289 * @return this {@link Builder} instance 262 290 * @throws IllegalArgumentException 263 * if registering the parser fails 291 * if registering of the parser fails 292 * @see SRURecordDataParser 264 293 */ 265 294 public Builder addRecordDataParser(SRURecordDataParser parser) { … … 277 306 } 278 307 279 for (SRURecordDataParser p : parsers) {308 for (SRURecordDataParser p : recordParsers) { 280 309 if (p.getRecordSchema().equals(recordSchema)) { 281 310 throw new IllegalArgumentException( … … 284 313 } 285 314 } 286 parsers.add(parser); 315 recordParsers.add(parser); 316 return this; 317 } 318 319 320 /** 321 * Add an extra response data parser instance to the list of extra 322 * response data parsers 323 * 324 * @param parser 325 * the extra response data parser to be added 326 * @return this {@link Builder} instance 327 * @throws IllegalArgumentException 328 * if registering of the parser fails 329 * @see SRUExtraResponseDataParser 330 */ 331 public Builder addExtraResponseDataParser(SRUExtraResponseDataParser parser) { 332 if (parser == null) { 333 throw new NullPointerException("parser == null"); 334 } 335 if (extraDataParsers == null) { 336 extraDataParsers = new ArrayList<SRUExtraResponseDataParser>(); 337 } 338 extraDataParsers.add(parser); 287 339 return this; 288 340 } -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUExplainResponse.java
r5750 r5797 19 19 import java.util.List; 20 20 21 import org.w3c.dom.DocumentFragment;22 23 21 24 22 … … 33 31 SRUExplainResponse(SRUExplainRequest request, 34 32 List<SRUDiagnostic> diagnostics, 35 DocumentFragmentextraResponseData,33 List<SRUExtraResponseData> extraResponseData, 36 34 int totalBytesTransferred, 37 35 long timeTotal, -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRURecordData.java
r5750 r5797 18 18 19 19 /** 20 * Interface for parsed record data .20 * Interface for parsed record data objects. 21 21 * 22 22 */ -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUScanResponse.java
r5750 r5797 20 20 import java.util.List; 21 21 22 import org.w3c.dom.DocumentFragment;23 24 22 25 23 … … 33 31 SRUScanResponse(SRUScanRequest request, 34 32 List<SRUDiagnostic> diagnostics, 35 DocumentFragmentextraResponseData,33 List<SRUExtraResponseData> extraResponseData, 36 34 int totalBytesTransferred, 37 35 long timeTotal, -
SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUSearchRetrieveResponse.java
r5750 r5797 20 20 import java.util.List; 21 21 22 import org.w3c.dom.DocumentFragment;23 24 22 25 23 … … 38 36 SRUSearchRetrieveResponse(SRUSearchRetrieveRequest request, 39 37 List<SRUDiagnostic> diagnostics, 40 DocumentFragmentextraResponseData,38 List<SRUExtraResponseData> extraResponseData, 41 39 int totalBytesTransferred, 42 40 long timeTotal,
Note: See TracChangeset
for help on using the changeset viewer.