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.chain.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.contactlist.server.ContactListControl; 022import com.echothree.model.control.core.common.ComponentVendors; 023import com.echothree.model.control.core.common.EntityTypes; 024import com.echothree.model.control.core.server.control.CoreControl; 025import com.echothree.model.control.letter.server.control.LetterControl; 026import com.echothree.model.control.party.server.logic.PartyLogic; 027import com.echothree.model.data.chain.server.entity.ChainAction; 028import com.echothree.model.data.chain.server.entity.ChainActionChainActionSet; 029import com.echothree.model.data.chain.server.entity.ChainActionLetter; 030import com.echothree.model.data.chain.server.entity.ChainActionSet; 031import com.echothree.model.data.chain.server.entity.ChainActionSurvey; 032import com.echothree.model.data.chain.server.entity.ChainEntityRoleType; 033import com.echothree.model.data.chain.server.entity.ChainInstance; 034import com.echothree.model.data.chain.server.entity.ChainInstanceEntityRole; 035import com.echothree.model.data.chain.server.entity.ChainInstanceStatus; 036import com.echothree.model.data.chain.server.entity.ChainType; 037import com.echothree.model.data.contactlist.server.entity.ContactList; 038import com.echothree.model.data.contactlist.server.entity.PartyContactList; 039import com.echothree.model.data.core.server.entity.EntityInstance; 040import com.echothree.model.data.core.server.entity.EntityType; 041import com.echothree.model.data.letter.server.entity.Letter; 042import com.echothree.model.data.party.server.entity.Party; 043import com.echothree.util.common.persistence.BasePK; 044import com.echothree.util.server.persistence.Session; 045 046public class ChainInstanceStatusLogic { 047 048 private ChainInstanceStatusLogic() { 049 super(); 050 } 051 052 private static class ChainInstanceStatusLogicHolder { 053 static ChainInstanceStatusLogic instance = new ChainInstanceStatusLogic(); 054 } 055 056 public static ChainInstanceStatusLogic getInstance() { 057 return ChainInstanceStatusLogicHolder.instance; 058 } 059 060 private void processChainActionLetter(final ChainControl chainControl, final ChainInstance chainInstance, final ChainAction chainAction, final BasePK processedBy) { 061 ChainActionLetter chainActionLetter = chainControl.getChainActionLetter(chainAction); 062 Letter letter = chainActionLetter.getLetter(); 063 ContactList contactList = letter.getLastDetail().getContactList(); 064 065 if(contactList != null) { 066 var coreControl = Session.getModelController(CoreControl.class); 067 ChainType chainType = chainInstance.getLastDetail().getChain().getLastDetail().getChainType(); 068 EntityType partyEntityType = coreControl.getEntityTypeByName(coreControl.getComponentVendorByName(ComponentVendors.ECHO_THREE.name()), EntityTypes.Party.name()); 069 070 for(ChainEntityRoleType chainEntityRoleType: chainControl.getChainEntityRoleTypes(chainType)) { 071 if(chainEntityRoleType.getLastDetail().getEntityType().equals(partyEntityType)) { 072 ChainInstanceEntityRole chainInstanceEntityRole = chainControl.getChainInstanceEntityRole(chainInstance, chainEntityRoleType); 073 074 if(chainInstanceEntityRole != null) { 075 var contactListControl = Session.getModelController(ContactListControl.class); 076 EntityInstance entityInstance = chainInstanceEntityRole.getEntityInstance(); 077 Party party = PartyLogic.getInstance().getPartyFromEntityInstance(entityInstance); 078 PartyContactList partyContactList = contactListControl.getPartyContactList(party, contactList); 079 080 if(partyContactList == null) { 081 letter = null; // Don't send. 082 } 083 } 084 } 085 } 086 } 087 088 if(letter != null) { 089 var letterControl = Session.getModelController(LetterControl.class); 090 091 letterControl.createQueuedLetter(chainInstance, letter); 092 } 093 } 094 095 private void processChainActionSurvey(final ChainControl chainControl, final ChainInstance chainInstance, final ChainAction chainAction, final BasePK processedBy) { 096 ChainActionSurvey chainActionSurvey = chainControl.getChainActionSurvey(chainAction); 097 098 // TODO 099 } 100 101 private void processChainActionChainActionSet(final Session session, final ChainControl chainControl, final ChainInstanceStatus chainInstanceStatus, final ChainAction chainAction, final BasePK processedBy) { 102 ChainActionChainActionSet chainActionChainActionSet = chainControl.getChainActionChainActionSet(chainAction); 103 ChainActionSet nextChainActionSet = chainActionChainActionSet.getNextChainActionSet(); 104 Long nextChainActionSetTime = session.START_TIME + chainActionChainActionSet.getDelayTime(); 105 106 chainInstanceStatus.setNextChainActionSet(nextChainActionSet); 107 chainInstanceStatus.setNextChainActionSetTime(nextChainActionSetTime); 108 } 109 110 public void processChainInstanceStatus(final Session session, final ChainControl chainControl, final ChainInstanceStatus chainInstanceStatus, final BasePK processedBy) { 111 ChainInstance chainInstance = chainInstanceStatus.getChainInstance(); 112 ChainActionSet chainActionSet = chainInstanceStatus.getNextChainActionSet(); 113 boolean hasNextChainActionSet = false; 114 115 for(ChainAction chainAction: chainControl.getChainActionsByChainActionSet(chainActionSet)) { 116 String chainActionTypeName = chainAction.getLastDetail().getChainActionType().getLastDetail().getChainActionTypeName(); 117 118 if(chainActionTypeName.equals(ChainConstants.ChainActionType_LETTER)) { 119 processChainActionLetter(chainControl, chainInstance, chainAction, processedBy); 120 } else if(chainActionTypeName.equals(ChainConstants.ChainActionType_SURVEY)) { 121 processChainActionSurvey(chainControl, chainInstance, chainAction, processedBy); 122 } else if(chainActionTypeName.equals(ChainConstants.ChainActionType_CHAIN_ACTION_SET)) { 123 processChainActionChainActionSet(session, chainControl, chainInstanceStatus, chainAction, processedBy); 124 hasNextChainActionSet = true; 125 } 126 } 127 128 if(!hasNextChainActionSet) { 129 chainControl.removeChainInstanceStatusByChainInstance(chainInstance); 130 } 131 } 132 133}