org.finra.herd.tools.uploader.UploaderWebClient.java Source code

Java tutorial

Introduction

Here is the source code for org.finra.herd.tools.uploader.UploaderWebClient.java

Source

/*
* Copyright 2015 herd contributors
*
* 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.
*/
package org.finra.herd.tools.uploader;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Arrays;

import javax.xml.bind.JAXBException;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import org.finra.herd.dao.helper.JsonHelper;
import org.finra.herd.model.api.xml.BusinessObjectDataKey;
import org.finra.herd.model.api.xml.BusinessObjectDataUploadCredential;
import org.finra.herd.model.api.xml.BusinessObjectDataVersions;
import org.finra.herd.model.dto.DataBridgeBaseManifestDto;
import org.finra.herd.tools.common.databridge.DataBridgeWebClient;

/**
 * This class encapsulates web client functionality required to communicate with the registration server.
 */
@Component
public class UploaderWebClient extends DataBridgeWebClient {
    private static final Logger LOGGER = LoggerFactory.getLogger(UploaderWebClient.class);

    @Autowired
    private JsonHelper jsonHelper;

    /**
     * Gets the business object data upload credentials.
     *
     * @param manifest the manifest
     * @param storageName the storage name
     * @param businessObjectDataVersion the version of the business object data
     * @param createNewVersion specifies to provide credentials fof the next business object data version
     *
     * @return {@link BusinessObjectDataUploadCredential}
     * @throws URISyntaxException When error occurs while URI creation
     * @throws IOException When error occurs communicating with server
     * @throws JAXBException When error occurs parsing the XML
     */
    public BusinessObjectDataUploadCredential getBusinessObjectDataUploadCredential(
            DataBridgeBaseManifestDto manifest, String storageName, Integer businessObjectDataVersion,
            Boolean createNewVersion) throws URISyntaxException, IOException, JAXBException {
        URIBuilder uriBuilder = new URIBuilder().setScheme(getUriScheme())
                .setHost(regServerAccessParamsDto.getRegServerHost())
                .setPort(regServerAccessParamsDto.getRegServerPort())
                .setPath(String.join("/", HERD_APP_REST_URI_PREFIX, "businessObjectData", "upload", "credential",
                        "namespaces", manifest.getNamespace(), "businessObjectDefinitionNames",
                        manifest.getBusinessObjectDefinitionName(), "businessObjectFormatUsages",
                        manifest.getBusinessObjectFormatUsage(), "businessObjectFormatFileTypes",
                        manifest.getBusinessObjectFormatFileType(), "businessObjectFormatVersions",
                        manifest.getBusinessObjectFormatVersion(), "partitionValues", manifest.getPartitionValue()))
                .setParameter("storageName", storageName);
        if (manifest.getSubPartitionValues() != null) {
            uriBuilder.setParameter("subPartitionValues",
                    herdStringHelper.join(manifest.getSubPartitionValues(), "|", "\\"));
        }
        if (businessObjectDataVersion != null) {
            uriBuilder.setParameter("businessObjectDataVersion", businessObjectDataVersion.toString());
        }
        if (createNewVersion != null) {
            uriBuilder.setParameter("createNewVersion", createNewVersion.toString());
        }
        HttpGet httpGet = new HttpGet(uriBuilder.build());
        httpGet.addHeader("Accepts", DEFAULT_ACCEPT);
        if (regServerAccessParamsDto.isUseSsl()) {
            httpGet.addHeader(getAuthorizationHeader());
        }
        try (CloseableHttpClient httpClient = httpClientOperations.createHttpClient()) {
            LOGGER.info("Retrieving upload credentials from registration server...");
            return getBusinessObjectDataUploadCredential(httpClientOperations.execute(httpClient, httpGet));
        }
    }

