001: /**
002: * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, version 2.1, dated February 1999.
003: *
004: * This program is free software; you can redistribute it and/or modify
005: * it under the terms of the latest version of the GNU Lesser General
006: * Public License as published by the Free Software Foundation;
007: *
008: * This program is distributed in the hope that it will be useful,
009: * but WITHOUT ANY WARRANTY; without even the implied warranty of
010: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
011: * GNU Lesser General Public License for more details.
012: *
013: * You should have received a copy of the GNU Lesser General Public License
014: * along with this program (LICENSE.txt); if not, write to the Free Software
015: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
016: */package org.jamwiki.servlets;
017:
018: import java.util.Collection;
019: import java.util.Iterator;
020: import java.util.Vector;
021: import javax.servlet.http.HttpServletRequest;
022: import javax.servlet.http.HttpServletResponse;
023: import org.acegisecurity.context.SecurityContextHolder;
024: import org.apache.commons.lang.StringUtils;
025: import org.jamwiki.Environment;
026: import org.jamwiki.WikiBase;
027: import org.jamwiki.WikiException;
028: import org.jamwiki.WikiMessage;
029: import org.jamwiki.WikiVersion;
030: import org.jamwiki.authentication.JAMWikiAnonymousProcessingFilter;
031: import org.jamwiki.authentication.WikiUserAuth;
032: import org.jamwiki.db.DatabaseUpgrades;
033: import org.jamwiki.model.VirtualWiki;
034: import org.jamwiki.model.WikiUser;
035: import org.jamwiki.utils.LinkUtil;
036: import org.jamwiki.utils.WikiLink;
037: import org.jamwiki.utils.WikiLogger;
038: import org.jamwiki.utils.WikiUtil;
039: import org.springframework.web.servlet.ModelAndView;
040:
041: /**
042: * Used to automatically handle JAMWiki upgrades, including configuration and
043: * data modifications.
044: *
045: * @see org.jamwiki.servlets.SetupServlet
046: */
047: public class UpgradeServlet extends JAMWikiServlet {
048:
049: private static final WikiLogger logger = WikiLogger
050: .getLogger(UpgradeServlet.class.getName());
051: protected static final String JSP_UPGRADE = "upgrade.jsp";
052:
053: /**
054: * This method handles the request after its parent class receives control.
055: *
056: * @param request - Standard HttpServletRequest object.
057: * @param response - Standard HttpServletResponse object.
058: * @return A <code>ModelAndView</code> object to be handled by the rest of the Spring framework.
059: */
060: protected ModelAndView handleJAMWikiRequest(
061: HttpServletRequest request, HttpServletResponse response,
062: ModelAndView next, WikiPageInfo pageInfo) throws Exception {
063: if (!WikiUtil.isUpgrade()) {
064: throw new WikiException(new WikiMessage(
065: "upgrade.error.notrequired"));
066: }
067: String function = request.getParameter("function");
068: if (!StringUtils.isBlank(function)
069: && function.equals("upgrade")) {
070: upgrade(request, next, pageInfo);
071: } else {
072: view(request, next, pageInfo);
073: }
074: return next;
075: }
076:
077: /**
078: *
079: */
080: protected void initParams() {
081: this .layout = false;
082: this .displayJSP = "upgrade";
083: }
084:
085: /**
086: * Special login method - it cannot be assumed that the database schema
087: * is unchanged, so do not use standard methods.
088: */
089: private boolean login(HttpServletRequest request) throws Exception {
090: String password = request.getParameter("password");
091: String username = request.getParameter("username");
092: WikiUser user = null;
093: if (!WikiBase.getUserHandler().authenticate(username, password)) {
094: return false;
095: }
096: user = DatabaseUpgrades.getWikiUser(username);
097: return (user != null);
098: }
099:
100: /**
101: *
102: */
103: private void upgrade(HttpServletRequest request, ModelAndView next,
104: WikiPageInfo pageInfo) throws Exception {
105: if (!this .login(request)) {
106: next.addObject("error", new WikiMessage("error.login"));
107: pageInfo.setContentJsp(JSP_UPGRADE);
108: pageInfo.setSpecial(true);
109: pageInfo.setPageTitle(new WikiMessage("upgrade.title"));
110: return;
111: }
112: Vector messages = new Vector();
113: boolean success = true;
114: WikiVersion oldVersion = new WikiVersion(Environment
115: .getValue(Environment.PROP_BASE_WIKI_VERSION));
116: if (oldVersion.before(0, 4, 0)) {
117: messages.add(new WikiMessage("upgrade.error.oldversion",
118: WikiVersion.CURRENT_WIKI_VERSION, "0.4.0"));
119: success = false;
120: } else {
121: // first perform database upgrades
122: if (!Environment.getValue(
123: Environment.PROP_BASE_PERSISTENCE_TYPE).equals(
124: "FILE")) {
125: try {
126: if (oldVersion.before(0, 4, 2)) {
127: messages = DatabaseUpgrades
128: .upgrade042(messages);
129: }
130: if (oldVersion.before(0, 5, 0)) {
131: messages = DatabaseUpgrades
132: .upgrade050(messages);
133: }
134: if (oldVersion.before(0, 6, 0)) {
135: messages = DatabaseUpgrades
136: .upgrade060(messages);
137: }
138: if (oldVersion.before(0, 6, 1)) {
139: messages = DatabaseUpgrades
140: .upgrade061(messages);
141: }
142: if (oldVersion.before(0, 6, 3)) {
143: messages = DatabaseUpgrades
144: .upgrade063(messages);
145: }
146: } catch (Exception e) {
147: // FIXME - hard coding
148: String msg = "Unable to complete upgrade to new JAMWiki version.";
149: logger.severe(msg, e);
150: messages.add(msg + ": " + e.getMessage());
151: success = false;
152: }
153: }
154: // then perform other needed upgrades
155: boolean stylesheet = false;
156: if (oldVersion.before(0, 4, 2)) {
157: stylesheet = true;
158: }
159: if (oldVersion.before(0, 5, 1)) {
160: stylesheet = true;
161: }
162: if (oldVersion.before(0, 6, 0)) {
163: stylesheet = true;
164: }
165: if (oldVersion.before(0, 6, 1)) {
166: stylesheet = true;
167: }
168: if (oldVersion.before(0, 6, 2)) {
169: stylesheet = true;
170: }
171: if (oldVersion.before(0, 6, 3)) {
172: stylesheet = true;
173: }
174: if (stylesheet) {
175: // upgrade stylesheet
176: if (!upgradeStyleSheet(request, messages)) {
177: success = false;
178: }
179: }
180: Vector errors = ServletUtil
181: .validateSystemSettings(Environment.getInstance());
182: if (!errors.isEmpty()) {
183: next.addObject("errors", errors);
184: success = false;
185: }
186: }
187: if (success) {
188: Environment.setValue(Environment.PROP_BASE_WIKI_VERSION,
189: WikiVersion.CURRENT_WIKI_VERSION);
190: Environment.saveProperties();
191: // reset data handler and other instances. this probably hides a bug
192: // elsewhere since no reset should be needed, but it's anyone's guess
193: // where that might be...
194: WikiBase.reload();
195: VirtualWiki virtualWiki = WikiBase.getDataHandler()
196: .lookupVirtualWiki(WikiBase.DEFAULT_VWIKI);
197: WikiLink wikiLink = new WikiLink();
198: wikiLink.setDestination(virtualWiki.getDefaultTopicName());
199: String htmlLink = LinkUtil
200: .buildInternalLinkHtml(request.getContextPath(),
201: virtualWiki.getName(), wikiLink,
202: virtualWiki.getDefaultTopicName(), null,
203: null, true);
204: WikiMessage wm = new WikiMessage(
205: "upgrade.caption.upgradecomplete");
206: // do not escape the HTML link
207: wm.setParamsWithoutEscaping(new String[] { htmlLink });
208: next.addObject("message", wm);
209: // force logout to ensure current user will be re-validated. this is
210: // necessary because the upgrade may have changed underlying data structures.
211: SecurityContextHolder.clearContext();
212: // force group permissions to reset
213: WikiUserAuth.resetDefaultGroupRoles();
214: JAMWikiAnonymousProcessingFilter.reset();
215: } else {
216: next.addObject("error", new WikiMessage(
217: "upgrade.caption.upgradefailed"));
218: next.addObject("failure", "true");
219: }
220: next.addObject("messages", messages);
221: pageInfo.setContentJsp(JSP_UPGRADE);
222: pageInfo.setSpecial(true);
223: pageInfo.setPageTitle(new WikiMessage("upgrade.title"));
224: }
225:
226: /**
227: *
228: */
229: private boolean upgradeStyleSheet(HttpServletRequest request,
230: Vector messages) throws Exception {
231: try {
232: WikiUser user = ServletUtil.currentUser();
233: Collection virtualWikis = WikiBase.getDataHandler()
234: .getVirtualWikiList(null);
235: for (Iterator iterator = virtualWikis.iterator(); iterator
236: .hasNext();) {
237: VirtualWiki virtualWiki = (VirtualWiki) iterator.next();
238: WikiBase.getDataHandler().updateSpecialPage(
239: request.getLocale(), virtualWiki.getName(),
240: WikiBase.SPECIAL_PAGE_STYLESHEET, user,
241: ServletUtil.getIpAddress(request), null);
242: messages.add("Updated stylesheet for virtual wiki "
243: + virtualWiki.getName());
244: }
245: return true;
246: } catch (Exception e) {
247: // FIXME - hard coding
248: String msg = "Unable to complete upgrade to new JAMWiki version.";
249: logger.severe(msg, e);
250: messages.add(msg + ": " + e.getMessage());
251: return false;
252: }
253: }
254:
255: /**
256: *
257: */
258: private void view(HttpServletRequest request, ModelAndView next,
259: WikiPageInfo pageInfo) throws Exception {
260: WikiVersion oldVersion = new WikiVersion(Environment
261: .getValue(Environment.PROP_BASE_WIKI_VERSION));
262: if (oldVersion.before(0, 4, 0)) {
263: Vector errors = new Vector();
264: errors.add(new WikiMessage("upgrade.error.oldversion",
265: WikiVersion.CURRENT_WIKI_VERSION, "0.4.0"));
266: next.addObject("errors", errors);
267: }
268: pageInfo.setContentJsp(JSP_UPGRADE);
269: pageInfo.setSpecial(true);
270: pageInfo.setPageTitle(new WikiMessage("upgrade.title"));
271: }
272: }
|