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

au.org.consumerdatastandards.client.cli.ReferenceTest Maven / Gradle / Ivy

/*
 * Consumer Data Standards
 * Sample CLI tool to Demonstrate the Consumer Data Right APIs
 *
 * NOTE: This class is auto generated by the codegen artefact
 * https://github.com/ConsumerDataStandardsAustralia/java-artefacts/codegen
 */
package au.org.consumerdatastandards.client.cli;

import au.org.consumerdatastandards.client.ApiClientOptions;
import au.org.consumerdatastandards.client.ApiException;
import au.org.consumerdatastandards.client.JSON;
import au.org.consumerdatastandards.client.model.BankingAccountDetail;
import au.org.consumerdatastandards.client.model.BankingAuthorisedEntity;
import au.org.consumerdatastandards.client.model.BankingBalance;
import au.org.consumerdatastandards.client.model.BankingBalancePurse;
import au.org.consumerdatastandards.client.model.BankingBillerPayee;
import au.org.consumerdatastandards.client.model.BankingCreditCardAccount;
import au.org.consumerdatastandards.client.model.BankingDirectDebit;
import au.org.consumerdatastandards.client.model.BankingDomesticPayee;
import au.org.consumerdatastandards.client.model.BankingDomesticPayeeAccount;
import au.org.consumerdatastandards.client.model.BankingDomesticPayeeCard;
import au.org.consumerdatastandards.client.model.BankingDomesticPayeePayId;
import au.org.consumerdatastandards.client.model.BankingInternationalPayee;
import au.org.consumerdatastandards.client.model.BankingInternationalPayeeBankDetails;
import au.org.consumerdatastandards.client.model.BankingInternationalPayeeBankDetailsBankAddress;
import au.org.consumerdatastandards.client.model.BankingInternationalPayeeBeneficiaryDetails;
import au.org.consumerdatastandards.client.model.BankingLoanAccount;
import au.org.consumerdatastandards.client.model.BankingPayee;
import au.org.consumerdatastandards.client.model.BankingPayeeDetail;
import au.org.consumerdatastandards.client.model.BankingProductAdditionalInformation;
import au.org.consumerdatastandards.client.model.BankingProductBundle;
import au.org.consumerdatastandards.client.model.BankingProductCategory;
import au.org.consumerdatastandards.client.model.BankingProductConstraint;
import au.org.consumerdatastandards.client.model.BankingProductDepositRate;
import au.org.consumerdatastandards.client.model.BankingProductDiscount;
import au.org.consumerdatastandards.client.model.BankingProductDiscountEligibility;
import au.org.consumerdatastandards.client.model.BankingProductEligibility;
import au.org.consumerdatastandards.client.model.BankingProductFeature;
import au.org.consumerdatastandards.client.model.BankingProductFee;
import au.org.consumerdatastandards.client.model.BankingProductLendingRate;
import au.org.consumerdatastandards.client.model.BankingProductRateCondition;
import au.org.consumerdatastandards.client.model.BankingProductRateTierSubTier;
import au.org.consumerdatastandards.client.model.BankingProductRateTierV1;
import au.org.consumerdatastandards.client.model.BankingProductRateTierV3;
import au.org.consumerdatastandards.client.model.BankingProductV1;
import au.org.consumerdatastandards.client.model.BankingProductDetailV1;
import au.org.consumerdatastandards.client.model.BankingProductV2;
import au.org.consumerdatastandards.client.model.BankingProductCardArt;
import au.org.consumerdatastandards.client.model.BankingProductDetailV2;
import au.org.consumerdatastandards.client.model.BankingScheduledPayment;
import au.org.consumerdatastandards.client.model.BankingScheduledPaymentFrom;
import au.org.consumerdatastandards.client.model.BankingScheduledPaymentInterval;
import au.org.consumerdatastandards.client.model.BankingScheduledPaymentRecurrence;
import au.org.consumerdatastandards.client.model.BankingScheduledPaymentRecurrenceEventBased;
import au.org.consumerdatastandards.client.model.BankingScheduledPaymentRecurrenceIntervalSchedule;
import au.org.consumerdatastandards.client.model.BankingScheduledPaymentRecurrenceLastWeekday;
import au.org.consumerdatastandards.client.model.BankingScheduledPaymentRecurrenceOnceOff;
import au.org.consumerdatastandards.client.model.BankingScheduledPaymentSet;
import au.org.consumerdatastandards.client.model.BankingScheduledPaymentTo;
import au.org.consumerdatastandards.client.model.BankingTermDepositAccount;
import au.org.consumerdatastandards.client.model.BankingTransaction;
import au.org.consumerdatastandards.client.model.BankingTransactionDetail;
import au.org.consumerdatastandards.client.model.BankingTransactionDetailExtendedData;
import au.org.consumerdatastandards.client.model.BankingTransactionDetailExtendedDataX2p101Payload;
import au.org.consumerdatastandards.client.model.CommonEmailAddress;
import au.org.consumerdatastandards.client.model.CommonOrganisation;
import au.org.consumerdatastandards.client.model.CommonOrganisationDetail;
import au.org.consumerdatastandards.client.model.CommonPAFAddress;
import au.org.consumerdatastandards.client.model.CommonPerson;
import au.org.consumerdatastandards.client.model.CommonPersonDetail;
import au.org.consumerdatastandards.client.model.CommonPhoneNumber;
import au.org.consumerdatastandards.client.model.CommonPhysicalAddress;
import au.org.consumerdatastandards.client.model.CommonPhysicalAddressWithPurpose;
import au.org.consumerdatastandards.client.model.CommonSimpleAddress;
import au.org.consumerdatastandards.client.model.DiscoveryOutage;
import au.org.consumerdatastandards.client.model.Error;
import au.org.consumerdatastandards.client.model.Links;
import au.org.consumerdatastandards.client.model.LinksPaginated;
import au.org.consumerdatastandards.client.model.ParamAccountOpenStatus;
import au.org.consumerdatastandards.client.model.RequestAccountIds;
import au.org.consumerdatastandards.client.model.RequestAccountIdsData;
import au.org.consumerdatastandards.client.model.ResponseBankingAccountById;
import au.org.consumerdatastandards.client.model.ResponseBankingAccountList;
import au.org.consumerdatastandards.client.model.ResponseBankingAccountListData;
import au.org.consumerdatastandards.client.model.ResponseBankingAccountsBalanceById;
import au.org.consumerdatastandards.client.model.ResponseBankingAccountsBalanceList;
import au.org.consumerdatastandards.client.model.ResponseBankingAccountsBalanceListData;
import au.org.consumerdatastandards.client.model.ResponseBankingDirectDebitAuthorisationList;
import au.org.consumerdatastandards.client.model.ResponseBankingDirectDebitAuthorisationListData;
import au.org.consumerdatastandards.client.model.ResponseBankingPayeeById;
import au.org.consumerdatastandards.client.model.ResponseBankingPayeeList;
import au.org.consumerdatastandards.client.model.ResponseBankingPayeeListData;
import au.org.consumerdatastandards.client.model.ResponseBankingProductById;
import au.org.consumerdatastandards.client.model.ResponseBankingProductList;
import au.org.consumerdatastandards.client.model.ResponseBankingProductListData;
import au.org.consumerdatastandards.client.model.ResponseBankingScheduledPaymentsList;
import au.org.consumerdatastandards.client.model.ResponseBankingScheduledPaymentsListData;
import au.org.consumerdatastandards.client.model.ResponseBankingTransactionById;
import au.org.consumerdatastandards.client.model.ResponseBankingTransactionList;
import au.org.consumerdatastandards.client.model.ResponseBankingTransactionListData;
import au.org.consumerdatastandards.client.model.ResponseCommonCustomer;
import au.org.consumerdatastandards.client.model.ResponseCommonCustomerData;
import au.org.consumerdatastandards.client.model.ResponseCommonCustomerDetail;
import au.org.consumerdatastandards.client.model.ResponseCommonCustomerDetailData;
import au.org.consumerdatastandards.client.model.ResponseCommonDiscoveryStatus;
import au.org.consumerdatastandards.client.model.ResponseCommonDiscoveryStatusData;
import au.org.consumerdatastandards.client.model.ResponseDiscoveryOutagesList;
import au.org.consumerdatastandards.client.model.ResponseDiscoveryOutagesListData;
import com.google.gson.reflect.TypeToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.shell.standard.ShellCommandGroup;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;
import org.springframework.shell.standard.ShellOption;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Type;

