Package com.cloudhopper.sxmp

Source Code of com.cloudhopper.sxmp.SxmpSender

package com.cloudhopper.sxmp;

/*
* #%L
* ch-sxmp
* %%
* Copyright (C) 2012 - 2013 Cloudhopper by Twitter
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;

/**
* Utility class for a simple way of sending a request and returning a response.
*
* @author joelauer
*/
public class SxmpSender {
    private static final Logger logger = LoggerFactory.getLogger(SxmpSender.class);

    static public SubmitResponse submit(String url, SubmitRequest request) throws UnsupportedEncodingException, SxmpErrorException, IOException, SxmpParsingException, SAXException, ParserConfigurationException {
        // send request and get the response
        Response response = send(url, request, true);

        if (response == null) {
            return null;
        }

        if (!(response instanceof SubmitResponse)) {
            throw new SxmpErrorException(SxmpErrorCode.OPTYPE_MISMATCH, "Unexpected response class type parsed");
        }

        return (SubmitResponse)response;
    }

    static public DeliverResponse deliver(String url, DeliverRequest request, boolean shouldParseResponse) throws UnsupportedEncodingException, SxmpErrorException, IOException, SxmpParsingException, SAXException, ParserConfigurationException {
        // send request and get the response
        Response response = send(url, request, shouldParseResponse);

        if (response == null) {
            return null;
        }

        if (!(response instanceof DeliverResponse)) {
            throw new SxmpErrorException(SxmpErrorCode.OPTYPE_MISMATCH, "Unexpected response class type parsed");
        }

        return (DeliverResponse)response;
    }

    static public Response send(String url, Request request, boolean shouldParseResponse) throws UnsupportedEncodingException, SxmpErrorException, IOException, SxmpParsingException, SAXException, ParserConfigurationException {
        // convert request into xml
        String requestXml = SxmpWriter.createString(request);
        String responseXml = null;

        HttpClient client = new DefaultHttpClient();
        client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
        client.getParams().setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.FALSE);

        long start = System.currentTimeMillis();
        long stop = 0;

        logger.debug("Request XML:\n" + requestXml);

        // execute request
        try {
            HttpPost post = new HttpPost(url);
            StringEntity entity = new StringEntity(requestXml);
            // write old or new encoding?
            if (request.getVersion().equals(SxmpParser.VERSION_1_1)) {
                // v1.1 is utf-8
                entity.setContentType("text/xml; charset=\"utf-8\"");
            } else {
                // v1.0 was 8859-1, though that's technically wrong
                // unspecified XML must be encoded in UTF-8
                // maintained this way for backward compatibility
                entity.setContentType("text/xml; charset=\"iso-8859-1\"");
            }
            post.setEntity(entity);

            ResponseHandler<String> responseHandler = new BasicResponseHandler();

            // execute request (will throw exception if fails)
            responseXml = client.execute(post, responseHandler);

            stop = System.currentTimeMillis();
        } finally {
            // clean up all resources
            client.getConnectionManager().shutdown();
        }

        logger.debug("Response XML:\n" + responseXml);
        logger.debug("Response Time: " + (stop - start) + " ms");

        // deliver responses sometimes aren't parseable since its acceptable
        // for delivery responses to merely return "OK" and an HTTP 200 error
        if (!shouldParseResponse) {
            return null;
        } else {
            // convert response xml into an object
            SxmpParser parser = new SxmpParser(SxmpParser.VERSION_1_0);
            // v1.0 data remains in ISO-8859-1, and responses are v1.0
            ByteArrayInputStream bais = new ByteArrayInputStream(responseXml.getBytes("ISO-8859-1"));
            Operation op = parser.parse(bais);

            if (!(op instanceof Response)) {
                throw new SxmpErrorException(SxmpErrorCode.OPTYPE_MISMATCH, "Unexpected response class type parsed");
            }

            return (Response)op;
        }
    }

}
TOP

Related Classes of com.cloudhopper.sxmp.SxmpSender

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.