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.control.user.forum.server.command;
018
019import com.echothree.control.user.forum.common.edit.ForumEditFactory;
020import com.echothree.control.user.forum.common.edit.ForumMessageAttachmentEdit;
021import com.echothree.control.user.forum.common.form.EditForumMessageAttachmentForm;
022import com.echothree.control.user.forum.common.result.EditForumMessageAttachmentResult;
023import com.echothree.control.user.forum.common.result.ForumResultFactory;
024import com.echothree.control.user.forum.common.spec.ForumMessageAttachmentSpec;
025import com.echothree.model.control.core.common.EntityAttributeTypes;
026import com.echothree.model.control.forum.server.control.ForumControl;
027import com.echothree.model.data.core.server.entity.MimeType;
028import com.echothree.model.data.forum.server.entity.ForumMessage;
029import com.echothree.model.data.forum.server.entity.ForumMessageAttachment;
030import com.echothree.model.data.forum.server.entity.ForumMessageBlobAttachment;
031import com.echothree.model.data.forum.server.entity.ForumMessageClobAttachment;
032import com.echothree.model.data.forum.server.value.ForumMessageAttachmentDetailValue;
033import com.echothree.model.data.forum.server.value.ForumMessageBlobAttachmentValue;
034import com.echothree.model.data.forum.server.value.ForumMessageClobAttachmentValue;
035import com.echothree.model.data.item.server.entity.Item;
036import com.echothree.model.data.item.server.entity.ItemDescriptionType;
037import com.echothree.model.data.party.common.pk.PartyPK;
038import com.echothree.model.data.user.common.pk.UserVisitPK;
039import com.echothree.util.common.message.ExecutionErrors;
040import com.echothree.util.common.validation.FieldDefinition;
041import com.echothree.util.common.validation.FieldType;
042import com.echothree.util.common.command.EditMode;
043import com.echothree.util.common.persistence.type.ByteArray;
044import com.echothree.util.server.control.BaseAbstractEditCommand;
045import com.echothree.util.server.persistence.Session;
046import java.util.Arrays;
047import java.util.Collections;
048import java.util.List;
049
050public class EditForumMessageAttachmentCommand
051        extends BaseAbstractEditCommand<ForumMessageAttachmentSpec, ForumMessageAttachmentEdit, EditForumMessageAttachmentResult, ForumMessageAttachment, ForumMessageAttachment> {
052    
053    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
054    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
055    
056    static {
057        SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
058                new FieldDefinition("ForumMessageName", FieldType.ENTITY_NAME, true, null, null),
059                new FieldDefinition("ForumMessageAttachmentSequence", FieldType.UNSIGNED_INTEGER, true, null, null)
060                ));
061        
062        EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
063                new FieldDefinition("MimeTypeName", FieldType.MIME_TYPE, true, null, null),
064                new FieldDefinition("Clob", FieldType.STRING, false, 1L, null),
065                new FieldDefinition("String", FieldType.STRING, false, 1L, 512L)
066                ));
067    }
068    
069    /** Creates a new instance of EditForumMessageAttachmentCommand */
070    public EditForumMessageAttachmentCommand(UserVisitPK userVisitPK, EditForumMessageAttachmentForm form) {
071        super(userVisitPK, form, null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
072    }
073
074    @Override
075    public EditForumMessageAttachmentResult getResult() {
076        return ForumResultFactory.getEditForumMessageAttachmentResult();
077    }
078
079    @Override
080    public ForumMessageAttachmentEdit getEdit() {
081        return ForumEditFactory.getForumMessageAttachmentEdit();
082    }
083
084    ItemDescriptionType itemDescriptionType;
085    Item item;
086
087    @Override
088    public ForumMessageAttachment getEntity(EditForumMessageAttachmentResult result) {
089        var forumControl = Session.getModelController(ForumControl.class);
090        ForumMessageAttachment forumMessageAttachment = null;
091        String forumMessageName = spec.getForumMessageName();
092        ForumMessage forumMessage = forumControl.getForumMessageByNameForUpdate(forumMessageName);
093
094        if(forumMessage != null) {
095            Integer forumMessageAttachmentSequence = Integer.valueOf(spec.getForumMessageAttachmentSequence());
096
097            if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
098                forumMessageAttachment = forumControl.getForumMessageAttachmentBySequence(forumMessage, forumMessageAttachmentSequence);
099            } else { // EditMode.UPDATE
100                forumMessageAttachment = forumControl.getForumMessageAttachmentBySequenceForUpdate(forumMessage, forumMessageAttachmentSequence);
101            }
102
103            if(forumMessageAttachment == null) {
104                addExecutionError(ExecutionErrors.UnknownForumMessageAttachment.name(), forumMessageName, forumMessageAttachmentSequence.toString());
105            }
106        } else {
107            addExecutionError(ExecutionErrors.UnknownForumMessageName.name(), forumMessageName);
108        }
109
110        return forumMessageAttachment;
111    }
112
113    @Override
114    public ForumMessageAttachment getLockEntity(ForumMessageAttachment forumMessageAttachment) {
115        return forumMessageAttachment;
116    }
117
118    @Override
119    public void fillInResult(EditForumMessageAttachmentResult result, ForumMessageAttachment forumMessageAttachment) {
120        var forumControl = Session.getModelController(ForumControl.class);
121
122        result.setForumMessageAttachment(forumControl.getForumMessageAttachmentTransfer(getUserVisit(), forumMessageAttachment));
123    }
124
125    MimeType mimeType;
126
127    @Override
128    public void doLock(ForumMessageAttachmentEdit edit, ForumMessageAttachment forumMessageAttachment) {
129        var forumControl = Session.getModelController(ForumControl.class);
130        
131        mimeType = forumMessageAttachment.getLastDetail().getMimeType();
132
133        edit.setMimeTypeName(mimeType == null? null: mimeType.getLastDetail().getMimeTypeName());
134
135        String entityAttributeTypeName = mimeType.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName();
136
137        // EntityAttributeTypes.BLOB.name() does not return anything in edit
138        if(entityAttributeTypeName.equals(EntityAttributeTypes.CLOB.name())) {
139            ForumMessageClobAttachment forumMessageAttachmentClob = forumControl.getForumMessageClobAttachment(forumMessageAttachment);
140
141            if(forumMessageAttachmentClob != null) {
142                edit.setClob(forumMessageAttachmentClob.getClob());
143            }
144        }
145    }
146
147    @Override
148    public void canUpdate(ForumMessageAttachment forumMessageAttachment) {
149        var coreControl = getCoreControl();
150        String mimeTypeName = edit.getMimeTypeName();
151
152        mimeType = coreControl.getMimeTypeByName(mimeTypeName);
153
154        if(mimeType != null) {
155            String entityAttributeTypeName = mimeType.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName();
156            ByteArray blob = edit.getBlob();
157            String clob = edit.getClob();
158
159            if(entityAttributeTypeName.equals(EntityAttributeTypes.BLOB.name()) && blob == null) {
160                addExecutionError(ExecutionErrors.MissingBlob.name());
161            } else {
162                if(entityAttributeTypeName.equals(EntityAttributeTypes.CLOB.name()) && clob == null) {
163                    addExecutionError(ExecutionErrors.MissingClob.name());
164                }
165            }
166        } else {
167            addExecutionError(ExecutionErrors.UnknownMimeTypeName.name(), mimeTypeName);
168        }
169    }
170
171    @Override
172    public void doUpdate(ForumMessageAttachment forumMessageAttachment) {
173        var forumControl = Session.getModelController(ForumControl.class);
174        ForumMessageAttachmentDetailValue forumMessageAttachmentDetailValue = forumControl.getForumMessageAttachmentDetailValueForUpdate(forumMessageAttachment);
175        String entityAttributeTypeName = mimeType.getLastDetail().getEntityAttributeType().getEntityAttributeTypeName();
176        PartyPK updatedBy = getPartyPK();
177
178        forumMessageAttachmentDetailValue.setMimeTypePK(mimeType.getPrimaryKey());
179        forumControl.updateForumMessageAttachmentFromValue(forumMessageAttachmentDetailValue, updatedBy);
180
181        ForumMessageBlobAttachment forumMessageAttachmentBlob = forumControl.getForumMessageBlobAttachmentForUpdate(forumMessageAttachment);
182        ForumMessageClobAttachment forumMessageAttachmentClob = forumControl.getForumMessageClobAttachmentForUpdate(forumMessageAttachment);
183
184        if(entityAttributeTypeName.equals(EntityAttributeTypes.BLOB.name())) {
185            ByteArray blob = edit.getBlob();
186
187            if(forumMessageAttachmentClob != null) {
188                forumControl.deleteForumMessageClobAttachment(forumMessageAttachmentClob, updatedBy);
189            }
190
191            if(forumMessageAttachmentBlob == null) {
192                forumControl.createForumMessageBlobAttachment(forumMessageAttachment, blob, updatedBy);
193            } else {
194                ForumMessageBlobAttachmentValue forumMessageAttachmentBlobValue = forumControl.getForumMessageBlobAttachmentValue(forumMessageAttachmentBlob);
195
196                forumMessageAttachmentBlobValue.setBlob(blob);
197            }
198        } else if(entityAttributeTypeName.equals(EntityAttributeTypes.CLOB.name())) {
199            String clob = edit.getClob();
200            
201            if(forumMessageAttachmentBlob != null) {
202                forumControl.deleteForumMessageBlobAttachment(forumMessageAttachmentBlob, updatedBy);
203            }
204
205            if(forumMessageAttachmentClob == null) {
206                forumControl.createForumMessageClobAttachment(forumMessageAttachment, clob, updatedBy);
207            } else {
208                ForumMessageClobAttachmentValue forumMessageAttachmentClobValue = forumControl.getForumMessageClobAttachmentValue(forumMessageAttachmentClob);
209
210                forumMessageAttachmentClobValue.setClob(clob);
211            }
212        }
213    }
214    
215}