com.sandata.lab.wcf.lookup.impl.RestLookupTablesService.java Source code

Java tutorial

Introduction

Here is the source code for com.sandata.lab.wcf.lookup.impl.RestLookupTablesService.java

Source

/*
 * Copyright (c) 2015. Sandata Technologies, LLC
 * 26 Harbor Park Drive, Port Washington, NY 11050, 800-544-7263
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of Sandata Technologies, LLC
 * ("Confidential Information"). You shall not disclose such Confidential Information and shall
 * use it only in accordance with the terms of the license agreement you entered into with
 * Sandata.
 */

package com.sandata.lab.wcf.lookup.impl;

import com.sandata.lab.common.utils.data.provider.GSONProvider;
import com.sandata.lab.common.utils.http.HttpDataService;
import com.sandata.lab.common.utils.log.SandataLogger;
import com.sandata.lab.common.utils.time.TimeFormat;
import com.sandata.lab.data.model.wcf.lookup.*;
import com.sandata.lab.wcf.lookup.api.LookupTablesService;
import com.sandata.lab.wcf.lookup.utils.log.WcfLookupTablesLogger;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.PropertyInject;
import org.apache.cxf.message.MessageContentsList;
import org.joda.time.DateTimeZone;
import org.joda.time.Duration;
import org.joda.time.LocalDateTime;

import java.util.HashMap;
import java.util.List;

/**
 * REST implementation of the LookupTablesService interface.
 * <p/>
 *
 * @author David Rutgos
 */
public class RestLookupTablesService implements LookupTablesService {

    private final HashMap<String, List> lookupTableCache = new HashMap<>();
    private LocalDateTime lastCacheUpdateTime = null;

    @PropertyInject("cache.update.interval")
    private long updateCacheInterval; // In minutes

    @PropertyInject("lookup.tables.url")
    private String url;

    // TODO: Common service to get authorizations
    private final String auth = "1234567890-FAKE";

