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.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.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 EditBlogCommentCommand 048 extends BaseAbstractEditCommand<ForumMessageSpec, BlogCommentEdit, EditBlogCommentResult, 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("PostedTime", FieldType.DATE_TIME, 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("ContentMimeTypeName", FieldType.MIME_TYPE, true, null, null), 063 new FieldDefinition("Content", FieldType.STRING, true, null, null) 064 )); 065 } 066 067 /** Creates a new instance of EditBlogCommentCommand */ 068 public EditBlogCommentCommand() { 069 super(null, SPEC_FIELD_DEFINITIONS, EDIT_FIELD_DEFINITIONS); 070 } 071 072 @Override 073 public EditBlogCommentResult getResult() { 074 return ForumResultFactory.getEditBlogCommentResult(); 075 } 076 077 @Override 078 public BlogCommentEdit getEdit() { 079 return ForumEditFactory.getBlogCommentEdit(); 080 } 081 082 @Override 083 public ForumMessage getEntity(EditBlogCommentResult result) { 084 var forumControl = Session.getModelController(ForumControl.class); 085 ForumMessage forumMessage; 086 var forumMessageName = spec.getForumMessageName(); 087 088 if(editMode.equals(EditMode.LOCK) || editMode.equals(EditMode.ABANDON)) { 089 forumMessage = forumControl.getForumMessageByName(forumMessageName); 090 } else { // EditMode.UPDATE 091 forumMessage = forumControl.getForumMessageByNameForUpdate(forumMessageName); 092 } 093 094 if(forumMessage == null) { 095 addExecutionError(ExecutionErrors.UnknownForumMessageName.name(), forumMessageName); 096 } 097 098 return forumMessage; 099 } 100 101 @Override 102 public ForumMessage getLockEntity(ForumMessage forumMessage) { 103 return forumMessage; 104 } 105 106 @Override 107 public void fillInResult(EditBlogCommentResult result, ForumMessage forumMessage) { 108 var forumControl = Session.getModelController(ForumControl.class); 109 110 result.setForumMessage(forumControl.getForumMessageTransfer(getUserVisit(), forumMessage)); 111 } 112 113 @Override 114 public void doLock(BlogCommentEdit edit, ForumMessage forumMessage) { 115 var forumControl = Session.getModelController(ForumControl.class); 116 var forumMessageDetail = forumMessage.getLastDetail(); 117 118 forumMessageIcon = forumMessageDetail.getIcon(); 119 120 edit.setForumMessageIconName(forumMessageIcon == null? null: forumMessageIcon.getLastDetail().getIconName()); 121 edit.setPostedTime(DateUtils.getInstance().formatTypicalDateTime(getUserVisit(), getPreferredDateTimeFormat(), forumMessageDetail.getPostedTime())); 122 123 var forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE); 124 var preferredLanguage = getPreferredLanguage(); 125 var forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 126 if(forumMessagePart != null) { 127 var forumStringMessagePart = forumControl.getForumStringMessagePart(forumMessagePart); 128 129 edit.setTitle(forumStringMessagePart.getString()); 130 } 131 132 forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT); 133 forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 134 if(forumMessagePart != null) { 135 var forumClobMessagePart = forumControl.getForumClobMessagePart(forumMessagePart); 136 137 edit.setContentMimeTypeName(forumMessagePart.getLastDetail().getMimeType().getLastDetail().getMimeTypeName()); 138 edit.setContent(forumClobMessagePart.getClob()); 139 } 140 } 141 142 Icon forumMessageIcon = null; 143 MimeType contentMimeType = null; 144 145 @Override 146 public void canUpdate(ForumMessage forumMessage) { 147 var forumControl = Session.getModelController(ForumControl.class); 148 var forumMessageDetail = forumMessage.getLastDetail(); 149 150 if(forumMessageDetail.getForumMessageType().getForumMessageTypeName().equals(ForumConstants.ForumMessageType_BLOG_COMMENT)) { 151 var iconControl = Session.getModelController(IconControl.class); 152 var forumMessageIconName = edit.getForumMessageIconName(); 153 154 forumMessageIcon = forumMessageIconName == null? null: iconControl.getIconByName(forumMessageIconName); 155 156 if(forumMessageIconName == null || forumMessageIcon != null) { 157 if(forumMessageIcon != null) { 158 var iconUsageType = iconControl.getIconUsageTypeByName(IconConstants.IconUsageType_FORUM_MESSAGE); 159 var iconUsage = iconControl.getIconUsage(iconUsageType, forumMessageIcon); 160 161 if(iconUsage == null) { 162 addExecutionError(ExecutionErrors.UnknownIconUsage.name()); 163 } 164 } 165 166 if(!hasExecutionErrors()) { 167 var mimeTypeControl = Session.getModelController(MimeTypeControl.class); 168 var contentMimeTypeName = edit.getContentMimeTypeName(); 169 170 contentMimeType = contentMimeTypeName == null? null: mimeTypeControl.getMimeTypeByName(contentMimeTypeName); 171 172 if(contentMimeType != null) { 173 var forum = forumControl.getDefaultForumForumThread(forumMessageDetail.getForumThread()).getForum(); 174 var forumMimeType = forumControl.getForumMimeType(forum, contentMimeType); 175 176 if(forumMimeType == null) { 177 addExecutionError(ExecutionErrors.UnknownForumMimeType.name()); 178 } 179 } else { 180 addExecutionError(ExecutionErrors.UnknownContentMimeTypeName.name(), contentMimeTypeName); 181 } 182 } 183 } else { 184 addExecutionError(ExecutionErrors.UnknownIconName.name(), forumMessageIconName); 185 } 186 } else { 187 addExecutionError(ExecutionErrors.InvalidForumMessageType.name()); 188 } 189 } 190 191 @Override 192 public void doUpdate(ForumMessage forumMessage) { 193 var forumControl = Session.getModelController(ForumControl.class); 194 var partyPK = getPartyPK(); 195 var forumMessageDetailValue = forumControl.getForumMessageDetailValueForUpdate(forumMessage); 196 197 forumMessageDetailValue.setIconPK(forumMessageIcon == null? null: forumMessageIcon.getPrimaryKey()); 198 forumMessageDetailValue.setPostedTime(Long.valueOf(edit.getPostedTime())); 199 200 forumControl.updateForumMessageFromValue(forumMessageDetailValue, partyPK); 201 202 var forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_TITLE); 203 var preferredLanguage = getPreferredLanguage(); 204 var forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 205 if(forumMessagePart != null) { 206 var forumStringMessagePartValue = forumControl.getForumStringMessagePartValueForUpdate(forumMessagePart); 207 208 forumStringMessagePartValue.setString(edit.getTitle()); 209 210 forumControl.updateForumStringMessagePartFromValue(forumStringMessagePartValue, partyPK); 211 } 212 213 forumMessagePartType = forumControl.getForumMessagePartTypeByName(ForumConstants.ForumMessagePartType_CONTENT); 214 forumMessagePart = forumControl.getForumMessagePart(forumMessage, forumMessagePartType, preferredLanguage); 215 if(forumMessagePart != null) { 216 var forumMessagePartDetailValue = forumControl.getForumMessagePartDetailValueForUpdate(forumMessagePart); 217 var forumClobMessagePartValue = forumControl.getForumClobMessagePartValueForUpdate(forumMessagePart); 218 219 forumMessagePartDetailValue.setMimeTypePK(contentMimeType.getPrimaryKey()); 220 forumClobMessagePartValue.setClob(edit.getContent()); 221 222 forumControl.updateForumMessagePartFromValue(forumMessagePartDetailValue, partyPK); 223 forumControl.updateForumClobMessagePartFromValue(forumClobMessagePartValue, partyPK); 224 } 225 } 226 227}