@ShellComponent
@ShellCommandGroup("Reference Testing")
public class ReferenceTest extends ApiCliBase {

    private static final Logger LOGGER = LoggerFactory.getLogger(ReferenceTest.class);
    private static final String EXCEPTION_DESERIALISING_FILE = "Exception deserialising file {}: ";
    private final static String MODEL_PACKAGE_PREFIX = "au.org.consumerdatastandards.client.model.";

    private final static Type[] responseModels = {
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken>() {}.getType(),
            new TypeToken>() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken>() {}.getType(),
            new TypeToken>() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken>() {}.getType(),
            new TypeToken>() {}.getType(),
            new TypeToken>() {}.getType(),
            new TypeToken>() {}.getType(),
            new TypeToken>() {}.getType(),
            new TypeToken>() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType(),
            new TypeToken() {}.getType()
    };

    @Autowired
    private ApiClientOptions apiClientOptions;

    @ShellMethod("Retrieve current conformance check status")
    public void payloadValidationStatus() {
        LOGGER.info("Automatic payload validation setting: {}", apiClientOptions.isValidationEnabled());
    }
    
    @ShellMethod("Validate all Payloads Automatically")
    public void autoValidate(@ShellOption(help = "true or false", defaultValue = ShellOption.NULL) String enableValidation) {
        if (enableValidation != null) {
            apiClientOptions.setValidationEnabled(Boolean.parseBoolean(enableValidation));
        }
        payloadValidationStatus();
    }

