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