Changeset 5797 for SRUClient


Ignore:
Timestamp:
11/12/14 00:05:24 (10 years ago)
Author:
Oliver Schonefeld
Message:
  • add support for parsing extra response data
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  
    2020import java.util.List;
    2121
    22 import org.w3c.dom.DocumentFragment;
    23 
    2422
    2523
     
    3432    private final T request;
    3533    private final List<SRUDiagnostic> diagnostics;
    36     private final DocumentFragment extraResponseData;
     34    private final List<SRUExtraResponseData> extraResponseData;
    3735    private final int totalBytesTransferred;
    3836    private final long timeTotal;
     
    6866    protected SRUAbstractResponse(T request,
    6967            List<SRUDiagnostic> diagnostics,
    70             DocumentFragment extraResponseData,
     68            List<SRUExtraResponseData> extraResponseData,
    7169            int totalBytesTransferred,
    7270            long timeTotal,
     
    7876                ? Collections.unmodifiableList(diagnostics)
    7977                : null;
    80         this.extraResponseData     = extraResponseData;
     78        this.extraResponseData = ((extraResponseData != null) &&
     79                                                !extraResponseData.isEmpty())
     80                ? Collections.unmodifiableList(extraResponseData)
     81                : null;
    8182        this.totalBytesTransferred = totalBytesTransferred;
    8283        this.timeTotal             = timeTotal;
     
    125126     * Get the extra response data for this result.
    126127     *
    127      * @return get an instance of {@link DocumentFragment} containing the XML
    128      *         fragment for the extra response data from the SRU response or
    129      *         <code>null</code> if none are available
    130      */
    131     public DocumentFragment getExtraResponseData() {
     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() {
    132133        return extraResponseData;
    133134    }
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUClient.java

    r5785 r5797  
    1818
    1919import java.util.ArrayDeque;
     20import java.util.ArrayList;
    2021import java.util.Deque;
    2122import java.util.LinkedList;
     
    2425
    2526import javax.xml.XMLConstants;
     27import javax.xml.namespace.QName;
    2628import javax.xml.parsers.DocumentBuilder;
    2729import javax.xml.parsers.DocumentBuilderFactory;
     
    3133import javax.xml.stream.XMLStreamReader;
    3234
     35import org.slf4j.Logger;
     36import org.slf4j.LoggerFactory;
    3337import org.w3c.dom.Attr;
    3438import org.w3c.dom.DOMException;
     
    4953 */
    5054public class SRUClient {
     55    private static final Logger logger = LoggerFactory.getLogger(SRUClient.class);
    5156    private final SRUSimpleClient client;
    5257    private final Handler handler;
    5358    /* common */
    5459    private List<SRUDiagnostic> diagnostics;
    55     private DocumentFragment extraResponseData;
     60    private List<SRUExtraResponseData> extraResponseData;
    5661    /* scan */
    5762    private List<SRUTerm> terms;
     
    116121        }
    117122        this.client = new SRUSimpleClient(config);
    118         this.handler = new Handler();
     123        this.handler = new Handler(config);
    119124        try {
    120125            synchronized (documentBuilderFactory) {
     
    282287
    283288
     289
    284290    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
    285299        @Override
    286300        public void onDiagnostics(List<SRUDiagnostic> diagnostics)
     
    293307        public void onExtraResponseData(XMLStreamReader reader)
    294308                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
    297361        }
    298362
     
    391455
    392456
     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
    393465    private static DocumentFragment copyStaxToDocumentFragment(
    394466            DocumentBuilder builder, Deque<Node> stack, XMLStreamReader reader)
     
    398470            stack.push(doc.createDocumentFragment());
    399471
    400             while (reader.hasNext()) {
     472            boolean stop = false;
     473            while (!stop && reader.hasNext()) {
    401474                final Node parent = stack.peek();
    402475                switch (reader.getEventType()) {
     
    406479                case XMLStreamConstants.END_ELEMENT:
    407480                    stack.pop();
     481                    if (stack.size() == 1) {
     482                        stop = true;
     483                    }
    408484                    break;
    409485                case XMLStreamConstants.CHARACTERS:
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUClientConfig.java

    r5750 r5797  
    3535    private final int socketTimeout;
    3636    private final int threadCount;
    37     private final List<SRURecordDataParser> parsers;
     37    private final List<SRURecordDataParser> recordParsers;
     38    private final List<SRUExtraResponseDataParser> extraDataParsers;
    3839
    3940
     
    8586     */
    8687    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;
    8899    }
    89100
     
    93104            throw new NullPointerException("builder == null");
    94105        }
    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();
    100112    }
    101113
     
    113125        private int threadCount           =
    114126                Runtime.getRuntime().availableProcessors() * 2;
    115         private List<SRURecordDataParser> parsers =
     127        private List<SRURecordDataParser> recordParsers =
    116128                new ArrayList<SRURecordDataParser>();
     129        private List<SRUExtraResponseDataParser> extraDataParsers = null;
    117130
    118131
     
    250263         */
    251264        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            }
    253281        }
    254282
     
    261289         * @return this {@link Builder} instance
    262290         * @throws IllegalArgumentException
    263          *             if registering the parser fails
     291         *             if registering of the parser fails
     292         * @see SRURecordDataParser
    264293         */
    265294        public Builder addRecordDataParser(SRURecordDataParser parser) {
     
    277306            }
    278307
    279             for (SRURecordDataParser p : parsers) {
     308            for (SRURecordDataParser p : recordParsers) {
    280309                if (p.getRecordSchema().equals(recordSchema)) {
    281310                    throw new IllegalArgumentException(
     
    284313                }
    285314            }
    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);
    287339            return this;
    288340        }
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUExplainResponse.java

    r5750 r5797  
    1919import java.util.List;
    2020
    21 import org.w3c.dom.DocumentFragment;
    22 
    2321
    2422
     
    3331    SRUExplainResponse(SRUExplainRequest request,
    3432            List<SRUDiagnostic> diagnostics,
    35             DocumentFragment extraResponseData,
     33            List<SRUExtraResponseData> extraResponseData,
    3634            int totalBytesTransferred,
    3735            long timeTotal,
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRURecordData.java

    r5750 r5797  
    1818
    1919/**
    20  * Interface for parsed record data.
     20 * Interface for parsed record data objects.
    2121 *
    2222 */
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUScanResponse.java

    r5750 r5797  
    2020import java.util.List;
    2121
    22 import org.w3c.dom.DocumentFragment;
    23 
    2422
    2523
     
    3331    SRUScanResponse(SRUScanRequest request,
    3432            List<SRUDiagnostic> diagnostics,
    35             DocumentFragment extraResponseData,
     33            List<SRUExtraResponseData> extraResponseData,
    3634            int totalBytesTransferred,
    3735            long timeTotal,
  • SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUSearchRetrieveResponse.java

    r5750 r5797  
    2020import java.util.List;
    2121
    22 import org.w3c.dom.DocumentFragment;
    23 
    2422
    2523
     
    3836    SRUSearchRetrieveResponse(SRUSearchRetrieveRequest request,
    3937            List<SRUDiagnostic> diagnostics,
    40             DocumentFragment extraResponseData,
     38            List<SRUExtraResponseData> extraResponseData,
    4139            int totalBytesTransferred,
    4240            long timeTotal,
Note: See TracChangeset for help on using the changeset viewer.