    @ShellMethod("Validate json payload(s) against CDS")
    public void validatePath(@ShellOption(value = "-f", help = "payload file or folder") String fileOrFolder,
                             @ShellOption(value="-m", help = "model", defaultValue = "") String model) throws ApiException {
        
        File file = new File(fileOrFolder);
        if (!file.exists()) {
            LOGGER.error("Unable to find the specified file for validation: {}", fileOrFolder);
        } else if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files == null || files.length == 0) {
                LOGGER.error("No files found in directory: {}", file.getAbsolutePath());
            } else {
                for (File oneFile : files) {
                    validatePath(oneFile.getAbsolutePath(), model);
                }
            }
        } else {
            JSON json = new JSON(true);

            boolean success = false;
            for (Type type : responseModels) {
                String typeName = type.getTypeName().replaceAll(MODEL_PACKAGE_PREFIX, "");
                LOGGER.trace("Trying model: {}", typeName);
                if (model.isEmpty() || typeName.equals(model)) {
                    try {
                        Object obj = json.deserialize(new FileReader(file), type);
                        success = true;
                        break;
                    } catch (FileNotFoundException e) {
                        LOGGER.error("File not found: {}", file.getAbsolutePath());
                        return;
                    } catch (Exception e) {
                        if (model.isEmpty()) {
                            LOGGER.trace(EXCEPTION_DESERIALISING_FILE, fileOrFolder, e);
                        } else {
                            LOGGER.error(EXCEPTION_DESERIALISING_FILE, fileOrFolder, e);
                            return;
                        }
                    }
                }
            }
            if (!success) {
                throw new ApiException("Could not find a matching model." + (model.isEmpty() ? " Try the -m option." : ""));
            }
            LOGGER.info("Validation of {} successful", file.getAbsolutePath());
        }
    }

    @ShellMethod("List top-level payload models")
    public String listPayloadModels() {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        for (Type topLevelModel : responseModels) {
            pw.println(topLevelModel.getTypeName().replaceAll(MODEL_PACKAGE_PREFIX, ""));
        }
        return sw.toString();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy