com.att.nsa.mr.client.impl.MRBaseClient.java Source code

Java tutorial

Introduction

Here is the source code for com.att.nsa.mr.client.impl.MRBaseClient.java

Source

/*******************************************************************************
 * BSD License
 *  
 * Copyright (c) 2016, AT&T Intellectual Property.  All other rights reserved.
 *  
 * Redistribution and use in source and binary forms, with or without modification, are permitted
 * provided that the following conditions are met:
 *  
 * 1. Redistributions of source code must retain the above copyright notice, this list of conditions
 *    and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
 *    conditions and the following disclaimer in the documentation and/or other materials provided
 *    with the distribution.
 * 3. All advertising materials mentioning features or use of this software must display the
 *    following acknowledgement:  This product includes software developed by the AT&T.
 * 4. Neither the name of AT&T nor the names of its contributors may be used to endorse or
 *    promote products derived from this software without specific prior written permission.
 *  
 * THIS SOFTWARE IS PROVIDED BY AT&T INTELLECTUAL PROPERTY ''AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
 * SHALL AT&T INTELLECTUAL PROPERTY BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *******************************************************************************/
package com.att.nsa.mr.client.impl;

import java.net.MalformedURLException;
import java.util.Collection;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.TimeUnit;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;

import org.apache.http.HttpException;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
import org.glassfish.jersey.internal.util.Base64;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.att.nsa.apiClient.http.CacheUse;
import com.att.nsa.apiClient.http.HttpClient;
import com.att.nsa.mr.client.MRClient;
import com.att.nsa.mr.client.MRClientFactory;
import com.att.nsa.mr.test.clients.ProtocolTypeConstants;
//import com.fasterxml.jackson.core.JsonProcessingException;

public class MRBaseClient extends HttpClient implements MRClient {

    private static final String MR_AUTH_CONSTANT = "X-CambriaAuth";
    private static final String MR_DATE_CONSTANT = "X-CambriaDate";

    protected MRBaseClient(Collection<String> hosts) throws MalformedURLException {
        super(ConnectionType.HTTP, hosts, MRConstants.kStdMRServicePort);
    }

    protected MRBaseClient(Collection<String> hosts, int stdSvcPort) throws MalformedURLException {
        super(ConnectionType.HTTP, hosts, stdSvcPort);

        fLog = LoggerFactory.getLogger(this.getClass().getName());
    }

    protected MRBaseClient(Collection<String> hosts, String clientSignature) throws MalformedURLException {
        super(ConnectionType.HTTP, hosts, MRConstants.kStdMRServicePort, clientSignature, CacheUse.NONE, 1, 1L,
                TimeUnit.MILLISECONDS, 32, 32, 600000);

        fLog = LoggerFactory.getLogger(this.getClass().getName());
    }

    @Override
    public void close() {
    }

    protected Set<String> jsonArrayToSet(JSONArray a) {
        if (a == null)
            return null;

        final TreeSet<String> set = new TreeSet<String>();
        for (int i = 0; i < a.length(); i++) {
            set.add(a.getString(i));
        }
        return set;
    }

    public void logTo(Logger log) {
        fLog = log;
        replaceLogger(log);
    }

    protected Logger getLog() {
        return fLog;
    }

    private Logger fLog;

    public JSONObject post(final String path, final byte[] data, final String contentType, final String username,
            final String password, final String protocolFlag) throws HttpException, JSONException {
        if ((null != username && null != password)) {
            WebTarget target = null;

            Response response = null;

            target = getTarget(path, username, password);
            String encoding = Base64.encodeAsString(username + ":" + password);

            response = target.request().header("Authorization", "Basic " + encoding)
                    .post(Entity.entity(data, contentType));

            return getResponseDataInJson(response);
        } else {
            throw new HttpException(
                    "Authentication Failed: Username/password/AuthKey/AuthDate parameter(s) cannot be null or empty.");
        }
    }

    public String postWithResponse(final String path, final byte[] data, final String contentType,
            final String username, final String password, final String protocolFlag)
            throws HttpException, JSONException {
        String responseData = null;
        if ((null != username && null != password)) {
            WebTarget target = null;

            Response response = null;

            target = getTarget(path, username, password);
            String encoding = Base64.encodeAsString(username + ":" + password);

            response = target.request().header("Authorization", "Basic " + encoding)
                    .post(Entity.entity(data, contentType));

            responseData = response.readEntity(String.class);
            return responseData;
        } else {
            throw new HttpException(
                    "Authentication Failed: Username/password/AuthKey/AuthDate parameter(s) cannot be null or empty.");
        }
    }

