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.util.server.control; 018 019import com.echothree.model.control.core.common.EntityAttributeTypes; 020import com.echothree.model.control.core.common.MimeTypes; 021import com.echothree.model.data.core.server.entity.MimeType; 022import com.echothree.model.data.core.server.entity.MimeTypeDetail; 023import com.echothree.model.data.user.common.pk.UserVisitPK; 024import com.echothree.util.common.message.ExecutionErrors; 025import com.echothree.util.common.validation.FieldDefinition; 026import com.echothree.util.common.form.BaseForm; 027import com.echothree.util.common.form.ValidationResult; 028import com.echothree.util.server.validation.Validator; 029import java.util.List; 030 031public abstract class BaseSimpleCommand<F extends BaseForm> 032 extends BaseCommand { 033 034 protected F form; 035 private List<FieldDefinition> formFieldDefinitions; 036 boolean allowLimits; 037 038 private void init(F form, List<FieldDefinition> formFieldDefinitions, boolean allowLimits) { 039 this.form = form; 040 this.formFieldDefinitions = formFieldDefinitions; 041 this.allowLimits = allowLimits; 042 } 043 044 @Override 045 protected void setupSession() { 046 super.setupSession(); 047 048 if(form != null) { 049 session.setOptions(form.getOptions()); 050 session.setTransferProperties(form.getTransferProperties()); 051 052 if(allowLimits) { 053 session.setLimits(form.getLimits()); 054 } 055 } 056 } 057 058 protected BaseSimpleCommand(UserVisitPK userVisitPK, F form, CommandSecurityDefinition commandSecurityDefinition, 059 List<FieldDefinition> formFieldDefinitions, boolean allowLimits) { 060 super(userVisitPK, commandSecurityDefinition); 061 062 init(form, formFieldDefinitions, allowLimits); 063 } 064 065 protected BaseSimpleCommand(UserVisitPK userVisitPK, CommandSecurityDefinition commandSecurityDefinition, boolean allowLimits) { 066 super(userVisitPK, commandSecurityDefinition); 067 068 init(null, null, allowLimits); 069 } 070 071 protected F getForm() { 072 return form; 073 } 074 075 protected List<FieldDefinition> getFormFieldDefinitions() { 076 return formFieldDefinitions; 077 } 078 079 protected void setupValidator(Validator validator) { 080 // Nothing. 081 } 082 083 protected ValidationResult validate(Validator validator) { 084 return validator.validate(form, getFormFieldDefinitions()); 085 } 086 087 protected void setupPreferredClobMimeType() { 088 String preferredClobMimeTypeName = form.getPreferredClobMimeTypeName(); 089 090 if(preferredClobMimeTypeName != null) { 091 var coreControl = getCoreControl(); 092 MimeType preferredClobMimeType = coreControl.getMimeTypeByName(preferredClobMimeTypeName); 093 094 if(preferredClobMimeType == null) { 095 addExecutionError(ExecutionErrors.UnknownPreferredClobMimeTypeName.name(), preferredClobMimeTypeName); 096 } else { 097 MimeTypeDetail preferredClobMimeTypeDetail = preferredClobMimeType.getLastDetail(); 098 String entityAttributeTypeName = preferredClobMimeTypeDetail.getEntityAttributeType().getEntityAttributeTypeName(); 099 100 // Must be a CLOB and for now the preferred MIME type must be HTML. 101 if(!entityAttributeTypeName.equals(EntityAttributeTypes.CLOB.name()) 102 || !preferredClobMimeTypeDetail.getMimeTypeName().equals(MimeTypes.TEXT_HTML.mimeTypeName())) { 103 addExecutionError(ExecutionErrors.InvalidPreferredClobMimeType.name(), preferredClobMimeTypeName, entityAttributeTypeName); 104 } else { 105 session.setPreferredClobMimeType(preferredClobMimeType); 106 } 107 } 108 } 109 } 110 111 @Override 112 protected ValidationResult validate() { 113 ValidationResult validationResult = null; 114 115 if(getFormFieldDefinitions() != null) { 116 Validator validator = new Validator(this); 117 118 setupValidator(validator); 119 validationResult = validate(validator); 120 } 121 122 return validationResult; 123 } 124 125 126 // Perform security and validation for GraphQL queries. 127 public boolean canQueryByGraphQl() { 128 initSession(); 129 130 var securityResult = security(); 131 boolean canQuery = false; 132 133 if(securityResult == null || !securityResult.getHasMessages()) { 134 var validationResult = validate(); 135 136 if((validationResult == null || !validationResult.getHasErrors())) { 137 canQuery = true; 138 } 139 } 140 141 return canQuery; 142 } 143}