001// --------------------------------------------------------------------------------
002// Copyright 2002-2024 Echo Three, LLC
003//
004// Licensed under the Apache License, Version 2.0 (the "License");
005// you may not use this file except in compliance with the License.
006// You may obtain a copy of the License at
007//
008//     http://www.apache.org/licenses/LICENSE-2.0
009//
010// Unless required by applicable law or agreed to in writing, software
011// distributed under the License is distributed on an "AS IS" BASIS,
012// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013// See the License for the specific language governing permissions and
014// limitations under the License.
015// --------------------------------------------------------------------------------
016
017package com.echothree.model.control.contactlist.server.logic;
018
019import com.echothree.model.control.chain.common.ChainConstants;
020import com.echothree.model.control.chain.server.control.ChainControl;
021import com.echothree.model.control.chain.server.logic.BaseChainLogic;
022import com.echothree.model.data.chain.server.entity.Chain;
023import com.echothree.model.data.chain.server.entity.ChainInstance;
024import com.echothree.model.data.chain.server.entity.ChainType;
025import com.echothree.model.data.contactlist.server.entity.ContactListTypeDetail;
026import com.echothree.model.data.contactlist.server.entity.PartyContactList;
027import com.echothree.model.data.contactlist.server.entity.PartyContactListDetail;
028import com.echothree.model.data.party.server.entity.Party;
029import com.echothree.util.common.persistence.BasePK;
030import com.echothree.util.server.message.ExecutionErrorAccumulator;
031import com.echothree.util.server.persistence.Session;
032
033public class ContactListChainLogic
034        extends BaseChainLogic {
035    
036    private ContactListChainLogic() {
037        super();
038    }
039    
040    private static class ContactListChainLogicHolder {
041        static ContactListChainLogic instance = new ContactListChainLogic();
042    }
043    
044    public static ContactListChainLogic getInstance() {
045        return ContactListChainLogicHolder.instance;
046    }
047    
048    /** In looking for the Chain, the following are checked:
049     * 1) Check for PartyTypeContactList, if exists, use it; skip 2-3.
050     * 2) Check for PartyTypeContactListGroup, if exists, use it; skip 3.
051     * 3) Check for default for the particular type of chain needed.
052     */
053    protected ChainInstance createChainInstance(final ExecutionErrorAccumulator eea, final String chainKindName, final String chainTypeName,
054            final PartyContactList partyContactList, final BasePK createdBy) {
055        PartyContactListDetail partyContactListDetail = partyContactList.getLastDetail();
056        Party party = partyContactListDetail.getParty();
057        ContactListTypeDetail contactListTypeDetail = partyContactListDetail.getContactList().getLastDetail().getContactListType().getLastDetail();
058        Chain chain = null;
059        ChainInstance chainInstance = null;
060        
061        if(chainTypeName.equals(ChainConstants.ChainType_CONFIRMATION_REQUEST)) {
062            chain = contactListTypeDetail.getConfirmationRequestChain();
063        } else if(chainTypeName.equals(ChainConstants.ChainType_SUBSCRIBE)) {
064            chain = contactListTypeDetail.getSubscribeChain();
065        } else if(chainTypeName.equals(ChainConstants.ChainType_UNSUBSCRIBE)) {
066            chain = contactListTypeDetail.getUnsubscribeChain();
067        }
068        
069        if(chain == null) {
070            ChainType chainType = getChainTypeByName(eea, chainKindName, chainTypeName);
071            
072            if(chain != null) {
073                chain = getChain(eea, chainType, party);
074            }
075        }
076        
077        if(chain != null) {
078            chainInstance = createChainInstance(eea, chain, createdBy);
079        }
080        
081        return chainInstance;
082    }
083    
084    protected ChainInstance createContactListChainInstance(final ExecutionErrorAccumulator eea, final String chainTypeName,
085            final PartyContactList partyContactList, final BasePK createdBy) {
086        ChainInstance chainInstance = createChainInstance(eea, ChainConstants.ChainKind_CONTACT_LIST, chainTypeName, partyContactList, createdBy);
087        
088        if(chainInstance != null) {
089            var chainControl = Session.getModelController(ChainControl.class);
090            ChainType chainType = chainInstance.getLastDetail().getChain().getLastDetail().getChainType();
091            
092            chainControl.createChainInstanceEntityRole(chainInstance, chainControl.getChainEntityRoleTypeByName(chainType,
093                    ChainConstants.ChainEntityRoleType_PARTY_CONTACT_LIST), partyContactList.getPrimaryKey(), createdBy);
094        }
095        
096        return chainInstance;
097    }
098    
099    public ChainInstance createContactListConfirmationChainInstance(final ExecutionErrorAccumulator eea, final Party party, final PartyContactList partyContactList,
100            final BasePK createdBy) {
101        return createContactListChainInstance(eea, ChainConstants.ChainType_CONFIRMATION_REQUEST, partyContactList, createdBy);
102    }
103    
104    public ChainInstance createContactListSubscribeChainInstance(final ExecutionErrorAccumulator eea, final Party party, final PartyContactList partyContactList,
105            final BasePK createdBy) {
106        return createContactListChainInstance(eea, ChainConstants.ChainType_SUBSCRIBE, partyContactList, createdBy);
107    }
108    
109    public ChainInstance createContactListUnsubscribeChainInstance(final ExecutionErrorAccumulator eea, final Party party, final PartyContactList partyContactList,
110            final BasePK createdBy) {
111        return createContactListChainInstance(eea, ChainConstants.ChainType_UNSUBSCRIBE, partyContactList, createdBy);
112    }
113    
114}