001/*-
002 * #%L
003 * Smile CDR - CDR
004 * %%
005 * Copyright (C) 2016 - 2026 Smile CDR, Inc.
006 * %%
007 * All rights reserved.
008 * #L%
009 */
010package ca.cdr.api.transactionlog;
011
012import java.util.Collections;
013import java.util.List;
014
015/**
016 * Provides configured settings for the transaction log services. Sources of transaction log events
017 * can use this to determine whether to include specific elements in their transaction log entries
018 * for optimization purposes.
019 */
020public interface ITransactionLogCommonSettings {
021
022        boolean isPersistStorageOutcomeDetails();
023
024        /**
025         * Returns the list of request header names to capture in transaction logs.
026         */
027        default List<String> getRequestHeadersToStore() {
028                return Collections.emptyList();
029        }
030
031        /**
032         * Returns the list of response header names to capture in transaction logs.
033         */
034        default List<String> getResponseHeadersToStore() {
035                return Collections.emptyList();
036        }
037
038        static ITransactionLogCommonSettings composite(List<ITransactionLogCommonSettings> theSettings) {
039                return new CompositeSettings(theSettings);
040        }
041
042        class CompositeSettings implements ITransactionLogCommonSettings {
043
044                private final boolean myPersistStorageOutcomeDetails;
045                private final List<String> myRequestHeadersToStore;
046                private final List<String> myResponseHeadersToStore;
047
048                public CompositeSettings(List<ITransactionLogCommonSettings> theSettingsList) {
049                        boolean persistStorageOutcomeDetails = false;
050                        List<String> requestHeaders = Collections.emptyList();
051                        List<String> responseHeaders = Collections.emptyList();
052                        for (ITransactionLogCommonSettings settings : theSettingsList) {
053                                persistStorageOutcomeDetails |= settings.isPersistStorageOutcomeDetails();
054                                if (requestHeaders.isEmpty()) {
055                                        requestHeaders = settings.getRequestHeadersToStore();
056                                }
057                                if (responseHeaders.isEmpty()) {
058                                        responseHeaders = settings.getResponseHeadersToStore();
059                                }
060                        }
061                        myPersistStorageOutcomeDetails = persistStorageOutcomeDetails;
062                        myRequestHeadersToStore = requestHeaders;
063                        myResponseHeadersToStore = responseHeaders;
064                }
065
066                @Override
067                public boolean isPersistStorageOutcomeDetails() {
068                        return myPersistStorageOutcomeDetails;
069                }
070
071                @Override
072                public List<String> getRequestHeadersToStore() {
073                        return myRequestHeadersToStore;
074                }
075
076                @Override
077                public List<String> getResponseHeadersToStore() {
078                        return myResponseHeadersToStore;
079                }
080        }
081}