    public JSONObject postAuth(final String path, final byte[] data, final String contentType, final String authKey,
            final String authDate, final String username, final String password, final String protocolFlag)
            throws HttpException, JSONException {
        if ((null != username && null != password)) {
            WebTarget target = null;

            Response response = null;
            target = getTarget(path, username, password);
            response = target.request().header(MR_AUTH_CONSTANT, authKey).header(MR_DATE_CONSTANT, authDate)
                    .post(Entity.entity(data, contentType));

            return getResponseDataInJson(response);
        } else {
            throw new HttpException(
                    "Authentication Failed: Username/password/AuthKey/AuthDate parameter(s) cannot be null or empty.");
        }
    }

    public String postAuthwithResponse(final String path, final byte[] data, final String contentType,
            final String authKey, final String authDate, final String username, final String password,
            final String protocolFlag) throws HttpException, JSONException {
        String responseData = null;
        if ((null != username && null != password)) {
            WebTarget target = null;

            Response response = null;
            target = getTarget(path, username, password);
            response = target.request().header(MR_AUTH_CONSTANT, authKey).header(MR_DATE_CONSTANT, authDate)
                    .post(Entity.entity(data, contentType));
            responseData = response.readEntity(String.class);
            return responseData;

        } else {
            throw new HttpException(
                    "Authentication Failed: Username/password/AuthKey/AuthDate parameter(s) cannot be null or empty.");
        }
    }

    public JSONObject get(final String path, final String username, final String password,
            final String protocolFlag) throws HttpException, JSONException {
        if (null != username && null != password) {

            WebTarget target = null;

            Response response = null;
            if (ProtocolTypeConstants.AUTH_KEY.getValue().equalsIgnoreCase(protocolFlag)) {
                target = getTarget(path);
                response = target.request().header(MR_AUTH_CONSTANT, username).header(MR_DATE_CONSTANT, password)
                        .get();
            } else {
                target = getTarget(path, username, password);
                String encoding = Base64.encodeAsString(username + ":" + password);

                response = target.request().header("Authorization", "Basic " + encoding).get();

            }
            return getResponseDataInJson(response);
        } else {
            throw new HttpException(
                    "Authentication Failed: Username/password/AuthKey/Authdate parameter(s) cannot be null or empty.");
        }
    }

    public String getResponse(final String path, final String username, final String password,
            final String protocolFlag) throws HttpException, JSONException {
        String responseData = null;
        if (null != username && null != password) {

            WebTarget target = null;

            Response response = null;
            if (ProtocolTypeConstants.AUTH_KEY.getValue().equalsIgnoreCase(protocolFlag)) {
                target = getTarget(path);
                response = target.request().header(MR_AUTH_CONSTANT, username).header(MR_DATE_CONSTANT, password)
                        .get();
            } else {
                target = getTarget(path, username, password);
                String encoding = Base64.encodeAsString(username + ":" + password);
                response = target.request().header("Authorization", "Basic " + encoding).get();
            }
            MRClientFactory.HTTPHeadersMap = response.getHeaders();

            String transactionid = response.getHeaderString("transactionid");
            if (transactionid != null && !transactionid.equalsIgnoreCase("")) {
                fLog.info("TransactionId : " + transactionid);
            }

            responseData = response.readEntity(String.class);
            return responseData;
        } else {
            throw new HttpException(
                    "Authentication Failed: Username/password/AuthKey/Authdate parameter(s) cannot be null or empty.");
        }
    }

    public JSONObject getAuth(final String path, final String authKey, final String authDate, final String username,
            final String password, final String protocolFlag) throws HttpException, JSONException {
        if (null != username && null != password) {

            WebTarget target = null;

            Response response = null;
            target = getTarget(path, username, password);
            response = target.request().header(MR_AUTH_CONSTANT, authKey).header(MR_DATE_CONSTANT, authDate).get();

            return getResponseDataInJson(response);
        } else {
            throw new HttpException(
                    "Authentication Failed: Username/password/AuthKey/Authdate parameter(s) cannot be null or empty.");
        }
    }

