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.BlogEntryEdit;
020import com.echothree.control.user.forum.common.edit.ForumEditFactory;
021import com.echothree.control.user.forum.common.form.EditBlogEntryForm;
022import com.echothree.control.user.forum.common.result.EditBlogEntryResult;
023import com.echothree.control.user.forum.common.result.ForumResultFactory;
024import com.echothree.control.user.forum.common.spec.ForumMessageSpec;
025import com.echothree.model.control.core.common.EventTypes;
026import com.echothree.model.control.forum.common.ForumConstants;
027import com.echothree.model.control.forum.server.control.ForumControl;
028import com.echothree.model.control.icon.common.IconConstants;
029import com.echothree.model.control.icon.server.control.IconControl;
030import com.echothree.model.data.core.server.entity.MimeType;
031import com.echothree.model.data.forum.server.entity.Forum;
032import com.echothree.model.data.forum.server.entity.ForumClobMessagePart;
033import com.echothree.model.data.forum.server.entity.ForumMessage;
034import com.echothree.model.data.forum.server.entity.ForumMessageDetail;
035import com.echothree.model.data.forum.server.entity.ForumMessagePart;
036import com.echothree.model.data.forum.server.entity.ForumMessagePartType;
037import com.echothree.model.data.forum.server.entity.ForumMimeType;
038import com.echothree.model.data.forum.server.entity.ForumStringMessagePart;
039import com.echothree.model.data.forum.server.entity.ForumThreadDetail;
040import com.echothree.model.data.forum.server.value.ForumClobMessagePartValue;
041import com.echothree.model.data.forum.server.value.ForumMessageDetailValue;
042import com.echothree.model.data.forum.server.value.ForumMessagePartDetailValue;
043import com.echothree.model.data.forum.server.value.ForumStringMessagePartValue;
044import com.echothree.model.data.forum.server.value.ForumThreadDetailValue;
045import com.echothree.model.data.icon.server.entity.Icon;
046import com.echothree.model.data.icon.server.entity.IconUsage;
047import com.echothree.model.data.icon.server.entity.IconUsageType;
048import com.echothree.model.data.party.server.entity.Language;
049import com.echothree.model.data.user.common.pk.UserVisitPK;
050import com.echothree.util.common.message.ExecutionErrors;
051import com.echothree.util.common.validation.FieldDefinition;
052import com.echothree.util.common.validation.FieldType;
053import com.echothree.util.common.command.EditMode;
054import com.echothree.util.server.control.BaseAbstractEditCommand;
055import com.echothree.util.server.persistence.Session;
056import com.echothree.util.server.string.DateUtils;
057import java.util.Arrays;
058import java.util.Collections;
059import java.util.List;
060
061public class EditBlogEntryCommand
062        extends BaseAbstractEditCommand<ForumMessageSpec, BlogEntryEdit, EditBlogEntryResult, ForumMessage, ForumMessage> {
063    
064    private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS;
065    private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS;
066    
067    static {
068        SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
069                new FieldDefinition("ForumMessageName", FieldType.ENTITY_NAME, true, null, null)
070                ));
071        
072        EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList(
073                new FieldDefinition("ForumThreadIconName", FieldType.ENTITY_NAME, false, null, null),
074                new FieldDefinition("PostedTime", FieldType.DATE_TIME, true, null, null),
075                new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null),
076                new FieldDefinition("ForumMessageIconName", FieldType.ENTITY_NAME, false, null, null),
077                new FieldDefinition("Title", FieldType.STRING, true, 1L, 512L),
078                new FieldDefinition("FeedSummaryMimeTypeName", FieldType.MIME_TYPE, false, null, null),
079                new FieldDefinition("FeedSummary", FieldType.STRING, false, null, null),
080                new FieldDefinition("SummaryMimeTypeName", FieldType.MIME_TYPE, false, null, null),
081                new FieldDefinition("Summary", FieldType.STRING, false, null, null),
082                new FieldDefinition("ContentMimeTypeName", FieldType.MIME_TYPE, true, null, null),
083                new FieldDefinition("Content", FieldType.STRING, true, null, null)
084                ));
085    }
086    
087    /** Creates a new instance of EditBlogEntryCommand */
088    public EditBlogEntryCommand(UserVisitPK userVisitPK, EditBlogEntryForm form) {
089        super(userVisitPK, form, null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS);
090    }
091    
092    @Override
093    public EditBlogEntryResult getResult() {
094        return ForumResultFactory.getEditBlogEntryResult();
095    }
096
097    @Override
098    public BlogEntryEdit getEdit() {
099        return ForumEditFactory.getBlogEntryEdit();
100    }
101
102    @Override
103    public ForumMessage getEntity(EditBlogEntryResult result) {
104        var forumControl = Session.getModelController(ForumControl.class);
105        ForumMessage forumMessage = null;
106        String forumMessageName = spec.getForumMessageName();
107
108        if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) {
109            forumMessage = forumControl.getForumMessageByName(forumMessageName);
110        } else { // EditMode.UPDATE
111            forumMessage = forumControl.getForumMessageByNameForUpdate(forumMessageName);
112        }
113
114        if(forumMessage == null) {
115            addExecutionError(ExecutionErrors.UnknownForumMessageName.name(), forumMessageName);
116        }
117
118        return forumMessage;
119    }
120
121    @Override
122    public ForumMessage getLockEntity(ForumMessage forumMessage) {
123        return forumMessage;
124    }
125
126    @Override
127    public void fillInResult(EditBlogEntryResult result, ForumMessage forumMessage) {
128        var forumControl = Session.getModelController(ForumControl.class);
129
130        result.setForumMessage(forumControl.getForumMessageTransfer(getUserVisit(), forumMessage));
131    }
132
133    @Override
134    public void doLock(BlogEntryEdit edit, ForumMessage forumMessage) {
135        var forumControl = Session.getModelController(ForumControl.class);
136        ForumMessageDetail forumMessageDetail = forumMessage.getLastDetail();
137        ForumThreadDetail forumThreadDetail = forumMessageDetail.getForumThread().getLastDetail();
138
139        forumThreadIcon = forumThreadDetail.getIcon();
140        forumMessageIcon = forumMessageDetail.getIcon();
141
142        edit.setForumThreadIconName(forumThreadIcon == null? null: forumThreadIcon.getLastDetail().getIconName());
143        edit.setSortOrder(forumThreadDetail.getSortOrder().toString());
144        edit.setForumMessageIconName(forumMessageIcon == null? null: forumMessageIcon.getLastDetail().getIconName());
145        edit.setPostedTime(DateUtils.getInstance().formatTypicalDateTime(getUserVisit(), getPreferredDateTimeFormat(), forumMessageDetail.getPostedTime()));
146
147        ForumMessagePartType forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE);
148        Language preferredLanguage = getPreferredLanguage();
149        ForumMessagePart forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
150        if(forumMessagePart != null) {
151            ForumStringMessagePart forumStringMessagePart = forumControl.getForumStringMessagePart(forumMessagePart);
152
153            edit.setTitle(forumStringMessagePart.getString());
154        }
155
156        forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_FEED_SUMMARY);
157        forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
158        if(forumMessagePart != null) {
159            ForumClobMessagePart forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart);
160
161            edit.setFeedSummaryMimeTypeName(forumMessagePart.getLastDetail().getMimeType().getLastDetail().getMimeTypeName());
162            edit.setFeedSummary(forumClobMessagePart.getClob());
163        }
164
165        forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_SUMMARY);
166        forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
167        if(forumMessagePart != null) {
168            ForumClobMessagePart forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart);
169
170            edit.setSummaryMimeTypeName(forumMessagePart.getLastDetail().getMimeType().getLastDetail().getMimeTypeName());
171            edit.setSummary(forumClobMessagePart.getClob());
172        }
173
174        forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT);
175        forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
176        if(forumMessagePart != null) {
177            ForumClobMessagePart forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart);
178
179            edit.setContentMimeTypeName(forumMessagePart.getLastDetail().getMimeType().getLastDetail().getMimeTypeName());
180            edit.setContent(forumClobMessagePart.getClob());
181        }
182    }
183
184    Icon forumThreadIcon = null;
185    Icon forumMessageIcon = null;
186    MimeType feedSummaryMimeType = null;
187    MimeType summaryMimeType = null;
188    MimeType contentMimeType = null;
189
190    @Override
191    public void canUpdate(ForumMessage forumMessage) {
192        var forumControl = Session.getModelController(ForumControl.class);
193        ForumMessageDetail forumMessageDetail = forumMessage.getLastDetail();
194
195        if(forumMessageDetail.getForumMessageType().getForumMessageTypeName().equals(ForumConstants.ForumMessageType_BLOG_ENTRY)) {
196            var iconControl = Session.getModelController(IconControl.class);
197            String forumThreadIconName = edit.getForumThreadIconName();
198
199            forumThreadIcon = iconControl.getIconByName(forumThreadIconName);
200
201            if(forumThreadIconName == null || forumThreadIcon != null) {
202                if(forumThreadIcon != null) {
203                    IconUsageType iconUsageType = iconControl.getIconUsageTypeByName(IconConstants.IconUsageType_FORUM_THREAD);
204                    IconUsage iconUsage = iconControl.getIconUsage(iconUsageType, forumThreadIcon);
205
206                    if(iconUsage == null) {
207                        addExecutionError(ExecutionErrors.UnknownIconUsage.name());
208                    }
209                }
210
211                if(!hasExecutionErrors()) {
212                    String forumMessageIconName = edit.getForumMessageIconName();
213
214                    forumMessageIcon = iconControl.getIconByName(forumMessageIconName);
215
216                    if(forumMessageIconName == null || forumMessageIcon != null) {
217                        if(forumMessageIcon != null) {
218                            IconUsageType iconUsageType = iconControl.getIconUsageTypeByName(IconConstants.IconUsageType_FORUM_MESSAGE);
219                            IconUsage iconUsage = iconControl.getIconUsage(iconUsageType, forumMessageIcon);
220
221                            if(iconUsage == null) {
222                                addExecutionError(ExecutionErrors.UnknownIconUsage.name());
223                            }
224                        }
225
226                        if(!hasExecutionErrors()) {
227                            String feedSummaryMimeTypeName = edit.getFeedSummaryMimeTypeName();
228                            String feedSummary = edit.getFeedSummary();
229                            int feedSummaryParameterCount = (feedSummaryMimeTypeName == null ? 0 : 1) + (feedSummary == null ? 0 : 1);
230
231                            if(feedSummaryParameterCount == 0 || feedSummaryParameterCount == 2) {
232                                var coreControl = getCoreControl();
233
234                                feedSummaryMimeType = feedSummaryMimeTypeName == null? null: coreControl.getMimeTypeByName(feedSummaryMimeTypeName);
235
236                                if(feedSummaryMimeTypeName == null || feedSummaryMimeType != null) {
237                                    Forum forum = forumControl.getDefaultForumForumThread(forumMessageDetail.getForumThread()).getForum();
238                                    ForumMimeType forumMimeType = feedSummaryMimeType == null? null: forumControl.getForumMimeType(forum, feedSummaryMimeType);
239
240                                    if(feedSummaryMimeType == null || forumMimeType != null) {
241                                        String summaryMimeTypeName = edit.getSummaryMimeTypeName();
242                                        String summary = edit.getSummary();
243                                        int summaryParameterCount = (summaryMimeTypeName == null ? 0 : 1) + (summary == null ? 0 : 1);
244
245                                        if(summaryParameterCount == 0 || summaryParameterCount == 2) {
246                                            summaryMimeType = summaryMimeTypeName == null? null: coreControl.getMimeTypeByName(summaryMimeTypeName);
247
248                                            if(summaryMimeTypeName == null || summaryMimeType != null) {
249                                                forumMimeType = summaryMimeType == null? null: forumControl.getForumMimeType(forum, summaryMimeType);
250
251                                                if(summaryMimeType == null || forumMimeType != null) {
252                                                    String contentMimeTypeName = edit.getContentMimeTypeName();
253
254                                                    contentMimeType = contentMimeTypeName == null? null: coreControl.getMimeTypeByName(contentMimeTypeName);
255
256                                                    if(contentMimeType != null) {
257                                                        forumMimeType = forumControl.getForumMimeType(forum, contentMimeType);
258
259                                                        if(forumMimeType == null) {
260                                                            addExecutionError(ExecutionErrors.UnknownForumMimeType.name());
261                                                        }
262                                                    } else {
263                                                        addExecutionError(ExecutionErrors.UnknownContentMimeTypeName.name(), contentMimeTypeName);
264                                                    }
265                                                } else {
266                                                    addExecutionError(ExecutionErrors.UnknownForumMimeType.name());
267                                                }
268                                            } else {
269                                                addExecutionError(ExecutionErrors.UnknownSummaryMimeTypeName.name(), summaryMimeTypeName);
270                                            }
271                                        } else {
272                                            addExecutionError(ExecutionErrors.InvalidParameterCount.name());
273                                        }
274                                    } else {
275                                        addExecutionError(ExecutionErrors.UnknownForumMimeType.name());
276                                    }
277                                } else {
278                                    addExecutionError(ExecutionErrors.UnknownFeedSummaryMimeTypeName.name(), feedSummaryMimeTypeName);
279                                }
280                            } else {
281                                addExecutionError(ExecutionErrors.InvalidParameterCount.name());
282                            }
283                        }
284                    } else {
285                        addExecutionError(ExecutionErrors.UnknownForumMessageIconName.name(), forumMessageIconName);
286                    }
287                }
288            } else {
289                addExecutionError(ExecutionErrors.UnknownForumThreadIconName.name(), forumThreadIconName);
290            }
291        } else {
292            addExecutionError(ExecutionErrors.InvalidForumMessageType.name());
293        }
294    }
295
296    @Override
297    public void doUpdate(ForumMessage forumMessage) {
298        var forumControl = Session.getModelController(ForumControl.class);
299        var partyPK = getPartyPK();
300        ForumMessageDetailValue forumMessageDetailValue = forumControl.getForumMessageDetailValueForUpdate(forumMessage);
301        ForumThreadDetailValue forumThreadDetailValue = forumControl.getForumThreadDetailValueForUpdate(forumMessage.getLastDetail().getForumThreadForUpdate());
302        Long postedTime = Long.valueOf(edit.getPostedTime());
303
304        if(forumMessageDetailValue.getPostedTime().equals(forumThreadDetailValue.getPostedTime())) {
305            forumThreadDetailValue.setPostedTime(postedTime);
306        }
307
308        forumThreadDetailValue.setIconPK(forumThreadIcon == null? null: forumThreadIcon.getPrimaryKey());
309        forumThreadDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder()));
310        forumControl.updateForumThreadFromValue(forumThreadDetailValue, partyPK);
311
312        forumMessageDetailValue.setIconPK(forumMessageIcon == null? null: forumMessageIcon.getPrimaryKey());
313        forumMessageDetailValue.setPostedTime(postedTime);
314        forumControl.updateForumMessageFromValue(forumMessageDetailValue, partyPK);
315
316        ForumMessagePartType forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE);
317        Language preferredLanguage = getPreferredLanguage();
318        ForumMessagePart forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
319        if(forumMessagePart != null) {
320            ForumStringMessagePartValue forumStringMessagePartValue = forumControl.getForumStringMessagePartValueForUpdate(forumMessagePart);
321
322            forumStringMessagePartValue.setString(edit.getTitle());
323
324            forumControl.updateForumStringMessagePartFromValue(forumStringMessagePartValue, partyPK);
325        }
326
327        forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_FEED_SUMMARY);
328        forumMessagePart = forumControl.getForumMessagePartForUpdate(forumMessage, forumMessagePartType, preferredLanguage);
329        if(forumMessagePart == null && feedSummaryMimeType != null) {
330            forumMessagePart = forumControl.createForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage, feedSummaryMimeType, partyPK);
331            forumControl.createForumClobMessagePart(forumMessagePart, edit.getFeedSummary(), partyPK);
332        } else if(forumMessagePart != null && feedSummaryMimeType == null) {
333            forumControl.deleteForumMessagePart(forumMessagePart, partyPK);
334        } else if(forumMessagePart != null && feedSummaryMimeType != null) {
335            ForumMessagePartDetailValue forumMessagePartValue = forumControl.getForumMessagePartDetailValueForUpdate(forumMessagePart);
336            ForumClobMessagePartValue forumClobMessagePartValue = forumControl.getForumClobMessagePartValueForUpdate(forumMessagePart);
337
338            forumMessagePartValue.setMimeTypePK(feedSummaryMimeType.getPrimaryKey());
339            forumClobMessagePartValue.setClob(edit.getFeedSummary());
340
341            forumControl.updateForumMessagePartFromValue(forumMessagePartValue, partyPK);
342            forumControl.updateForumClobMessagePartFromValue(forumClobMessagePartValue, partyPK);
343        }
344
345        forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_SUMMARY);
346        forumMessagePart = forumControl.getForumMessagePartForUpdate(forumMessage, forumMessagePartType, preferredLanguage);
347        if(forumMessagePart == null && summaryMimeType != null) {
348            forumMessagePart = forumControl.createForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage, summaryMimeType, partyPK);
349            forumControl.createForumClobMessagePart(forumMessagePart, edit.getSummary(), partyPK);
350        } else if(forumMessagePart != null && summaryMimeType == null) {
351            forumControl.deleteForumMessagePart(forumMessagePart, partyPK);
352        } else if(forumMessagePart != null && summaryMimeType != null) {
353            ForumMessagePartDetailValue forumMessagePartValue = forumControl.getForumMessagePartDetailValueForUpdate(forumMessagePart);
354            ForumClobMessagePartValue forumClobMessagePartValue = forumControl.getForumClobMessagePartValueForUpdate(forumMessagePart);
355
356            forumMessagePartValue.setMimeTypePK(summaryMimeType.getPrimaryKey());
357            forumClobMessagePartValue.setClob(edit.getSummary());
358
359            forumControl.updateForumMessagePartFromValue(forumMessagePartValue, partyPK);
360            forumControl.updateForumClobMessagePartFromValue(forumClobMessagePartValue, partyPK);
361        }
362
363        forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT);
364        forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage);
365        if(forumMessagePart != null) {
366            ForumMessagePartDetailValue forumMessagePartDetailValue = forumControl.getForumMessagePartDetailValueForUpdate(forumMessagePart);
367            ForumClobMessagePartValue forumClobMessagePartValue = forumControl.getForumClobMessagePartValueForUpdate(forumMessagePart);
368
369            forumMessagePartDetailValue.setMimeTypePK(contentMimeType.getPrimaryKey());
370            forumClobMessagePartValue.setClob(edit.getContent());
371
372            forumControl.updateForumMessagePartFromValue(forumMessagePartDetailValue, partyPK);
373            forumControl.updateForumClobMessagePartFromValue(forumClobMessagePartValue, partyPK);
374        }
375    }
376
377}