private void save(HttpServletRequest request, ModelAndView next, WikiPageInfo pageInfo) throws Exception { String topicName = JAMWikiServlet.getTopicFromRequest(request); String virtualWiki = JAMWikiServlet.getVirtualWikiFromURI(request); Topic topic = loadTopic(virtualWiki, topicName); TopicVersion lastTopicVersion = WikiBase.getHandler().lookupLastTopicVersion(virtualWiki, topicName); if (lastTopicVersion != null && lastTopicVersion.getTopicVersionId() != retrieveLastTopicVersionId(request, virtualWiki, topicName)) { // someone else has edited the topic more recently resolve(request, next, pageInfo); return; } String contents = request.getParameter("contents"); if (StringUtils.hasText(request.getParameter("section"))) { // load section of topic int section = (new Integer(request.getParameter("section"))).intValue(); ParserDocument parserDocument = Utilities.parseSplice(request, virtualWiki, topicName, section, contents); contents = parserDocument.getContent(); } if (contents == null) { logger.warning("The topic " + topicName + " has no content"); throw new WikiException(new WikiMessage("edit.exception.nocontent", topicName)); } if (lastTopicVersion != null && lastTopicVersion.getVersionContent().equals(contents)) { viewTopic(request, next, pageInfo, topicName); return; } // parse for signatures and other syntax that should not be saved in raw form WikiUser user = Utilities.currentUser(request); ParserInput parserInput = new ParserInput(); parserInput.setContext(request.getContextPath()); parserInput.setLocale(request.getLocale()); parserInput.setWikiUser(user); parserInput.setTopicName(topicName); parserInput.setUserIpAddress(request.getRemoteAddr()); parserInput.setVirtualWiki(virtualWiki); ParserDocument parserDocument = Utilities.parseSave(parserInput, contents); contents = parserDocument.getContent(); topic.setTopicContent(contents); if (StringUtils.hasText(parserDocument.getRedirect())) { // set up a redirect topic.setRedirectTo(parserDocument.getRedirect()); topic.setTopicType(Topic.TYPE_REDIRECT); } else if (topic.getTopicType() == Topic.TYPE_REDIRECT) { // no longer a redirect topic.setRedirectTo(null); topic.setTopicType(Topic.TYPE_ARTICLE); } TopicVersion topicVersion = new TopicVersion( user, request.getRemoteAddr(), request.getParameter("editComment"), contents); if (request.getParameter("minorEdit") != null) { topicVersion.setEditType(TopicVersion.EDIT_MINOR); } WikiBase.getHandler().writeTopic(topic, topicVersion, parserDocument); // a save request has been made JAMWikiServlet.removeCachedContents(); viewTopic(request, next, pageInfo, topicName); }