001// -------------------------------------------------------------------------------- 002// Copyright 2002-2025 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.Arrays; 042import java.util.Collections; 043import java.util.List; 044import javax.enterprise.context.RequestScoped; 045 046@RequestScoped 047public class EditBlogEntryCommand 048 extends BaseAbstractEditCommand<ForumMessageSpec, BlogEntryEdit, EditBlogEntryResult, ForumMessage, ForumMessage> { 049 050 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 051 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 052 053 static { 054 SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 055 new FieldDefinition("ForumMessageName", FieldType.ENTITY_NAME, true, null, null) 056 )); 057 058 EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 059 new FieldDefinition("ForumThreadIconName", FieldType.ENTITY_NAME, false, null, null), 060 new FieldDefinition("PostedTime", FieldType.DATE_TIME, true, null, null), 061 new FieldDefinition("SortOrder", FieldType.SIGNED_INTEGER, true, null, null), 062 new FieldDefinition("ForumMessageIconName", FieldType.ENTITY_NAME, false, null, null), 063 new FieldDefinition("Title", FieldType.STRING, true, 1L, 512L), 064 new FieldDefinition("FeedSummaryMimeTypeName", FieldType.MIME_TYPE, false, null, null), 065 new FieldDefinition("FeedSummary", FieldType.STRING, false, null, null), 066 new FieldDefinition("SummaryMimeTypeName", FieldType.MIME_TYPE, false, null, null), 067 new FieldDefinition("Summary", FieldType.STRING, false, null, null), 068 new FieldDefinition("ContentMimeTypeName", FieldType.MIME_TYPE, true, null, null), 069 new FieldDefinition("Content", FieldType.STRING, true, null, null) 070 )); 071 } 072 073 /** Creates a new instance of EditBlogEntryCommand */ 074 public EditBlogEntryCommand() { 075 super(null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 076 } 077 078 @Override 079 public EditBlogEntryResult getResult() { 080 return ForumResultFactory.getEditBlogEntryResult(); 081 } 082 083 @Override 084 public BlogEntryEdit getEdit() { 085 return ForumEditFactory.getBlogEntryEdit(); 086 } 087 088 @Override 089 public ForumMessage getEntity(EditBlogEntryResult result) { 090 var forumControl = Session.getModelController(ForumControl.class); 091 ForumMessage forumMessage; 092 var forumMessageName = spec.getForumMessageName(); 093 094 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 095 forumMessage = forumControl.getForumMessageByName(forumMessageName); 096 } else { // EditMode.UPDATE 097 forumMessage = forumControl.getForumMessageByNameForUpdate(forumMessageName); 098 } 099 100 if(forumMessage == null) { 101 addExecutionError(ExecutionErrors.UnknownForumMessageName.name(), forumMessageName); 102 } 103 104 return forumMessage; 105 } 106 107 @Override 108 public ForumMessage getLockEntity(ForumMessage forumMessage) { 109 return forumMessage; 110 } 111 112 @Override 113 public void fillInResult(EditBlogEntryResult result, ForumMessage forumMessage) { 114 var forumControl = Session.getModelController(ForumControl.class); 115 116 result.setForumMessage(forumControl.getForumMessageTransfer(getUserVisit(), forumMessage)); 117 } 118 119 @Override 120 public void doLock(BlogEntryEdit edit, ForumMessage forumMessage) { 121 var forumControl = Session.getModelController(ForumControl.class); 122 var forumMessageDetail = forumMessage.getLastDetail(); 123 var forumThreadDetail = forumMessageDetail.getForumThread().getLastDetail(); 124 125 forumThreadIcon = forumThreadDetail.getIcon(); 126 forumMessageIcon = forumMessageDetail.getIcon(); 127 128 edit.setForumThreadIconName(forumThreadIcon == null? null: forumThreadIcon.getLastDetail().getIconName()); 129 edit.setSortOrder(forumThreadDetail.getSortOrder().toString()); 130 edit.setForumMessageIconName(forumMessageIcon == null? null: forumMessageIcon.getLastDetail().getIconName()); 131 edit.setPostedTime(DateUtils.getInstance().formatTypicalDateTime(getUserVisit(), getPreferredDateTimeFormat(), forumMessageDetail.getPostedTime())); 132 133 var forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE); 134 var preferredLanguage = getPreferredLanguage(); 135 var forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 136 if(forumMessagePart != null) { 137 var forumStringMessagePart = forumControl.getForumStringMessagePart(forumMessagePart); 138 139 edit.setTitle(forumStringMessagePart.getString()); 140 } 141 142 forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_FEED_SUMMARY); 143 forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 144 if(forumMessagePart != null) { 145 var forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart); 146 147 edit.setFeedSummaryMimeTypeName(forumMessagePart.getLastDetail().getMimeType().getLastDetail().getMimeTypeName()); 148 edit.setFeedSummary(forumClobMessagePart.getClob()); 149 } 150 151 forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_SUMMARY); 152 forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 153 if(forumMessagePart != null) { 154 var forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart); 155 156 edit.setSummaryMimeTypeName(forumMessagePart.getLastDetail().getMimeType().getLastDetail().getMimeTypeName()); 157 edit.setSummary(forumClobMessagePart.getClob()); 158 } 159 160 forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT); 161 forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 162 if(forumMessagePart != null) { 163 var forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart); 164 165 edit.setContentMimeTypeName(forumMessagePart.getLastDetail().getMimeType().getLastDetail().getMimeTypeName()); 166 edit.setContent(forumClobMessagePart.getClob()); 167 } 168 } 169 170 Icon forumThreadIcon = null; 171 Icon forumMessageIcon = null; 172 MimeType feedSummaryMimeType = null; 173 MimeType summaryMimeType = null; 174 MimeType contentMimeType = null; 175 176 @Override 177 public void canUpdate(ForumMessage forumMessage) { 178 var forumControl = Session.getModelController(ForumControl.class); 179 var forumMessageDetail = forumMessage.getLastDetail(); 180 181 if(forumMessageDetail.getForumMessageType().getForumMessageTypeName().equals(ForumConstants.ForumMessageType_BLOG_ENTRY)) { 182 var iconControl = Session.getModelController(IconControl.class); 183 var forumThreadIconName = edit.getForumThreadIconName(); 184 185 forumThreadIcon = iconControl.getIconByName(forumThreadIconName); 186 187 if(forumThreadIconName == null || forumThreadIcon != null) { 188 if(forumThreadIcon != null) { 189 var iconUsageType = iconControl.getIconUsageTypeByName(IconConstants.IconUsageType_FORUM_THREAD); 190 var iconUsage = iconControl.getIconUsage(iconUsageType, forumThreadIcon); 191 192 if(iconUsage == null) { 193 addExecutionError(ExecutionErrors.UnknownIconUsage.name()); 194 } 195 } 196 197 if(!hasExecutionErrors()) { 198 var forumMessageIconName = edit.getForumMessageIconName(); 199 200 forumMessageIcon = iconControl.getIconByName(forumMessageIconName); 201 202 if(forumMessageIconName == null || forumMessageIcon != null) { 203 if(forumMessageIcon != null) { 204 var iconUsageType = iconControl.getIconUsageTypeByName(IconConstants.IconUsageType_FORUM_MESSAGE); 205 var iconUsage = iconControl.getIconUsage(iconUsageType, forumMessageIcon); 206 207 if(iconUsage == null) { 208 addExecutionError(ExecutionErrors.UnknownIconUsage.name()); 209 } 210 } 211 212 if(!hasExecutionErrors()) { 213 var feedSummaryMimeTypeName = edit.getFeedSummaryMimeTypeName(); 214 var feedSummary = edit.getFeedSummary(); 215 var feedSummaryParameterCount = (feedSummaryMimeTypeName == null ? 0 : 1) + (feedSummary == null ? 0 : 1); 216 217 if(feedSummaryParameterCount == 0 || feedSummaryParameterCount == 2) { 218 var mimeTypeControl = Session.getModelController(MimeTypeControl.class); 219 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 forumControl = Session.getModelController(ForumControl.class); 285 var partyPK = getPartyPK(); 286 var forumMessageDetailValue = forumControl.getForumMessageDetailValueForUpdate(forumMessage); 287 var forumThreadDetailValue = forumControl.getForumThreadDetailValueForUpdate(forumMessage.getLastDetail().getForumThreadForUpdate()); 288 var postedTime = Long.valueOf(edit.getPostedTime()); 289 290 if(forumMessageDetailValue.getPostedTime().equals(forumThreadDetailValue.getPostedTime())) { 291 forumThreadDetailValue.setPostedTime(postedTime); 292 } 293 294 forumThreadDetailValue.setIconPK(forumThreadIcon == null? null: forumThreadIcon.getPrimaryKey()); 295 forumThreadDetailValue.setSortOrder(Integer.valueOf(edit.getSortOrder())); 296 forumControl.updateForumThreadFromValue(forumThreadDetailValue, partyPK); 297 298 forumMessageDetailValue.setIconPK(forumMessageIcon == null? null: forumMessageIcon.getPrimaryKey()); 299 forumMessageDetailValue.setPostedTime(postedTime); 300 forumControl.updateForumMessageFromValue(forumMessageDetailValue, partyPK); 301 302 var forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE); 303 var preferredLanguage = getPreferredLanguage(); 304 var forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 305 if(forumMessagePart != null) { 306 var forumStringMessagePartValue = forumControl.getForumStringMessagePartValueForUpdate(forumMessagePart); 307 308 forumStringMessagePartValue.setString(edit.getTitle()); 309 310 forumControl.updateForumStringMessagePartFromValue(forumStringMessagePartValue, partyPK); 311 } 312 313 forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_FEED_SUMMARY); 314 forumMessagePart = forumControl.getForumMessagePartForUpdate(forumMessage, forumMessagePartType, preferredLanguage); 315 if(forumMessagePart == null && feedSummaryMimeType != null) { 316 forumMessagePart = forumControl.createForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage, feedSummaryMimeType, partyPK); 317 forumControl.createForumClobMessagePart(forumMessagePart, edit.getFeedSummary(), partyPK); 318 } else if(forumMessagePart != null && feedSummaryMimeType == null) { 319 forumControl.deleteForumMessagePart(forumMessagePart, partyPK); 320 } else if(forumMessagePart != null && feedSummaryMimeType != null) { 321 var forumMessagePartValue = forumControl.getForumMessagePartDetailValueForUpdate(forumMessagePart); 322 var forumClobMessagePartValue = forumControl.getForumClobMessagePartValueForUpdate(forumMessagePart); 323 324 forumMessagePartValue.setMimeTypePK(feedSummaryMimeType.getPrimaryKey()); 325 forumClobMessagePartValue.setClob(edit.getFeedSummary()); 326 327 forumControl.updateForumMessagePartFromValue(forumMessagePartValue, partyPK); 328 forumControl.updateForumClobMessagePartFromValue(forumClobMessagePartValue, partyPK); 329 } 330 331 forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_SUMMARY); 332 forumMessagePart = forumControl.getForumMessagePartForUpdate(forumMessage, forumMessagePartType, preferredLanguage); 333 if(forumMessagePart == null && summaryMimeType != null) { 334 forumMessagePart = forumControl.createForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage, summaryMimeType, partyPK); 335 forumControl.createForumClobMessagePart(forumMessagePart, edit.getSummary(), partyPK); 336 } else if(forumMessagePart != null && summaryMimeType == null) { 337 forumControl.deleteForumMessagePart(forumMessagePart, partyPK); 338 } else if(forumMessagePart != null && summaryMimeType != null) { 339 var forumMessagePartValue = forumControl.getForumMessagePartDetailValueForUpdate(forumMessagePart); 340 var forumClobMessagePartValue = forumControl.getForumClobMessagePartValueForUpdate(forumMessagePart); 341 342 forumMessagePartValue.setMimeTypePK(summaryMimeType.getPrimaryKey()); 343 forumClobMessagePartValue.setClob(edit.getSummary()); 344 345 forumControl.updateForumMessagePartFromValue(forumMessagePartValue, partyPK); 346 forumControl.updateForumClobMessagePartFromValue(forumClobMessagePartValue, partyPK); 347 } 348 349 forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT); 350 forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 351 if(forumMessagePart != null) { 352 var forumMessagePartDetailValue = forumControl.getForumMessagePartDetailValueForUpdate(forumMessagePart); 353 var forumClobMessagePartValue = forumControl.getForumClobMessagePartValueForUpdate(forumMessagePart); 354 355 forumMessagePartDetailValue.setMimeTypePK(contentMimeType.getPrimaryKey()); 356 forumClobMessagePartValue.setClob(edit.getContent()); 357 358 forumControl.updateForumMessagePartFromValue(forumMessagePartDetailValue, partyPK); 359 forumControl.updateForumClobMessagePartFromValue(forumClobMessagePartValue, partyPK); 360 } 361 } 362 363}