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