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.training.server.logic;
018
019import com.echothree.model.control.training.common.exception.UnknownTrainingClassNameException;
020import com.echothree.model.control.training.server.control.TrainingControl;
021import com.echothree.model.data.training.server.entity.TrainingClass;
022import com.echothree.model.data.training.server.entity.TrainingClassAnswer;
023import com.echothree.model.data.training.server.entity.TrainingClassDetail;
024import com.echothree.model.data.training.server.entity.TrainingClassPage;
025import com.echothree.model.data.training.server.entity.TrainingClassQuestion;
026import com.echothree.model.data.training.server.entity.TrainingClassQuestionDetail;
027import com.echothree.model.data.training.server.entity.TrainingClassSection;
028import com.echothree.model.data.training.server.entity.TrainingClassSectionDetail;
029import com.echothree.util.common.message.ExecutionErrors;
030import com.echothree.util.server.control.BaseLogic;
031import com.echothree.util.server.message.ExecutionErrorAccumulator;
032import com.echothree.util.server.persistence.EntityPermission;
033import com.echothree.util.server.persistence.Session;
034
035public class TrainingClassLogic
036        extends BaseLogic {
037    
038    private TrainingClassLogic() {
039        super();
040    }
041    
042    private static class TrainingClassLogicHolder {
043        static TrainingClassLogic instance = new TrainingClassLogic();
044    }
045    
046    public static TrainingClassLogic getInstance() {
047        return TrainingClassLogicHolder.instance;
048    }
049    
050    private TrainingClass getTrainingClassByName(final ExecutionErrorAccumulator eea, final String trainingClassName, EntityPermission entityPermission) {
051        var trainingControl = Session.getModelController(TrainingControl.class);
052        TrainingClass trainingClass = trainingControl.getTrainingClassByName(trainingClassName, entityPermission);
053
054        if(trainingClass == null) {
055            handleExecutionError(UnknownTrainingClassNameException.class, eea, ExecutionErrors.UnknownTrainingClassName.name(), trainingClassName);
056        }
057
058        return trainingClass;
059    }
060    
061    public TrainingClass getTrainingClassByName(final ExecutionErrorAccumulator eea, final String trainingClassName) {
062        return getTrainingClassByName(eea, trainingClassName, EntityPermission.READ_ONLY);
063    }
064    
065    public TrainingClass getTrainingClassByNameForUpdate(final ExecutionErrorAccumulator eea, final String trainingClassName) {
066        return getTrainingClassByName(eea, trainingClassName, EntityPermission.READ_WRITE);
067    }
068    
069    private TrainingClassSection getTrainingClassSectionByName(final ExecutionErrorAccumulator eea, final TrainingClass trainingClass,
070            final String trainingClassSectionName, EntityPermission entityPermission) {
071        var trainingControl = Session.getModelController(TrainingControl.class);
072        TrainingClassSection trainingClassSection = trainingControl.getTrainingClassSectionByName(trainingClass, trainingClassSectionName, entityPermission);
073
074        if(trainingClassSection == null) {
075            TrainingClassDetail trainingClassDetail = trainingClass.getLastDetail();
076            
077            handleExecutionError(UnknownTrainingClassNameException.class, eea, ExecutionErrors.UnknownTrainingClassSectionName.name(),
078                    trainingClassDetail.getTrainingClassName(), trainingClassSectionName);
079        }
080
081        return trainingClassSection;
082    }
083    
084    public TrainingClassSection getTrainingClassSectionByName(final ExecutionErrorAccumulator eea, final TrainingClass trainingClass,
085            final String trainingClassSectionName) {
086        return getTrainingClassSectionByName(eea, trainingClass, trainingClassSectionName, EntityPermission.READ_ONLY);
087    }
088    
089    public TrainingClassSection getTrainingClassSectionByNameForUpdate(final ExecutionErrorAccumulator eea, final TrainingClass trainingClass,
090            final String trainingClassSectionName) {
091        return getTrainingClassSectionByName(eea, trainingClass, trainingClassSectionName, EntityPermission.READ_WRITE);
092    }
093    
094    private TrainingClassPage getTrainingClassPageByName(final ExecutionErrorAccumulator eea, final TrainingClassSection trainingClassSection,
095            final String trainingClassPageName, EntityPermission entityPermission) {
096        var trainingControl = Session.getModelController(TrainingControl.class);
097        TrainingClassPage trainingClassPage = trainingControl.getTrainingClassPageByName(trainingClassSection, trainingClassPageName, entityPermission);
098
099        if(trainingClassPage == null) {
100            TrainingClassSectionDetail trainingClassSectionDetail = trainingClassSection.getLastDetail();
101            TrainingClassDetail trainingClassDetail = trainingClassSectionDetail.getTrainingClass().getLastDetail();
102            
103            handleExecutionError(UnknownTrainingClassNameException.class, eea, ExecutionErrors.UnknownTrainingClassPageName.name(),
104                    trainingClassDetail.getTrainingClassName(), trainingClassSectionDetail.getTrainingClassSectionName(), trainingClassPageName);
105        }
106
107        return trainingClassPage;
108    }
109    
110    public TrainingClassPage getTrainingClassPageByName(final ExecutionErrorAccumulator eea, final TrainingClassSection trainingClassSection,
111            final String trainingClassPageName) {
112        return getTrainingClassPageByName(eea, trainingClassSection, trainingClassPageName, EntityPermission.READ_ONLY);
113    }
114    
115    public TrainingClassPage getTrainingClassPageByNameForUpdate(final ExecutionErrorAccumulator eea, final TrainingClassSection trainingClassSection,
116            final String trainingClassPageName) {
117        return getTrainingClassPageByName(eea, trainingClassSection, trainingClassPageName, EntityPermission.READ_WRITE);
118    }
119    
120    private TrainingClassQuestion getTrainingClassQuestionByName(final ExecutionErrorAccumulator eea, final TrainingClassSection trainingClassSection,
121            final String trainingClassQuestionName, EntityPermission entityPermission) {
122        var trainingControl = Session.getModelController(TrainingControl.class);
123        TrainingClassQuestion trainingClassQuestion = trainingControl.getTrainingClassQuestionByName(trainingClassSection, trainingClassQuestionName, entityPermission);
124
125        if(trainingClassQuestion == null) {
126            TrainingClassSectionDetail trainingClassSectionDetail = trainingClassSection.getLastDetail();
127            TrainingClassDetail trainingClassDetail = trainingClassSectionDetail.getTrainingClass().getLastDetail();
128            
129            handleExecutionError(UnknownTrainingClassNameException.class, eea, ExecutionErrors.UnknownTrainingClassQuestionName.name(),
130                    trainingClassDetail.getTrainingClassName(), trainingClassSectionDetail.getTrainingClassSectionName(), trainingClassQuestionName);
131        }
132
133        return trainingClassQuestion;
134    }
135    
136    public TrainingClassQuestion getTrainingClassQuestionByName(final ExecutionErrorAccumulator eea, final TrainingClassSection trainingClassSection,
137            final String trainingClassQuestionName) {
138        return getTrainingClassQuestionByName(eea, trainingClassSection, trainingClassQuestionName, EntityPermission.READ_ONLY);
139    }
140    
141    public TrainingClassQuestion getTrainingClassQuestionByNameForUpdate(final ExecutionErrorAccumulator eea, final TrainingClassSection trainingClassSection,
142            final String trainingClassQuestionName) {
143        return getTrainingClassQuestionByName(eea, trainingClassSection, trainingClassQuestionName, EntityPermission.READ_WRITE);
144    }
145    
146    private TrainingClassAnswer getTrainingClassAnswerByName(final ExecutionErrorAccumulator eea, final TrainingClassQuestion trainingClassQuestion,
147            final String trainingClassAnswerName, EntityPermission entityPermission) {
148        var trainingControl = Session.getModelController(TrainingControl.class);
149        TrainingClassAnswer trainingClassAnswer = trainingControl.getTrainingClassAnswerByName(trainingClassQuestion, trainingClassAnswerName, entityPermission);
150
151        if(trainingClassAnswer == null) {
152            TrainingClassQuestionDetail trainingClassQuestionDetail = trainingClassQuestion.getLastDetail();
153            TrainingClassSectionDetail trainingClassSectionDetail = trainingClassQuestionDetail.getTrainingClassSection().getLastDetail();
154            TrainingClassDetail trainingClassDetail = trainingClassSectionDetail.getTrainingClass().getLastDetail();
155            
156            handleExecutionError(UnknownTrainingClassNameException.class, eea, ExecutionErrors.UnknownTrainingClassAnswerName.name(),
157                    trainingClassDetail.getTrainingClassName(), trainingClassSectionDetail.getTrainingClassSectionName(),
158                    trainingClassQuestionDetail.getTrainingClassQuestionName(), trainingClassAnswerName);
159        }
160
161        return trainingClassAnswer;
162    }
163    
164    public TrainingClassAnswer getTrainingClassAnswerByName(final ExecutionErrorAccumulator eea, final TrainingClassQuestion trainingClassQuestion,
165            final String trainingClassAnswerName) {
166        return getTrainingClassAnswerByName(eea, trainingClassQuestion, trainingClassAnswerName, EntityPermission.READ_ONLY);
167    }
168    
169    public TrainingClassAnswer getTrainingClassAnswerByNameForUpdate(final ExecutionErrorAccumulator eea, final TrainingClassQuestion trainingClassQuestion,
170            final String trainingClassAnswerName) {
171        return getTrainingClassAnswerByName(eea, trainingClassQuestion, trainingClassAnswerName, EntityPermission.READ_WRITE);
172    }
173    
174}