    @Override
    public void getReligions(Exchange exchange) {

        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getReligions(exchange)");
        logger.start();

        exchange.getIn().setBody(getReligions(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfReligion> getReligions(boolean updateCache) {

        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getReligions()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetReligions", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getStaffTypes(Exchange exchange) {

        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getStaffTypes(exchange)");
        logger.start();

        exchange.getIn().setBody(getStaffTypes(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfStaffType> getStaffTypes(boolean updateCache) {

        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getStaffTypes()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetStaffTypes", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getEthnicities(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getEthnicities(exchange)");
        logger.start();

        exchange.getIn().setBody(getEthnicities(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfEthnicity> getEthnicities(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getEthnicities()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetEthnicities", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getMaritalStatuses(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getMaritalStatuses(exchange)");
        logger.start();

        exchange.getIn().setBody(getMaritalStatuses(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfMaritalStatus> getMaritalStatuses(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getMaritalStatuses()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetMaritalStatuses", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getGenders(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getGenders(exchange)");
        logger.start();

        exchange.getIn().setBody(getGenders(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfGender> getGenders(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getGenders()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetGenders", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getMedClassifications(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getMedClassifications(exchange)");
        logger.start();

        exchange.getIn().setBody(getMedClassifications(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfMedicationClassification> getMedClassifications(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getMedClassifications()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetMedicationClassifications", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getMedStrengths(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getMedStrengths(exchange)");
        logger.start();

        exchange.getIn().setBody(getMedStrengths(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfMedicationStrength> getMedStrengths(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getMedStrengths()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetMedicationStrengths", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getMedRoutes(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getMedRoutes(exchange)");
        logger.start();

        exchange.getIn().setBody(getMedRoutes(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfMedicationRoute> getMedRoutes(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getMedRoutes()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetMedicationRoutes", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getStates(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getStates(exchange)");
        logger.start();

        exchange.getIn().setBody(getStates(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfState> getStates(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getStates()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetStates", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getLanguages(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getLanguages(exchange)");
        logger.start();

        exchange.getIn().setBody(getLanguages(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfLanguage> getLanguages(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getLanguages()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetLanguages", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getServices(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getServices(exchange)");
        logger.start();

        exchange.getIn().setBody(getServices(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfService> getServices(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getServices()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetServices", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getDisasterLevels(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getDisasterLevels(exchange)");
        logger.start();

        exchange.getIn().setBody(getDisasterLevels(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfDisasterLevel> getDisasterLevels(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getDisasterLevels()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetDisasterLevels", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getDnrs(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getDnrs(exchange)");
        logger.start();

        exchange.getIn().setBody(getDnrs(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfDnr> getDnrs(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getDnrs()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetDNRs", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getRefFormats(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getRefFormats(exchange)");
        logger.start();

        exchange.getIn().setBody(getRefFormats(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfReferenceFormat> getRefFormats(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getRefFormats()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetReferenceFormats", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getLimitBys(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getLimitBys(exchange)");
        logger.start();

        exchange.getIn().setBody(getLimitBys(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfLimitBy> getLimitBys(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getLimitBys()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetLimitBys", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getEligibilities(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getEligibilities(exchange)");
        logger.start();

        exchange.getIn().setBody(getEligibilities(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfEligibility> getEligibilities(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getEligibilities()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetEligibilities", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getAgencies(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getAgencies(exchange)");
        logger.start();

        exchange.getIn().setBody(getAgencies(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfAgency> getAgencies(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getAgencies()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetAgencies", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getAdminTypes(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getAdminTypes(exchange)");
        logger.start();

        exchange.getIn().setBody(getAdminTypes(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfAdmissionType> getAdminTypes(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getAdminTypes()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetAdmissionTypes", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getPayTypes(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getPayTypes(exchange)");
        logger.start();

        exchange.getIn().setBody(getPayTypes(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfPayType> getPayTypes(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getPayTypes()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetPayTypes", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getStaffClasses(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getStaffClasses(exchange)");
        logger.start();

        exchange.getIn().setBody(getStaffClasses(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfStaffClass> getStaffClasses(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getStaffClasses()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetStaffClasses", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getStaffStatuses(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getStaffStatuses(exchange)");
        logger.start();

        exchange.getIn().setBody(getStaffStatuses(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfStaffStatus> getStaffStatuses(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getStaffStatuses()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetStaffStatuses", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getStateTaxes(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getStateTaxes(exchange)");
        logger.start();

        exchange.getIn().setBody(getStateTaxes(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfStateTax> getStateTaxes(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getStateTaxes()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetStateTaxes", updateCache, logger);

        logger.stop();

        return list;
    }

    @Override
    public void getCityTaxes(Exchange exchange) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger(exchange);
        logger.setMethodName("getCityTaxes(exchange)");
        logger.start();

        exchange.getIn().setBody(getCityTaxes(updateCache(exchange, logger)));

        logger.stop();
    }

    @Override
    public List<WcfCityTax> getCityTaxes(boolean updateCache) {
        SandataLogger logger = WcfLookupTablesLogger.CreateLogger();
        logger.setMethodName("getCityTaxes()");

        // If updateCache is false, check to see if the cache still needs to be refreshed based on the time.
        if (!updateCache) {
            updateCache = shouldUpdateCache(logger);
        }

        List list = httpRequest("GetCityTaxes", updateCache, logger);

        logger.stop();

        return list;
    }

    private List httpRequest(final String methodName, final boolean updateCache, final SandataLogger logger) {

        List cachedList = lookupTableCache.get(methodName);

        if (updateCache
                // If list is not cached, then get it from the service
                || cachedList == null) {

            HttpDataService service = new HttpDataService(logger);
            service.addHeader("Authorization", auth);

            String religionsJsonString = service.get(String.format("%s/%s", url, methodName), "application/json");

            List list = (List) GSONProvider.FromJson(religionsJsonString, List.class);

            updateCache(methodName, list);

            logger.info("***** Service *****");

            return list;
        }

        logger.info("***** Cache *****");

        return cachedList;
    }

    private boolean shouldUpdateCache(final SandataLogger logger) {

        if (lastCacheUpdateTime == null) {

            logger.info(String.format("Lookup table cache must be updated: lastCacheUpdateTime == null"));
            return true;
        }

        if (lastCacheUpdateTimeExpired(logger)) {

            logger.info(String.format("Lookup table cache time expired!"));
            return true;
        }

        return false;
    }

    private boolean updateCache(final Exchange exchange, final SandataLogger logger) {

        Message message = exchange.getIn();

        MessageContentsList params = message.getBody(MessageContentsList.class);

        Boolean bUpdateCache = (Boolean) params.get(0);

        logger.info(String.format("Update lookup table cache: Update Cache: %s", bUpdateCache));

        return bUpdateCache;
    }

    private void updateCache(final String key, final List value) {

        lastCacheUpdateTime = new LocalDateTime();
        lookupTableCache.put(key, value);
    }

    private boolean lastCacheUpdateTimeExpired(final SandataLogger logger) {

        boolean bResult = false;
        String method = logger.getMethodName();
        logger.setMethodName("lastCacheUpdateTimeExpired");

        LocalDateTime now = LocalDateTime.now();

        Duration duration = new Duration(lastCacheUpdateTime.toDateTime(DateTimeZone.UTC),
                now.toDateTime(DateTimeZone.UTC));
        long seconds = duration.getStandardSeconds();
        long minutes = duration.getStandardMinutes();

        logger.info(String.format("Last Cache Update: %s", TimeFormat.SecondsToString(seconds)));

        if (minutes >= updateCacheInterval) {
            bResult = true;
        }

        logger.setMethodName(method);
        return bResult;
    }
}