/* * Copyright 2008 Jeff Dwyer * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.apress.progwt.client.domain.commands; import java.io.Serializable; import com.allen_sauer.gwt.log.client.Log; import com.apress.progwt.client.domain.ForumPost; import com.apress.progwt.client.domain.User; import com.apress.progwt.client.domain.forum.ForumTopic; import com.apress.progwt.client.exception.SiteException; /** * Because this will reference many objects that are stored in the DB, we * need to do loads on all of those objects in order to ensure that we * don't get 'multiple obejcts in the session' errors from hibernate. * * Take care of those loads using the AbstractCommand pattern that we've * developed. * * If it's an edit, we need to be sure to copy over all important, * changable fields to the toSave object which we'll retrieve from the DB. * * @author Jeff Dwyer * */ public class SaveForumPostCommand extends AbstractCommand implements Serializable { private ForumPost forumPost; private long authorID; private long topicID = -1; private long threadID = -1; private ForumPost toSave; public SaveForumPostCommand() { } public SaveForumPostCommand(ForumPost forumPost) { super(forumPost, forumPost.getAuthor(), forumPost.getTopic(), forumPost.getThreadPost()); this.forumPost = forumPost; this.topicID = forumPost.getTopic().getId(); this.authorID = forumPost.getAuthor().getId(); if (forumPost.getThreadPost() != null) { this.threadID = forumPost.getThreadPost().getId(); } } @Override public String toString() { return "SaveForumPostCommand ForumPost " + forumPost; } public boolean haveYouSecuredYourselfAndFilteredUserInput() { return true; } public void execute(CommandService commandService) throws SiteException { User author = commandService.get(User.class, authorID); commandService.assertUserIsAuthenticated(author); ForumTopic loadedTopic = commandService.get(forumPost .getTopicClass(), topicID); ForumPost threadP = commandService.get(ForumPost.class, threadID); Log.debug("SaveForumPostCommand" + toString()); toSave = commandService.get(ForumPost.class, forumPost.getId()); // if it's a new creation, just use the one we wanted to save if (toSave == null) { toSave = forumPost; } else { // Post edit. Assert that this post is actually ours to edit commandService.assertUserIsAuthenticated(toSave.getAuthor()); } toSave.setAuthor(author); toSave.setTopic(loadedTopic); toSave.setThreadPost(threadP); toSave.setDate(forumPost.getDate()); toSave.setPostString(commandService.filterHTML(forumPost .getPostString())); toSave.setPostTitle(commandService.filterHTML(forumPost .getPostTitle())); // update the inverse side of the relationship if (threadP != null) { threadP.getReplies().add(toSave); } commandService.save(toSave); } /** * used in testing accessor * * @return */ public ForumPost getToSave() { return toSave; } }