All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.broadleafcommerce.vendor.usps.service.USPSShippingCalculationServiceImpl Maven / Gradle / Ivy

/*
 * Copyright 2008-2009 the original author or authors.
 *
 * 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.broadleafcommerce.vendor.usps.service;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.xmlbeans.XmlTokenSource;
import org.broadleafcommerce.profile.vendor.service.AbstractVendorService;
import org.broadleafcommerce.profile.vendor.service.exception.ShippingPriceException;
import org.broadleafcommerce.profile.vendor.service.exception.ShippingPriceHostException;
import org.broadleafcommerce.profile.vendor.service.monitor.ServiceStatusDetectable;
import org.broadleafcommerce.profile.vendor.service.type.ServiceStatusType;
import org.broadleafcommerce.vendor.usps.service.message.USPSRequestBuilder;
import org.broadleafcommerce.vendor.usps.service.message.USPSRequestValidator;
import org.broadleafcommerce.vendor.usps.service.message.USPSResponseBuilder;
import org.broadleafcommerce.vendor.usps.service.message.USPSShippingPriceRequest;
import org.broadleafcommerce.vendor.usps.service.message.USPSShippingPriceResponse;

public class USPSShippingCalculationServiceImpl extends AbstractVendorService implements ServiceStatusDetectable, USPSShippingCalculationService {

    private static final Log LOG = LogFactory.getLog(USPSShippingCalculationServiceImpl.class);

    protected String uspsCharSet;
    protected String uspsPassword;
    protected String uspsServerName;
    protected String uspsServiceAPI;
    protected String uspsUserName;
    protected String httpProtocol;
    protected Integer failureReportingThreshold;
    protected Integer failureCount = 0;
    protected Boolean isUp = true;
    protected String uspsShippingAPI;
    protected String rateRequestElement;
    protected USPSRequestValidator uspsRequestValidator;
    protected USPSRequestBuilder uspsRequestBuilder;
    protected USPSResponseBuilder uspsResponseBuilder;

    public USPSShippingPriceResponse retrieveShippingRates(USPSShippingPriceRequest request) throws ShippingPriceException {
        uspsRequestValidator.validateRequest(request);
        USPSShippingPriceResponse shippingPriceResponse = new USPSShippingPriceResponse();
        InputStream response = null;
        try {
            response = callUSPSPricingCalculation(request);
            shippingPriceResponse = uspsResponseBuilder.buildResponse(response, request);
        } catch (Exception e) {
            incrementFailure();
            throw new ShippingPriceException(e);
        } finally {
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                    LOG.error("IOException while closing the InputStream", e);
                }
            }
        }
        clearStatus();
        if (shippingPriceResponse.isErrorDetected()) {
            ShippingPriceHostException e = new ShippingPriceHostException();
            e.setShippingPriceResponse(shippingPriceResponse);
            throw e;
        }
        return shippingPriceResponse;
    }

    protected void clearStatus() {
        synchronized(failureCount) {
            isUp = true;
            failureCount = 0;
        }
    }

    protected void incrementFailure() {
        synchronized(failureCount) {
            if (failureCount >= failureReportingThreshold) {
                isUp = false;
            } else {
                failureCount++;
            }
        }
    }

    protected InputStream callUSPSPricingCalculation(USPSShippingPriceRequest request) throws IOException {
        URL contentURL = new URL(new StringBuffer(httpProtocol).append("://").append(uspsServerName).append(uspsServiceAPI).toString());
        Map content = new HashMap();
        content.put("API", uspsShippingAPI);
        XmlTokenSource doc = uspsRequestBuilder.buildRequest(request, uspsUserName, uspsPassword);
        String text = doc.xmlText();
        if (LOG.isDebugEnabled()) {
            LOG.debug("xml request source: " + text);
        }
        content.put("XML", text);
        return postMessage(content, contentURL, uspsCharSet);
    }

    public ServiceStatusType getServiceStatus() {
        synchronized(failureCount) {
            if (isUp) {
                return ServiceStatusType.UP;
            } else {
                return ServiceStatusType.DOWN;
            }
        }
    }

    public String getUspsCharSet() {
        return uspsCharSet;
    }

    public void setUspsCharSet(String uspsCharSet) {
        this.uspsCharSet = uspsCharSet;
    }

    public String getUspsPassword() {
        return uspsPassword;
    }

    public void setUspsPassword(String uspsPassword) {
        this.uspsPassword = uspsPassword;
    }

    public String getUspsServerName() {
        return uspsServerName;
    }

    public void setUspsServerName(String uspsServerName) {
        this.uspsServerName = uspsServerName;
    }

    public String getUspsServiceAPI() {
        return uspsServiceAPI;
    }

    public void setUspsServiceAPI(String uspsServiceAPI) {
        this.uspsServiceAPI = uspsServiceAPI;
    }

    public String getUspsUserName() {
        return uspsUserName;
    }

    public void setUspsUserName(String uspsUserName) {
        this.uspsUserName = uspsUserName;
    }

    public String getHttpProtocol() {
        return httpProtocol;
    }

    public void setHttpProtocol(String httpProtocol) {
        this.httpProtocol = httpProtocol;
    }

    public Integer getFailureReportingThreshold() {
        return failureReportingThreshold;
    }

    public void setFailureReportingThreshold(Integer failureReportingThreshold) {
        this.failureReportingThreshold = failureReportingThreshold;
    }

    public String getServiceName() {
        return getClass().getName();
    }

    public String getUspsShippingAPI() {
        return uspsShippingAPI;
    }

    public void setUspsShippingAPI(String uspsShippingAPI) {
        this.uspsShippingAPI = uspsShippingAPI;
    }

    public String getRateRequestElement() {
        return rateRequestElement;
    }

    public void setRateRequestElement(String rateRequestElement) {
        this.rateRequestElement = rateRequestElement;
    }

    public USPSRequestValidator getUspsRequestValidator() {
        return uspsRequestValidator;
    }

    public void setUspsRequestValidator(USPSRequestValidator uspsRequestValidator) {
        this.uspsRequestValidator = uspsRequestValidator;
    }

    public USPSRequestBuilder getUspsRequestBuilder() {
        return uspsRequestBuilder;
    }

    public void setUspsRequestBuilder(USPSRequestBuilder uspsRequestBuilder) {
        this.uspsRequestBuilder = uspsRequestBuilder;
    }

    public USPSResponseBuilder getUspsResponseBuilder() {
        return uspsResponseBuilder;
    }

    public void setUspsResponseBuilder(USPSResponseBuilder uspsResponseBuilder) {
        this.uspsResponseBuilder = uspsResponseBuilder;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy