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.BlogCommentEdit;
020import com.echothree.control.user.forum.common.edit.ForumEditFactory;
021import com.echothree.control.user.forum.common.form.EditBlogCommentForm;
022import com.echothree.control.user.forum.common.result.EditBlogCommentResult;
023import com.echothree.control.user.forum.common.result.ForumResultFactory;
024import com.echothree.control.user.forum.common.spec.ForumMessageSpec;
025import com.echothree.model.control.forum.common.ForumConstants;
026import com.echothree.model.control.forum.server.control.ForumControl;
027import com.echothree.model.control.icon.common.IconConstants;
028import com.echothree.model.control.icon.server.control.IconControl;
029import com.echothree.model.data.core.server.entity.MimeType;
030import com.echothree.model.data.forum.server.entity.Forum;
031import com.echothree.model.data.forum.server.entity.ForumClobMessagePart;
032import com.echothree.model.data.forum.server.entity.ForumMessage;
033import com.echothree.model.data.forum.server.entity.ForumMessageDetail;
034import com.echothree.model.data.forum.server.entity.ForumMessagePart;
035import com.echothree.model.data.forum.server.entity.ForumMessagePartType;
036import com.echothree.model.data.forum.server.entity.ForumMimeType;
037import com.echothree.model.data.forum.server.entity.ForumStringMessagePart;
038import com.echothree.model.data.forum.server.value.ForumClobMessagePartValue;
039import com.echothree.model.data.forum.server.value.ForumMessageDetailValue;
040import com.echothree.model.data.forum.server.value.ForumMessagePartDetailValue;
041import com.echothree.model.data.forum.server.value.ForumStringMessagePartValue;
042import com.echothree.model.data.icon.server.entity.Icon;
043import com.echothree.model.data.icon.server.entity.IconUsage;
044import com.echothree.model.data.icon.server.entity.IconUsageType;
045import com.echothree.model.data.party.server.entity.Language;
046import com.echothree.model.data.user.common.pk.UserVisitPK;
047import com.echothree.util.common.message.ExecutionErrors;
048import com.echothree.util.common.validation.FieldDefinition;
049import com.echothree.util.common.validation.FieldType;
050import com.echothree.util.common.command.EditMode;
051import com.echothree.util.server.control.BaseAbstractEditCommand;
052import com.echothree.util.server.persistence.Session;
053import com.echothree.util.server.string.DateUtils;
054import java.util.Arrays;
055import java.util.Collections;
056import java.util.List;
057
058public class EditBlogCommentCommand
059        extends BaseAbstractEditCommand<ForumMessageSpec, BlogCommentEdit, EditBlogCommentResult, ForumMessage, ForumMessage> {
060    
061    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
062    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
063    
064    static {
065        SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
066                new FieldDefinition("ForumMessageName", FieldType.ENTITY_NAME, true, null, null)
067                ));
068        
069        EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
070                new FieldDefinition("PostedTime", FieldType.DATE_TIME, true, null, null),
071                new FieldDefinition("ForumMessageIconName", FieldType.ENTITY_NAME, false, null, null),
072                new FieldDefinition("Title", FieldType.STRING, true, 1L, 512L),
073                new FieldDefinition("ContentMimeTypeName", FieldType.MIME_TYPE, true, null, null),
074                new FieldDefinition("Content", FieldType.STRING, true, null, null)
075                ));
076    }
077    
078    /** Creates a new instance of EditBlogCommentCommand */
079    public EditBlogCommentCommand(UserVisitPK userVisitPK, EditBlogCommentForm form) {
080        super(userVisitPK, form, null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
081    }
082    
083    @Override
084    public EditBlogCommentResult getResult() {
085        return ForumResultFactory.getEditBlogCommentResult();
086    }
087
088    @Override
089    public BlogCommentEdit getEdit() {
090        return ForumEditFactory.getBlogCommentEdit();
091    }
092
093    @Override
094    public ForumMessage getEntity(EditBlogCommentResult result) {
095        var forumControl = Session.getModelController(ForumControl.class);
096        ForumMessage forumMessage = null;
097        String forumMessageName = spec.getForumMessageName();
098
099        if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
100            forumMessage = forumControl.getForumMessageByName(forumMessageName);
101        } else { // EditMode.UPDATE
102            forumMessage = forumControl.getForumMessageByNameForUpdate(forumMessageName);
103        }
104
105        if(forumMessage == null) {
106            addExecutionError(ExecutionErrors.UnknownForumMessageName.name(), forumMessageName);
107        }
108
109        return forumMessage;
110    }
111
112    @Override
113    public ForumMessage getLockEntity(ForumMessage forumMessage) {
114        return forumMessage;
115    }
116
117    @Override
118    public void fillInResult(EditBlogCommentResult result, ForumMessage forumMessage) {
119        var forumControl = Session.getModelController(ForumControl.class);
120
121        result.setForumMessage(forumControl.getForumMessageTransfer(getUserVisit(), forumMessage));
122    }
123
124    @Override
125    public void doLock(BlogCommentEdit edit, ForumMessage forumMessage) {
126        var forumControl = Session.getModelController(ForumControl.class);
127        ForumMessageDetail forumMessageDetail = forumMessage.getLastDetail();
128
129        forumMessageIcon = forumMessageDetail.getIcon();
130
131        edit.setForumMessageIconName(forumMessageIcon == null? null: forumMessageIcon.getLastDetail().getIconName());
132        edit.setPostedTime(DateUtils.getInstance().formatTypicalDateTime(getUserVisit(), getPreferredDateTimeFormat(), forumMessageDetail.getPostedTime()));
133
134        ForumMessagePartType forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE);
135        Language preferredLanguage = getPreferredLanguage();
136        ForumMessagePart forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
137        if(forumMessagePart != null) {
138            ForumStringMessagePart forumStringMessagePart = forumControl.getForumStringMessagePart(forumMessagePart);
139
140            edit.setTitle(forumStringMessagePart.getString());
141        }
142
143        forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT);
144        forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
145        if(forumMessagePart != null) {
146            ForumClobMessagePart forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart);
147
148            edit.setContentMimeTypeName(forumMessagePart.getLastDetail().getMimeType().getLastDetail().getMimeTypeName());
149            edit.setContent(forumClobMessagePart.getClob());
150        }
151    }
152
153    Icon forumMessageIcon = null;
154    MimeType contentMimeType = null;
155
156    @Override
157    public void canUpdate(ForumMessage forumMessage) {
158        var forumControl = Session.getModelController(ForumControl.class);
159        ForumMessageDetail forumMessageDetail = forumMessage.getLastDetail();
160
161        if(forumMessageDetail.getForumMessageType().getForumMessageTypeName().equals(ForumConstants.ForumMessageType_BLOG_COMMENT)) {
162            var iconControl = Session.getModelController(IconControl.class);
163            String forumMessageIconName = edit.getForumMessageIconName();
164
165            forumMessageIcon = forumMessageIconName == null? null: iconControl.getIconByName(forumMessageIconName);
166
167            if(forumMessageIconName == null || forumMessageIcon != null) {
168                if(forumMessageIcon != null) {
169                    IconUsageType iconUsageType = iconControl.getIconUsageTypeByName(IconConstants.IconUsageType_FORUM_MESSAGE);
170                    IconUsage iconUsage = iconControl.getIconUsage(iconUsageType, forumMessageIcon);
171
172                    if(iconUsage == null) {
173                        addExecutionError(ExecutionErrors.UnknownIconUsage.name());
174                    }
175                }
176
177                if(!hasExecutionErrors()) {
178                    var coreControl = getCoreControl();
179                    String contentMimeTypeName = edit.getContentMimeTypeName();
180
181                    contentMimeType = contentMimeTypeName == null? null: coreControl.getMimeTypeByName(contentMimeTypeName);
182
183                    if(contentMimeType != null) {
184                        Forum forum = forumControl.getDefaultForumForumThread(forumMessageDetail.getForumThread()).getForum();
185                        ForumMimeType forumMimeType = forumControl.getForumMimeType(forum, contentMimeType);
186
187                        if(forumMimeType == null) {
188                            addExecutionError(ExecutionErrors.UnknownForumMimeType.name());
189                        }
190                    } else {
191                        addExecutionError(ExecutionErrors.UnknownContentMimeTypeName.name(), contentMimeTypeName);
192                    }
193                }
194            } else {
195                addExecutionError(ExecutionErrors.UnknownIconName.name(), forumMessageIconName);
196            }
197        } else {
198            addExecutionError(ExecutionErrors.InvalidForumMessageType.name());
199        }
200    }
201
202    @Override
203    public void doUpdate(ForumMessage forumMessage) {
204        var forumControl = Session.getModelController(ForumControl.class);
205        var partyPK = getPartyPK();
206        ForumMessageDetailValue forumMessageDetailValue = forumControl.getForumMessageDetailValueForUpdate(forumMessage);
207
208        forumMessageDetailValue.setIconPK(forumMessageIcon == null? null: forumMessageIcon.getPrimaryKey());
209        forumMessageDetailValue.setPostedTime(Long.valueOf(edit.getPostedTime()));
210
211        forumControl.updateForumMessageFromValue(forumMessageDetailValue, partyPK);
212
213        ForumMessagePartType forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE);
214        Language preferredLanguage = getPreferredLanguage();
215        ForumMessagePart forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
216        if(forumMessagePart != null) {
217            ForumStringMessagePartValue forumStringMessagePartValue = forumControl.getForumStringMessagePartValueForUpdate(forumMessagePart);
218
219            forumStringMessagePartValue.setString(edit.getTitle());
220
221            forumControl.updateForumStringMessagePartFromValue(forumStringMessagePartValue, partyPK);
222        }
223
224        forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT);
225        forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
226        if(forumMessagePart != null) {
227            ForumMessagePartDetailValue forumMessagePartDetailValue = forumControl.getForumMessagePartDetailValueForUpdate(forumMessagePart);
228            ForumClobMessagePartValue forumClobMessagePartValue = forumControl.getForumClobMessagePartValueForUpdate(forumMessagePart);
229
230            forumMessagePartDetailValue.setMimeTypePK(contentMimeType.getPrimaryKey());
231            forumClobMessagePartValue.setClob(edit.getContent());
232
233            forumControl.updateForumMessagePartFromValue(forumMessagePartDetailValue, partyPK);
234            forumControl.updateForumClobMessagePartFromValue(forumClobMessagePartValue, partyPK);
235        }
236    }
237    
238}