    /**
     * Retrieves all versions for the specified business object data key.
     *
     * @param businessObjectDataKey the business object data key
     *
     * @return {@link org.finra.herd.model.api.xml.BusinessObjectDataVersions}
     * @throws URISyntaxException When error occurs while URI creation
     * @throws IOException When error occurs communicating with server
     * @throws JAXBException When error occurs parsing the XML
     */
    public BusinessObjectDataVersions getBusinessObjectDataVersions(BusinessObjectDataKey businessObjectDataKey)
            throws URISyntaxException, IOException, JAXBException {
        LOGGER.info("Retrieving business object data versions from the registration server...");

        BusinessObjectDataVersions businessObjectDataVersions;
        try (CloseableHttpClient client = httpClientOperations.createHttpClient()) {
            StringBuilder uriPathBuilder = new StringBuilder(300);
            uriPathBuilder.append(HERD_APP_REST_URI_PREFIX);
            uriPathBuilder.append("/businessObjectData/namespaces/").append(businessObjectDataKey.getNamespace());
            uriPathBuilder.append("/businessObjectDefinitionNames/")
                    .append(businessObjectDataKey.getBusinessObjectDefinitionName());
            uriPathBuilder.append("/businessObjectFormatUsages/")
                    .append(businessObjectDataKey.getBusinessObjectFormatUsage());
            uriPathBuilder.append("/businessObjectFormatFileTypes/")
                    .append(businessObjectDataKey.getBusinessObjectFormatFileType());
            uriPathBuilder.append("/versions");

            URIBuilder uriBuilder = new URIBuilder().setScheme(getUriScheme())
                    .setHost(regServerAccessParamsDto.getRegServerHost())
                    .setPort(regServerAccessParamsDto.getRegServerPort()).setPath(uriPathBuilder.toString())
                    .setParameter("partitionValue", businessObjectDataKey.getPartitionValue());

            if (businessObjectDataKey.getSubPartitionValues() != null) {
                uriBuilder.setParameter("subPartitionValues",
                        herdStringHelper.join(businessObjectDataKey.getSubPartitionValues(), "|", "\\"));
            }

            if (businessObjectDataKey.getBusinessObjectFormatVersion() != null) {
                uriBuilder.setParameter("businessObjectFormatVersion",
                        businessObjectDataKey.getBusinessObjectFormatVersion().toString());
            }

            if (businessObjectDataKey.getBusinessObjectDataVersion() != null) {
                uriBuilder.setParameter("businessObjectDataVersion",
                        businessObjectDataKey.getBusinessObjectDataVersion().toString());
            }

            HttpGet httpGet = new HttpGet(uriBuilder.build());
            httpGet.addHeader("Accepts", DEFAULT_ACCEPT);

            // If SSL is enabled, set the client authentication header.
            if (regServerAccessParamsDto.isUseSsl()) {
                httpGet.addHeader(getAuthorizationHeader());
            }

            LOGGER.info(String.format("    HTTP GET URI: %s", httpGet.getURI().toString()));
            LOGGER.info(String.format("    HTTP GET Headers: %s", Arrays.toString(httpGet.getAllHeaders())));

            businessObjectDataVersions = getBusinessObjectDataVersions(
                    httpClientOperations.execute(client, httpGet));
        }

        LOGGER.info(String.format(
                "Successfully retrieved %d already registered version(s) for the business object data. businessObjectDataKey=%s",
                businessObjectDataVersions.getBusinessObjectDataVersions().size(),
                jsonHelper.objectToJson(businessObjectDataKey)));

        return businessObjectDataVersions;
    }

    /**
     * Updates the business object data status. This method does not fail in case business object data status update is unsuccessful, but simply logs the
     * exception information as a warning.
     *
     * @param businessObjectDataKey the business object data key
     * @param businessObjectDataStatus the status of the business object data
     */
    public void updateBusinessObjectDataStatusIgnoreException(BusinessObjectDataKey businessObjectDataKey,
            String businessObjectDataStatus) {
        try {
            updateBusinessObjectDataStatus(businessObjectDataKey, businessObjectDataStatus);
        } catch (Exception e) {
            LOGGER.warn(e.getMessage(), e);
        }
    }

    /**
     * Extracts BusinessObjectDataVersions object from the registration server HTTP response.
     *
     * @param httpResponse the response received from the supported options.
     *
     * @return the BusinessObjectDataVersions object extracted from the registration server response.
     */
    protected BusinessObjectDataVersions getBusinessObjectDataVersions(CloseableHttpResponse httpResponse) {
        return (BusinessObjectDataVersions) processXmlHttpResponse(httpResponse,
                "retrieve business object data versions from the registration server",
                BusinessObjectDataVersions.class);
    }

    /**
     * Gets the business object data upload credentials.
     *
     * @param response the HTTP response
     *
     * @return {@link BusinessObjectDataUploadCredential}
     */
    private BusinessObjectDataUploadCredential getBusinessObjectDataUploadCredential(
            CloseableHttpResponse response) {
        return (BusinessObjectDataUploadCredential) processXmlHttpResponse(response,
                "get business object data upload credential", BusinessObjectDataUploadCredential.class);
    }
}