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.BlogCommentEdit; 020import com.echothree.control.user.forum.common.edit.ForumEditFactory; 021import com.echothree.control.user.forum.common.form.EditBlogCommentForm; 022import com.echothree.control.user.forum.common.result.EditBlogCommentResult; 023import com.echothree.control.user.forum.common.result.ForumResultFactory; 024import com.echothree.control.user.forum.common.spec.ForumMessageSpec; 025import com.echothree.model.control.forum.common.ForumConstants; 026import com.echothree.model.control.forum.server.control.ForumControl; 027import com.echothree.model.control.icon.common.IconConstants; 028import com.echothree.model.control.icon.server.control.IconControl; 029import com.echothree.model.data.core.server.entity.MimeType; 030import com.echothree.model.data.forum.server.entity.Forum; 031import com.echothree.model.data.forum.server.entity.ForumClobMessagePart; 032import com.echothree.model.data.forum.server.entity.ForumMessage; 033import com.echothree.model.data.forum.server.entity.ForumMessageDetail; 034import com.echothree.model.data.forum.server.entity.ForumMessagePart; 035import com.echothree.model.data.forum.server.entity.ForumMessagePartType; 036import com.echothree.model.data.forum.server.entity.ForumMimeType; 037import com.echothree.model.data.forum.server.entity.ForumStringMessagePart; 038import com.echothree.model.data.forum.server.value.ForumClobMessagePartValue; 039import com.echothree.model.data.forum.server.value.ForumMessageDetailValue; 040import com.echothree.model.data.forum.server.value.ForumMessagePartDetailValue; 041import com.echothree.model.data.forum.server.value.ForumStringMessagePartValue; 042import com.echothree.model.data.icon.server.entity.Icon; 043import com.echothree.model.data.icon.server.entity.IconUsage; 044import com.echothree.model.data.icon.server.entity.IconUsageType; 045import com.echothree.model.data.party.server.entity.Language; 046import com.echothree.model.data.user.common.pk.UserVisitPK; 047import com.echothree.util.common.message.ExecutionErrors; 048import com.echothree.util.common.validation.FieldDefinition; 049import com.echothree.util.common.validation.FieldType; 050import com.echothree.util.common.command.EditMode; 051import com.echothree.util.server.control.BaseAbstractEditCommand; 052import com.echothree.util.server.persistence.Session; 053import com.echothree.util.server.string.DateUtils; 054import java.util.Arrays; 055import java.util.Collections; 056import java.util.List; 057 058public class EditBlogCommentCommand 059 extends BaseAbstractEditCommand<ForumMessageSpec, BlogCommentEdit, EditBlogCommentResult, ForumMessage, ForumMessage> { 060 061 private final static List<FieldDefinition> SPEC_FIELD_DEFINITIONS; 062 private final static List<FieldDefinition> EDIT_FIELD_DEFINITIONS; 063 064 static { 065 SPEC_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 066 new FieldDefinition("ForumMessageName", FieldType.ENTITY_NAME, true, null, null) 067 )); 068 069 EDIT_FIELD_DEFINITIONS = Collections.unmodifiableList(Arrays.asList( 070 new FieldDefinition("PostedTime", FieldType.DATE_TIME, true, null, null), 071 new FieldDefinition("ForumMessageIconName", FieldType.ENTITY_NAME, false, null, null), 072 new FieldDefinition("Title", FieldType.STRING, true, 1L, 512L), 073 new FieldDefinition("ContentMimeTypeName", FieldType.MIME_TYPE, true, null, null), 074 new FieldDefinition("Content", FieldType.STRING, true, null, null) 075 )); 076 } 077 078 /** Creates a new instance of EditBlogCommentCommand */ 079 public EditBlogCommentCommand(UserVisitPK userVisitPK, EditBlogCommentForm form) { 080 super(userVisitPK, form, null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 081 } 082 083 @Override 084 public EditBlogCommentResult getResult() { 085 return ForumResultFactory.getEditBlogCommentResult(); 086 } 087 088 @Override 089 public BlogCommentEdit getEdit() { 090 return ForumEditFactory.getBlogCommentEdit(); 091 } 092 093 @Override 094 public ForumMessage getEntity(EditBlogCommentResult result) { 095 var forumControl = Session.getModelController(ForumControl.class); 096 ForumMessage forumMessage = null; 097 String forumMessageName = spec.getForumMessageName(); 098 099 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 100 forumMessage = forumControl.getForumMessageByName(forumMessageName); 101 } else { // EditMode.UPDATE 102 forumMessage = forumControl.getForumMessageByNameForUpdate(forumMessageName); 103 } 104 105 if(forumMessage == null) { 106 addExecutionError(ExecutionErrors.UnknownForumMessageName.name(), forumMessageName); 107 } 108 109 return forumMessage; 110 } 111 112 @Override 113 public ForumMessage getLockEntity(ForumMessage forumMessage) { 114 return forumMessage; 115 } 116 117 @Override 118 public void fillInResult(EditBlogCommentResult result, ForumMessage forumMessage) { 119 var forumControl = Session.getModelController(ForumControl.class); 120 121 result.setForumMessage(forumControl.getForumMessageTransfer(getUserVisit(), forumMessage)); 122 } 123 124 @Override 125 public void doLock(BlogCommentEdit edit, ForumMessage forumMessage) { 126 var forumControl = Session.getModelController(ForumControl.class); 127 ForumMessageDetail forumMessageDetail = forumMessage.getLastDetail(); 128 129 forumMessageIcon = forumMessageDetail.getIcon(); 130 131 edit.setForumMessageIconName(forumMessageIcon == null? null: forumMessageIcon.getLastDetail().getIconName()); 132 edit.setPostedTime(DateUtils.getInstance().formatTypicalDateTime(getUserVisit(), getPreferredDateTimeFormat(), forumMessageDetail.getPostedTime())); 133 134 ForumMessagePartType forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE); 135 Language preferredLanguage = getPreferredLanguage(); 136 ForumMessagePart forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 137 if(forumMessagePart != null) { 138 ForumStringMessagePart forumStringMessagePart = forumControl.getForumStringMessagePart(forumMessagePart); 139 140 edit.setTitle(forumStringMessagePart.getString()); 141 } 142 143 forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT); 144 forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 145 if(forumMessagePart != null) { 146 ForumClobMessagePart forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart); 147 148 edit.setContentMimeTypeName(forumMessagePart.getLastDetail().getMimeType().getLastDetail().getMimeTypeName()); 149 edit.setContent(forumClobMessagePart.getClob()); 150 } 151 } 152 153 Icon forumMessageIcon = null; 154 MimeType contentMimeType = null; 155 156 @Override 157 public void canUpdate(ForumMessage forumMessage) { 158 var forumControl = Session.getModelController(ForumControl.class); 159 ForumMessageDetail forumMessageDetail = forumMessage.getLastDetail(); 160 161 if(forumMessageDetail.getForumMessageType().getForumMessageTypeName().equals(ForumConstants.ForumMessageType_BLOG_COMMENT)) { 162 var iconControl = Session.getModelController(IconControl.class); 163 String forumMessageIconName = edit.getForumMessageIconName(); 164 165 forumMessageIcon = forumMessageIconName == null? null: iconControl.getIconByName(forumMessageIconName); 166 167 if(forumMessageIconName == null || forumMessageIcon != null) { 168 if(forumMessageIcon != null) { 169 IconUsageType iconUsageType = iconControl.getIconUsageTypeByName(IconConstants.IconUsageType_FORUM_MESSAGE); 170 IconUsage iconUsage = iconControl.getIconUsage(iconUsageType, forumMessageIcon); 171 172 if(iconUsage == null) { 173 addExecutionError(ExecutionErrors.UnknownIconUsage.name()); 174 } 175 } 176 177 if(!hasExecutionErrors()) { 178 var coreControl = getCoreControl(); 179 String contentMimeTypeName = edit.getContentMimeTypeName(); 180 181 contentMimeType = contentMimeTypeName == null? null: coreControl.getMimeTypeByName(contentMimeTypeName); 182 183 if(contentMimeType != null) { 184 Forum forum = forumControl.getDefaultForumForumThread(forumMessageDetail.getForumThread()).getForum(); 185 ForumMimeType forumMimeType = forumControl.getForumMimeType(forum, contentMimeType); 186 187 if(forumMimeType == null) { 188 addExecutionError(ExecutionErrors.UnknownForumMimeType.name()); 189 } 190 } else { 191 addExecutionError(ExecutionErrors.UnknownContentMimeTypeName.name(), contentMimeTypeName); 192 } 193 } 194 } else { 195 addExecutionError(ExecutionErrors.UnknownIconName.name(), forumMessageIconName); 196 } 197 } else { 198 addExecutionError(ExecutionErrors.InvalidForumMessageType.name()); 199 } 200 } 201 202 @Override 203 public void doUpdate(ForumMessage forumMessage) { 204 var forumControl = Session.getModelController(ForumControl.class); 205 var partyPK = getPartyPK(); 206 ForumMessageDetailValue forumMessageDetailValue = forumControl.getForumMessageDetailValueForUpdate(forumMessage); 207 208 forumMessageDetailValue.setIconPK(forumMessageIcon == null? null: forumMessageIcon.getPrimaryKey()); 209 forumMessageDetailValue.setPostedTime(Long.valueOf(edit.getPostedTime())); 210 211 forumControl.updateForumMessageFromValue(forumMessageDetailValue, partyPK); 212 213 ForumMessagePartType forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE); 214 Language preferredLanguage = getPreferredLanguage(); 215 ForumMessagePart forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 216 if(forumMessagePart != null) { 217 ForumStringMessagePartValue forumStringMessagePartValue = forumControl.getForumStringMessagePartValueForUpdate(forumMessagePart); 218 219 forumStringMessagePartValue.setString(edit.getTitle()); 220 221 forumControl.updateForumStringMessagePartFromValue(forumStringMessagePartValue, partyPK); 222 } 223 224 forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT); 225 forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 226 if(forumMessagePart != null) { 227 ForumMessagePartDetailValue forumMessagePartDetailValue = forumControl.getForumMessagePartDetailValueForUpdate(forumMessagePart); 228 ForumClobMessagePartValue forumClobMessagePartValue = forumControl.getForumClobMessagePartValueForUpdate(forumMessagePart); 229 230 forumMessagePartDetailValue.setMimeTypePK(contentMimeType.getPrimaryKey()); 231 forumClobMessagePartValue.setClob(edit.getContent()); 232 233 forumControl.updateForumMessagePartFromValue(forumMessagePartDetailValue, partyPK); 234 forumControl.updateForumClobMessagePartFromValue(forumClobMessagePartValue, partyPK); 235 } 236 } 237 238}