@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void execute(MenuItemServiceCommand... commands) { indexTransactionService.startTransaction(); for (final MenuItemServiceCommand command : commands) { if (command instanceof RemoveContentsFromSectionCommand) { doExecuteRemoveContentsFromSectionCommand((RemoveContentsFromSectionCommand) command); } else if (command instanceof SetContentHomeCommand) { doExecuteSetContentHomeCommand((SetContentHomeCommand) command); } else if (command instanceof AddContentToSectionCommand) { doExecuteAddContentToSectionCommand((AddContentToSectionCommand) command); } else if (command instanceof ApproveContentInSectionCommand) { doExecuteApproveContentInSectionCommand((ApproveContentInSectionCommand) command); } else if (command instanceof ApproveContentsInSectionCommand) { doExecuteApproveContentsInSectionCommand((ApproveContentsInSectionCommand) command); } else if (command instanceof UnapproveContentsInSectionCommand) { doExecuteUnapproveContentsInSectionCommand((UnapproveContentsInSectionCommand) command); } else if (command instanceof OrderContentsInSectionCommand) { doExecuteOrderContentsInSectionCommand((OrderContentsInSectionCommand) command); } else { throw new UnsupportedOperationException( "Unsupported menu-item service command: " + command.getClass().getName()); } sectionContentDao.getHibernateTemplate().flush(); } }
private void doExecuteRemoveContentsFromSectionCommand( final RemoveContentsFromSectionCommand command) { Preconditions.checkNotNull(command.getSection(), "section cannot be null"); Preconditions.checkNotNull(command.getRemover(), "remover cannot be null"); Preconditions.checkNotNull(command.getContentsToRemove(), "content to remove cannot be null"); final UserEntity remover = userDao.findByKey(command.getRemover()); final MenuItemEntity section = doResolveSection(command.getSection()); final MenuItemAccessResolver menuItemAccessResolver = new MenuItemAccessResolver(groupDao); for (ContentKey contentKey : command.getContentsToRemove()) { final SectionContentEntity sectionContentToRemove = section.getSectionContent(contentKey); Preconditions.checkNotNull( sectionContentToRemove, "content in section (" + section.getKey() + ") not found: " + contentKey); final boolean contentIsApprovedInSection = sectionContentToRemove.isApproved(); if (contentIsApprovedInSection) { menuItemAccessResolver.checkAccessToUnapproveContentInSection( remover, section, "Cannot remove approved content from section."); } else { menuItemAccessResolver.checkAccessToRemoveUnapprovedContentFromSection( remover, section, "Cannot remove unapproved content from section."); } final ContentEntity content = contentDao.findByKey(contentKey); content.removeSectionContent(command.getSection()); sectionContentDao.getHibernateTemplate().flush(); sectionContentDao .getHibernateTemplate() .getSessionFactory() .evictCollection(MenuItemEntity.class.getName() + ".sectionContents", section.getKey()); removeContentHomeIfThisSectionIs(content, section); indexTransactionService.registerUpdate(content.getKey(), true); } }
private void doExecuteAddContentToSectionCommand(final AddContentToSectionCommand command) { Preconditions.checkNotNull(command, "a command is required"); Preconditions.checkNotNull( command.getContributor(), "the command's contributor argument is required"); Preconditions.checkNotNull(command.getContent(), "the command's content argument is required"); Preconditions.checkNotNull(command.getSection(), "the command's section argument is required"); if (!command.isApproveInSection()) { Preconditions.checkArgument( !command.isAddOnTop(), "no point in adding content to top when not approving"); } final ContentEntity content = contentDao.findByKey(command.getContent()); Preconditions.checkNotNull(content, "content does not exist: " + command.getContent()); Preconditions.checkArgument( !content.isDeleted(), "content is deleted: " + command.getContent()); final MenuItemEntity section = doResolveSection(command.getSection()); if (!section.isOrderedSection()) { Preconditions.checkArgument( command.getOrderContentsInSectionCommand() == null, "section is not ordered, did not expect to get order specified in command"); } final UserEntity contributor = doResolveUser(command.getContributor(), "contributor"); final MenuItemAccessResolver menuItemAccessResolver = new MenuItemAccessResolver(groupDao); menuItemAccessResolver.checkAccessToAddContentToSection( contributor, section, "Cannot add content in section."); if (command.isApproveInSection()) { menuItemAccessResolver.checkAccessToApproveContentInSection( contributor, section, "Cannot approve content in section."); } if (section.isSection() && section.hasSectionContentTypeFilter()) { if (!section.supportsSectionContentType(content.getCategory().getContentType())) { throw new ContentTypeNotSupportedException(content.getCategory().getContentType(), section); } } else if (section.getType() == MenuItemType.PAGE && section.getPage().getTemplate().getContentTypes().size() > 0) { if (!section .getPage() .getTemplate() .supportsContentType(content.getCategory().getContentType())) { throw new ContentTypeNotSupportedException(content.getCategory().getContentType(), section); } } final SectionContentEntity sectionContent = new SectionContentEntity(); sectionContent.setOrder(0); sectionContent.setContent(content); sectionContent.setMenuItem(section); sectionContent.setApproved(command.isApproveInSection()); sectionContent.setTimestamp(timeService.getNowAsDateTime().toDate()); if (command.isAddOnTop() && section.isOrderedSection()) { sectionContent.setOrder(resolveOrderValueForInsertOnTopOfApprovedContentInSection(section)); } content.addSectionContent(sectionContent); sectionContentDao.getHibernateTemplate().flush(); sectionContentDao .getHibernateTemplate() .getSessionFactory() .evictCollection(MenuItemEntity.class.getName() + ".sectionContents", section.getKey()); if (!content.hasHome(section.getSite().getKey())) { doSetContentHome(content, section, null); } if (section.isOrderedSection()) { if (command.getOrderContentsInSectionCommand() != null) { // ensure section will have it's newly added content sectionContentDao.getHibernateTemplate().refresh(section); List<ContentKey> wantedOrder = command.getOrderContentsInSectionCommand().getWantedOrder(); ContentsInSectionOrderer orderer = new ContentsInSectionOrderer(wantedOrder, section, ORDER_SPACE); orderer.order(); } } indexTransactionService.registerUpdate(command.getContent(), true); }