Search in sources :

Example 1 with ResponseReader

use of org.qi4j.library.rest.client.spi.ResponseReader in project qi4j-sdk by Qi4j.

the class RssReaderTest method testReadRssFeed.

@Test
public void testReadRssFeed() {
    Client client = new Client(Protocol.HTTPS);
    Reference ref = new Reference("https://github.com/Qi4j/qi4j-sdk/commits/develop.atom");
    ContextResourceClientFactory contextResourceClientFactory = module.newObject(ContextResourceClientFactory.class, client);
    contextResourceClientFactory.registerResponseReader(new ResponseReader() {

        @Override
        public Object readResponse(Response response, Class<?> resultType) throws ResourceException {
            if (resultType.equals(Document.class)) {
                try {
                    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
                    documentBuilderFactory.setNamespaceAware(false);
                    return documentBuilderFactory.newDocumentBuilder().parse(response.getEntity().getStream());
                } catch (Exception e) {
                    throw new ResourceException(e);
                }
            }
            return null;
        }
    });
    contextResourceClientFactory.setErrorHandler(new ErrorHandler().onError(ErrorHandler.RECOVERABLE_ERROR, new ResponseHandler() {

        @Override
        public HandlerCommand handleResponse(Response response, ContextResourceClient client) {
            System.out.println(">> REFRESH on recoverable error: " + response.getStatus());
            return refresh();
        }
    }));
    crc = contextResourceClientFactory.newClient(ref);
    crc.onResource(new ResultHandler<Document>() {

        Iterator<Node> itemNodes;

        @Override
        public HandlerCommand handleResult(Document result, ContextResourceClient client) {
            try {
                final XPath xPath = XPathFactory.newInstance().newXPath();
                System.out.println("== " + xPath.evaluate("feed/title", result) + " ==");
                final NodeList nodes = (NodeList) xPath.evaluate("feed/entry", result, XPathConstants.NODESET);
                List<Node> items = new ArrayList<Node>();
                for (int i = 0; i < nodes.getLength(); i++) {
                    items.add(nodes.item(i));
                }
                itemNodes = items.iterator();
                return processEntry(xPath);
            } catch (XPathExpressionException e) {
                throw new ResourceException(e);
            }
        }

        private HandlerCommand processEntry(final XPath xPath) throws XPathExpressionException {
            if (!itemNodes.hasNext()) {
                return null;
            }
            Node item = itemNodes.next();
            String title = xPath.evaluate("title", item);
            String detailUrl = xPath.evaluate("link/@href", item);
            System.out.println("-- " + title + " --");
            System.out.println("-- " + detailUrl + " --");
            return processEntry(xPath);
        }
    });
    crc.start();
}
Also used : ContextResourceClientFactory(org.qi4j.library.rest.client.api.ContextResourceClientFactory) DocumentBuilderFactory(javax.xml.parsers.DocumentBuilderFactory) ResponseHandler(org.qi4j.library.rest.client.spi.ResponseHandler) XPathExpressionException(javax.xml.xpath.XPathExpressionException) Node(org.w3c.dom.Node) Document(org.w3c.dom.Document) HandlerCommand(org.qi4j.library.rest.client.api.HandlerCommand) ResourceException(org.restlet.resource.ResourceException) ArrayList(java.util.ArrayList) NodeList(org.w3c.dom.NodeList) List(java.util.List) ContextResourceClient(org.qi4j.library.rest.client.api.ContextResourceClient) Client(org.restlet.Client) ContextResourceClient(org.qi4j.library.rest.client.api.ContextResourceClient) XPath(javax.xml.xpath.XPath) ErrorHandler(org.qi4j.library.rest.client.api.ErrorHandler) Reference(org.restlet.data.Reference) NodeList(org.w3c.dom.NodeList) XPathExpressionException(javax.xml.xpath.XPathExpressionException) ResourceException(org.restlet.resource.ResourceException) AssemblyException(org.qi4j.bootstrap.AssemblyException) Response(org.restlet.Response) ResponseReader(org.qi4j.library.rest.client.spi.ResponseReader) AbstractQi4jTest(org.qi4j.test.AbstractQi4jTest) Test(org.junit.Test)

Example 2 with ResponseReader

use of org.qi4j.library.rest.client.spi.ResponseReader in project qi4j-sdk by Qi4j.

the class ResponseReaderDelegator method initialize.

@Override
public void initialize() throws InitializationException {
    Logger logger = LoggerFactory.getLogger(getClass());
    ResourceBundle defaultResponseReaders = ResourceBundle.getBundle("org.qi4j.library.rest.client.rest-client");
    String responseReaderClasses = defaultResponseReaders.getString("responsereaders");
    logger.info("Using responsereaders:" + responseReaderClasses);
    for (String className : responseReaderClasses.split(",")) {
        try {
            Class readerClass = module.classLoader().loadClass(className.trim());
            ResponseReader reader = (ResponseReader) module.newObject(readerClass);
            registerResponseReader(reader);
        } catch (ClassNotFoundException e) {
            logger.warn("Could not register response reader " + className, e);
        }
    }
}
Also used : ResourceBundle(java.util.ResourceBundle) ResponseReader(org.qi4j.library.rest.client.spi.ResponseReader) Logger(org.slf4j.Logger)

Aggregations

ResponseReader (org.qi4j.library.rest.client.spi.ResponseReader)2 ArrayList (java.util.ArrayList)1 List (java.util.List)1 ResourceBundle (java.util.ResourceBundle)1 DocumentBuilderFactory (javax.xml.parsers.DocumentBuilderFactory)1 XPath (javax.xml.xpath.XPath)1 XPathExpressionException (javax.xml.xpath.XPathExpressionException)1 Test (org.junit.Test)1 AssemblyException (org.qi4j.bootstrap.AssemblyException)1 ContextResourceClient (org.qi4j.library.rest.client.api.ContextResourceClient)1 ContextResourceClientFactory (org.qi4j.library.rest.client.api.ContextResourceClientFactory)1 ErrorHandler (org.qi4j.library.rest.client.api.ErrorHandler)1 HandlerCommand (org.qi4j.library.rest.client.api.HandlerCommand)1 ResponseHandler (org.qi4j.library.rest.client.spi.ResponseHandler)1 AbstractQi4jTest (org.qi4j.test.AbstractQi4jTest)1 Client (org.restlet.Client)1 Response (org.restlet.Response)1 Reference (org.restlet.data.Reference)1 ResourceException (org.restlet.resource.ResourceException)1 Logger (org.slf4j.Logger)1