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}