    public String getAuthResponse(final String path, final String authKey, final String authDate,
            final String username, final String password, final String protocolFlag)
            throws HttpException, JSONException {
        String responseData = null;
        if (null != username && null != password) {

            WebTarget target = null;

            Response response = null;
            target = getTarget(path, username, password);
            response = target.request().header(MR_AUTH_CONSTANT, authKey).header(MR_DATE_CONSTANT, authDate).get();

            MRClientFactory.HTTPHeadersMap = response.getHeaders();

            String transactionid = response.getHeaderString("transactionid");
            if (transactionid != null && !transactionid.equalsIgnoreCase("")) {
                fLog.info("TransactionId : " + transactionid);
            }

            responseData = response.readEntity(String.class);
            return responseData;
        } else {
            throw new HttpException(
                    "Authentication Failed: Username/password/AuthKey/Authdate parameter(s) cannot be null or empty.");
        }
    }

    private WebTarget getTarget(final String path, final String username, final String password) {

        Client client = ClientBuilder.newClient();

        // Using UNIVERSAL as it supports both BASIC and DIGEST authentication types.
        HttpAuthenticationFeature feature = HttpAuthenticationFeature.universal(username, password);
        client.register(feature);

        return client.target(path);
    }

    private WebTarget getTarget(final String path) {

        Client client = ClientBuilder.newClient();
        return client.target(path);
    }

    private JSONObject getResponseDataInJson(Response response) throws JSONException {
        try {
            MRClientFactory.HTTPHeadersMap = response.getHeaders();
            //   fLog.info("DMAAP response status: " + response.getStatus());

            //MultivaluedMap<String, Object> headersMap = response.getHeaders();
            //for(String key : headersMap.keySet()) {
            String transactionid = response.getHeaderString("transactionid");
            if (transactionid != null && !transactionid.equalsIgnoreCase("")) {
                fLog.info("TransactionId : " + transactionid);
            }

            /*final String responseData = response.readEntity(String.class);
            JSONTokener jsonTokener = new JSONTokener(responseData);
            JSONObject jsonObject = null;
            final char firstChar = jsonTokener.next();
            jsonTokener.back();
            if ('[' == firstChar) {
               JSONArray jsonArray = new JSONArray(jsonTokener);
               jsonObject = new JSONObject();
               jsonObject.put("result", jsonArray);
            } else {
               jsonObject = new JSONObject(jsonTokener);
            }
                
            return jsonObject;*/

            if (response.getStatus() == 403) {
                JSONObject jsonObject = null;
                jsonObject = new JSONObject();
                JSONArray jsonArray = new JSONArray();
                jsonArray.put(response.getEntity());
                jsonObject.put("result", jsonArray);
                jsonObject.put("status", response.getStatus());
                return jsonObject;
            }
            String responseData = response.readEntity(String.class);

            JSONTokener jsonTokener = new JSONTokener(responseData);
            JSONObject jsonObject = null;
            final char firstChar = jsonTokener.next();
            jsonTokener.back();
            if ('[' == firstChar) {
                JSONArray jsonArray = new JSONArray(jsonTokener);
                jsonObject = new JSONObject();
                jsonObject.put("result", jsonArray);
                jsonObject.put("status", response.getStatus());
            } else {
                jsonObject = new JSONObject(jsonTokener);
                jsonObject.put("status", response.getStatus());
            }

            return jsonObject;
        } catch (JSONException excp) {
            fLog.error("DMAAP - Error reading response data.", excp);
            return null;
        }

    }

    public String getHTTPErrorResponseMessage(String responseString) {

        String response = null;
        int beginIndex = 0;
        int endIndex = 0;
        if (responseString.contains("<body>")) {

            beginIndex = responseString.indexOf("body>") + 5;
            endIndex = responseString.indexOf("</body");
            response = responseString.substring(beginIndex, endIndex);
        }

        return response;

    }

    public String getHTTPErrorResponseCode(String responseString) {

        String response = null;
        int beginIndex = 0;
        int endIndex = 0;
        if (responseString.contains("<title>")) {
            beginIndex = responseString.indexOf("title>") + 6;
            endIndex = responseString.indexOf("</title");
            response = responseString.substring(beginIndex, endIndex);
        }

        return response;
    }

}