/* Copyright (c) 2004 eInnovation Inc. All rights reserved This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. */ /* * Created on Feb 17, 2004 * * Updated by: Todd Fisher\Christopher Burke * Date: 6/27/2005 * Comments: updated updateProject to download and save install.xml and run ANT shell script */ package com.openedit.modules.update; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Element; import org.entermedia.email.PostMail; import org.entermedia.email.Recipient; import org.entermedia.email.TemplateWebEmail; import org.entermedia.upload.FileUpload; import org.entermedia.upload.FileUploadItem; import org.entermedia.upload.UploadRequest; import org.openedit.Data; import org.openedit.PlugIn; import org.openedit.data.Searcher; import org.openedit.entermedia.util.SyncFileDownloader; import org.openedit.util.DateStorageUtil; import org.openedit.util.WindowsUtil; import com.openedit.OpenEditException; import com.openedit.WebPageRequest; import com.openedit.config.Configuration; import com.openedit.entermedia.scripts.Script; import com.openedit.entermedia.scripts.ScriptLogger; import com.openedit.entermedia.scripts.ScriptManager; import com.openedit.hittracker.HitTracker; import com.openedit.modules.BaseModule; import com.openedit.modules.scriptrunner.ScriptModule; import com.openedit.page.Page; import com.openedit.page.PageProperty; import com.openedit.page.PageSettings; import com.openedit.users.Group; import com.openedit.users.User; import com.openedit.util.FileUtils; import com.openedit.util.OutputFiller; import com.openedit.util.PathUtilities; import com.openedit.util.XmlUtil; import com.openedit.util.ZipUtil; /** * This module allows users to update their version of OpenEdit. * * @author dbrown */ public class UpdateModule extends BaseModule { protected Map fieldPlugInFinders; protected PostMail fieldPostMail; protected ScriptManager fieldScriptManager; public ScriptManager getScriptManager() { if( fieldScriptManager == null) { fieldScriptManager = (ScriptManager)getModuleManager().getBean("scriptManager"); } return fieldScriptManager; } public void setScriptManager(ScriptManager inScriptManager) { fieldScriptManager = inScriptManager; } private static final Log log = LogFactory.getLog(UpdateModule.class); protected WindowsUtil fieldWindowsUtil; public WindowsUtil getWindowsUtil() { return fieldWindowsUtil; } public void setWindowsUtil(WindowsUtil inWindowsUtil) { fieldWindowsUtil = inWindowsUtil; } // public void listPageValues(WebPageRequest inReq) throws Exception { // List allModules = new ArrayList(); // // List sortedNames = new ArrayList(inReq.getPageMap().keySet()); // Collections.sort(sortedNames); // // for (int i = 0; i < sortedNames.size(); i++) { // // String name = (String) sortedNames.get(i); // Bean bean = new Bean(); // bean.setName(name); // Object obj = inReq.getPageValue(name); // // if (obj instanceof String) { // bean.setValue((String) obj); // } // // bean.setBeanDefinition(obj.getClass()); // allModules.add(bean); // } // // inReq.putPageValue("allPageValues", allModules); // } public List loadSiteList(WebPageRequest inReq) throws Exception { Page sites = getPageManager().getPage("/openedit/update/sites.xml"); Element root = new XmlUtil().getXml(sites.getReader(), sites.getCharacterEncoding()); List all = new ArrayList(); for (Iterator iter = root.elementIterator("site"); iter.hasNext();) { Element child = (Element) iter.next(); Site site = new Site(); site.setId(child.attributeValue("id")); site.setText(child.attributeValue("text")); site.setHref(child.attributeValue("href")); all.add(site); } List dirs = new ArrayList(); dirs.add("/"); List names = getPageManager().getChildrenNames("/"); for (Iterator iterator = names.iterator(); iterator.hasNext();) { String path = (String) iterator.next(); Page dir = getPageManager().getPage(path); if (dir.isFolder()) { dirs.add(path); } } inReq.putPageValue("dirs", dirs); inReq.putPageValue("sites", all); return all; } public Site selectSite(WebPageRequest inReq, Data inSync) throws Exception { String url = inSync.get("siteurl"); if (url == null) { return null; } Site selected = new Site(); selected.setHref(url); selected.setId(url); // set password if (selected != null) { String username = inSync.get("accountname"); String password = getUserManager().getUser(username).getPassword(); selected.setUsername(username); selected.setPassword(password); } inReq.putPageValue("sitetopush", selected); return selected; } // public void pushDirectory(WebPageRequest inReq) throws Exception { // Site toUpgrade = selectSite(inReq); // inReq.setRequestParameter("name", "pushed to " + toUpgrade.getId()); // File backup = backUpDirectory(inReq); // // String url = toUpgrade.getHref(); // if (!url.startsWith("http://")) { // url = "http://" + url; // } // // if (!url.endsWith("/")) { // url += "/"; // } // url += "openedit/update/receivepush.html"; // log.info("posting here:" + url); // // PostMethod postMethod = new PostMethod(url); // // Part[] parts = { new StringPart("username", toUpgrade.getUsername()), new // StringPart("password", toUpgrade.getPassword()), new // StringPart("savedas", backup.getName()), // new FilePart("file", backup) }; // // postMethod.setRequestEntity(new MultipartRequestEntity(parts, // postMethod.getParams())); // // HttpClient client = new HttpClient(); // // client.getHttpConnectionManager().getParams().setConnectionTimeout(0); // int statusCode1 = client.executeMethod(postMethod); // postMethod.releaseConnection(); // if (statusCode1 == 200) { // inReq.putPageValue("message", "Push is completed."); // } else { // inReq.putPageValue("message", "Status code: <b>" + statusCode1 + // "</b><br>" + postMethod.getResponseBodyAsString()); // } // } public File backUpDirectory(WebPageRequest inReq) throws Exception { Backup backup = new Backup(); for (Iterator iter = inReq.getCurrentAction().getConfig() .getChildIterator("exclude"); iter.hasNext();) { Configuration exclude = (Configuration) iter.next(); backup.addExclude(exclude.getValue()); } backup.setRoot(getRoot()); String subdir = inReq.getRequiredParameter("directory"); backup.setIncludePath(subdir); backup.setPageManager(getPageManager()); // String backupName = inReq.getRequiredParameter("name"); String backupName = inReq.getUserName() + subdir; File results = backup.backupCurrentSite(backupName); inReq.putPageValue("result", results); return results; } public List listVersions(WebPageRequest inReq) throws Exception { Backup backup = new Backup(); backup.setRoot(getRoot()); backup.setPageManager(getPageManager()); List versions = backup.listSiteVersions(); inReq.putPageValue("versionlist", versions); return versions; } public void restoreVersion(WebPageRequest inReq) throws Exception { String name = inReq.getRequestParameter("versionid"); if (name != null) { // check that we are logged in Backup backup = new Backup(); backup.setRoot(getRoot()); backup.setPageManager(getPageManager()); File version = backup.loadVersion(name); if (version == null) { log.error("No such backup found " + name); inReq.putPageValue("error", "No such file"); } else { backup.restoreBackup(version); } } else { log.error("No versionid parameter"); } } public void receivePush(WebPageRequest inReq) throws Exception { // this is an upload then a restore FileUpload command = new FileUpload(); command.setPageManager(getPageManager()); UploadRequest properties = command.parseArguments(inReq); if (properties == null) { log.error("Nothing posted"); return; } String username = inReq.getRequestParameter("username"); String password = inReq.getRequestParameter("password"); User admin = getUserManager().getUser(username); if (!getUserManager().authenticate(admin, password)) { throw new OpenEditException("Did not authenticate: " + username); } else { inReq.setUser(admin); } String id = (String) inReq.getRequestParameter("savedas"); if (id != null && id.length() > 0) { String path = "/WEB-INF/versions/" + id; Page page = properties.saveFirstFileAs(path, inReq.getUser()); if (page.exists() && page.getContentItem().getLength() > 5000) { // TODO: Make sure we can unzip it // backup // backUpDirectory(inReq); //Restore now keeps old copies in the // WEB-INF/trash directory inReq.setRequestParameter("versionid", id); restoreVersion(inReq); } else { log.error("Page did not save " + path); } } else { log.error("No ID found"); } } public void changeLayout(WebPageRequest inReq) throws Exception { checkLogin(inReq); String zip = inReq.getRequestParameter("ziplocation"); if (zip == null) { return; } URL url = new URL(zip); InputStream input = url.openStream(); // save to the tmp directory? String name = PathUtilities.extractPageName(zip); File tmp = File.createTempFile("layoutzip", name); OutputFiller filler = new OutputFiller(); FileOutputStream out = new FileOutputStream(tmp); filler.fill(input, out); out.close(); input.close(); // UNZIP ZipUtil ziputil = new ZipUtil(); File destination = new File(getRoot(), "/WEB-INF/base/layouts/"); destination.mkdirs(); ziputil.unzip(tmp, destination); // CHECK THE BASE // PageSettings settings = // getPageManager().getPageSettingsManager().getPageSettings("/layouts/_site.xconf"); // PageProperty fall = settings.getFieldProperty("fallbackdirectory"); // if( fall == null) // { // fall = new PageProperty("fallbackdirectory"); // fall.setValue("/WEB-INF/base/layouts"); // settings.putProperty(fall); // getPageManager().getPageSettingsManager().saveSetting(settings); // } // CHANGE LAYOUT PageSettings topsettings = getPageManager().getPageSettingsManager() .getPageSettings("/_site.xconf"); topsettings.setInnerLayout("/layouts/" + name + "/layout.html"); getPageManager().getPageSettingsManager().saveSetting(topsettings); inReq.putPageValue("layoutname", name); // reload the content page settings Page content = getPageManager().getPage( inReq.getContentPage().getPath(), true); inReq.getContentPage().setPageSettings(content.getPageSettings()); getPageManager().clearCache(); // TODO: Create the directory structure for them to change stuff } public void changeTheme(WebPageRequest inReq) throws Exception { checkLogin(inReq); String zip = inReq.getRequestParameter("ziplocation"); if (zip == null) { return; } URL url = new URL(zip); InputStream input = url.openStream(); // save to the tmp directory? String name = PathUtilities.extractPageName(zip); File tmp = File.createTempFile("layoutzip", name); OutputFiller filler = new OutputFiller(); FileOutputStream out = new FileOutputStream(tmp); filler.fill(input, out); out.close(); input.close(); // UNZIP ZipUtil ziputil = new ZipUtil(); File destination = new File(getRoot(), "/WEB-INF/base/themes/"); destination.mkdirs(); ziputil.unzip(tmp, destination); // CHANGE LAYOUT PageSettings topsettings = getPageManager().getPageSettingsManager() .getPageSettings("/_site.xconf"); // topsettings. topsettings.removeProperty("themeprefix"); PageProperty skin = new PageProperty("themeprefix"); skin.setValue("/themes/" + name); topsettings.putProperty(skin); topsettings.setInnerLayout("${themeprefix}/layouts/layout.html"); getPageManager().getPageSettingsManager().saveSetting(topsettings); inReq.putPageValue("layoutname", name); // reload the content page settings getPageManager().clearCache(); // Page content = // getPageManager().getPage(inReq.getContentPage().getPath(),true); // inReq.getContentPage().setPageSettings(content.getPageSettings()); new FileUtils().deleteAll(tmp); // TODO: Create the directory structure for them to change stuff inReq.redirect("/openedit/editors/themes/finished.html"); } public void listFilesInDirectory(WebPageRequest inReq) throws Exception { checkLogin(inReq); boolean relative = Boolean.parseBoolean(inReq .getRequestParameter("relative")); SyncToServer server = new SyncToServer(); server.setPageManager(getPageManager()); server.setRoot(getRoot()); // server.setRelativeSync(relative); String path = inReq.getRequestParameter("syncpath"); if (path == null) { throw new OpenEditException("syncpath is required"); } String[] excludes = inReq.getRequestParameters("exclude"); if (excludes != null && excludes.length > 0) { for (int i = 0; i < excludes.length; i++) { server.addExclude(excludes[i]); } } Map f = server.buildLocalFileMap(path); List files = new ArrayList(f.values()); inReq.putPageValue("fileitemlist", files); } public void downloadFiles(WebPageRequest inReq) throws Exception { checkLogin(inReq); // User passes a list of files to download and we make a zip file SyncToServer server = new SyncToServer(); server.setPageManager(getPageManager()); server.setRoot(getRoot()); // boolean relative = // Boolean.parseBoolean(inReq.getRequestParameter("relative")); // server.setRelativeSync(relative); // Make list of files String[] paths = inReq.getRequestParameters("file"); if (paths == null) { throw new OpenEditException("No files specified"); } List files = Arrays.asList(paths); server.getZipUtils().zipFiles(files, inReq.getOutputStream(), false); } public void saveSync(WebPageRequest inReq) { String applicationid = inReq.getRequestParameter("applicationid"); Searcher syncSearcher = getSearcherManager().getSearcher(applicationid, "sync"); String syncid = inReq.getRequestParameter("syncid"); Data existingsync = (Data) syncSearcher.searchById(syncid); if (existingsync == null) { existingsync = syncSearcher.createNewData(); } String username = inReq.getRequestParameter("accountname"); String siteurl = inReq.getRequestParameter("siteurl"); String exclude = inReq.getRequestParameter("exclude"); String syncpath = inReq.getRequestParameter("syncpath"); String name = inReq.getRequestParameter("name"); existingsync.setProperty("accountname", username); existingsync.setProperty("siteurl", siteurl); existingsync.setProperty("exclude", exclude); existingsync.setProperty("syncpath", syncpath); existingsync.setProperty("name", name); syncSearcher.saveData(existingsync, inReq.getUser()); saveSyncEvents(inReq); } public void saveSyncEvents(WebPageRequest inReq) { String applicationid = inReq.findValue("applicationid"); Searcher syncSearcher = getSearcherManager().getSearcher(applicationid, "sync"); for (Iterator iterator = syncSearcher.getAllHits().iterator(); iterator .hasNext();) { Data inSync = (Data) iterator.next(); String path = "/" + applicationid + "/events/" + inSync.get("id") + ".xconf"; Page page = getPageManager().getPage(path); if (!page.exists()) { String temppath = "/WEB-INF/base/entermedia/tools/sync/template.xconf"; Page template = getPageManager().getPage(temppath); List bar = template.getPageSettings().getFieldPathActions(); page.getPageSettings().setPathActions(bar); } List actions = page.getPageSettings().getFieldPathActions(); // PageSettings eventpage = null; // PageSettings eventpage = // getPageManager().getPageSettingsManager().getPageSettings(path); String nameval = page.getProperty("eventname"); if (nameval == null || !nameval.equals(inSync.get("name"))) { PageProperty nameprop = new PageProperty("eventname"); nameprop.setValue(inSync.get("name")); page.getPageSettings().putProperty(nameprop); } String syncidval = page.getProperty("syncid"); if (syncidval == null || !syncidval.equals(inSync.get("syncid"))) { PageProperty syncprop = new PageProperty("syncid"); syncprop.setValue(inSync.get("id")); page.getPageSettings().putProperty(syncprop); } /* * List pathactions = eventpage.getPathActions(); * if(pathactions.size() != 1) { PageAction action = new * PageAction("UpdateModule.syncToServer"); pathactions.add(action); * eventpage.setPathActions(pathactions); } */ getPageManager().saveSettings(page); getPageManager().clearCache(page); } } public void deleteSync(WebPageRequest inReq) { String applicationid = inReq.findValue("applicationid"); Searcher syncSearcher = getSearcherManager().getSearcher(applicationid, "sync"); String syncid = inReq.getRequestParameter("syncid"); if (syncid == null) { return; } Data sync = (Data) syncSearcher.searchById(syncid); String path = "/" + applicationid + "/events/" + sync.get("id") + ".xconf"; if (sync != null) { syncSearcher.delete(sync, inReq.getUser()); } // delete event Page page = getPageManager().getPage(path); getPageManager().removePage(page); } public void loadSync(WebPageRequest inReq) { String applicationid = inReq.findValue("applicationid"); Searcher syncSearcher = getSearcherManager().getSearcher(applicationid, "sync"); String syncid = inReq.findValue("syncid"); Data sync = (Data) syncSearcher.searchById(syncid); inReq.putPageValue("sync", sync); } public void loadSyncs(WebPageRequest inReq) { String applicationid = inReq.findValue("applicationid"); Searcher syncSearcher = getSearcherManager().getSearcher(applicationid, "sync"); HitTracker synchits = syncSearcher.getAllHits(); inReq.putPageValue("synclist", synchits); } public void syncToServer(WebPageRequest inReq) throws Exception { // get list for one directory at a time // process list recursively log.info("Starting syncronization"); boolean usenotification = Boolean.parseBoolean(inReq .findValue("sendnotifications")); try { SyncToServer server = new SyncToServer(); configureSync(inReq, server); server.syncFromServer(); } catch (Exception e) { if (usenotification) { notify(e.toString(), inReq); } throw (e); } if (usenotification) { notify("Sync completed successfully at: " + new Date().toString(), inReq); } } protected void configureSync(WebPageRequest inReq, SyncFileDownloader server) throws Exception { String applicationid = inReq.findValue("applicationid"); Searcher syncSearcher = getSearcherManager().getSearcher(applicationid, "sync"); String syncid = inReq.getPage().get("syncid"); Data sync = (Data) syncSearcher.searchById(syncid); log.info(sync.get("syncpath")); server.setRoot(getRoot()); for (Iterator iter = inReq.getCurrentAction().getConfig() .getChildIterator("exclude"); iter.hasNext();) { Configuration exclude = (Configuration) iter.next(); server.addExclude(exclude.getValue()); } String exlist = sync.get("exclude"); if (exlist != null) { String[] list = exlist.split(","); for (int i = 0; i < list.length; i++) { server.addExclude(list[i]); } } server.setPageManager(getPageManager()); Site toUpgrade = selectSite(inReq, sync); server.setUsername(toUpgrade.getUsername()); server.setPassword(toUpgrade.getPassword()); server.setServerUrl(toUpgrade.getHref()); // Backwards compatability String localPath = sync.get("syncpath"); server.setSyncPath(localPath); } // public void resetTimeStamps(WebPageRequest inReq) throws Exception { // // get list for one directory at a time // // process list recursively // SyncToServer server = new SyncToServer(); // configureSync( inReq, server ); // server.resetStamps(); // // } public void downloadMissing(WebPageRequest inReq) throws Exception { log.info("Starting download..."); log.info(inReq.getPath()); boolean usenotification = Boolean.parseBoolean(inReq .findValue("sendnotifications")); try { DownloadMissingFromServer server = new DownloadMissingFromServer(); configureSync(inReq, server); server.syncFromServer(); } catch (Exception e) { if (usenotification) { notify(e.toString(), inReq); } throw (e); } if (usenotification) { notify("Download completed successfully at: " + new Date().toString(), inReq); } } protected void checkLogin(WebPageRequest inReq) throws Exception { if (inReq.getUser() == null) { String username = inReq.getRequestParameter("accountname"); String password = inReq.getRequestParameter("password"); User admin = getUserManager().getUser(username); if (!getUserManager().authenticate(admin, password)) { throw new OpenEditException("Did not authenticate: " + username); } else { inReq.setUser(admin); } } } /** * This method should be removed. The normall email error handling should * send these out * * @param message * @param inReq * @throws Exception */ public void notify(String message, WebPageRequest inReq) throws Exception { log.info("sending notifications: " + message); TemplateWebEmail mailer = getPostMail().getTemplateWebEmail(); Page template = getPageManager().getPage( "/openedit/update/sync/syncnotification.html"); mailer.loadSettings(inReq.copy(template)); mailer.setMailTemplatePage(template); String subject = mailer.getWebPageContext().findValue("subject"); if (subject == null) { subject = "Sync notification"; } if (!template.exists()) { mailer.setAlternativeMessage("Sync Report \n" + message); } mailer.setSubject(subject); mailer.getWebPageContext().putPageValue("message", message); String from = mailer.getWebPageContext().findValue("from"); mailer.setFrom(from); if (mailer.getFrom() == null) { mailer.setFrom("support@openedit.org"); } Group notify = getUserManager().getGroup("notify"); if (notify != null) { Collection list = getUserManager().getUsersInGroup(notify); for (Iterator iter = list.iterator(); iter.hasNext();) { User user = (User) iter.next(); String email = user.getEmail(); if (email != null) { Recipient recipient = new Recipient(); recipient.setEmailAddress(email); recipient.setLastName(user.getLastName()); recipient.setFirstName(user.getFirstName()); mailer.setRecipient(recipient); mailer.getWebPageContext().putPageValue("sendto", user); mailer.send(); } } } } public PostMail getPostMail() { return fieldPostMail; } public void setPostMail(PostMail inPostMail) { fieldPostMail = inPostMail; } public void listPlugins(WebPageRequest inReq) throws Exception { List all = getPlugInFinder(inReq).getPlugIns(); inReq.putPageValue("sortedlist", all); HitTracker hits = getSearcherManager().getList("system","installedplugin"); Set installed = new HashSet(); for (Iterator iterator = hits.iterator(); iterator.hasNext();) { Data hit = (Data) iterator.next(); installed.add(hit.getId()); } inReq.putPageValue("installedids", installed); } public PlugIn loadPlugIn(WebPageRequest inReq) throws Exception { String pluginid = inReq.findValue("pluginid"); if (pluginid != null) { PlugIn found = getPlugInFinder(inReq).getPlugIn(pluginid); inReq.putPageValue("plugin", found); return found; } return null; } public void createNewApp(WebPageRequest inReq) throws Exception { String appfolder = inReq.findValue("appfolder"); appfolder = appfolder.replace('\\', '/'); if (!appfolder.startsWith("/")) { appfolder = "/" + appfolder; } if (!appfolder.endsWith("/")) { appfolder = appfolder + "/"; } String prefix = inReq.findValue("appfolderprefix"); if (prefix == null) { prefix = ""; } Page app = getPageManager().getPage(prefix + appfolder + "_site.xconf"); PageProperty prop = new PageProperty("fallbackdirectory"); PlugIn plugin = loadPlugIn(inReq); if (plugin != null) { prop.setValue(plugin.getBasePath().getPath()); } else { prop.setValue(inReq.findValue("fallbackfolder")); } app.getPageSettings().putProperty(prop); PageProperty catid = new PageProperty("catalogid"); String catalogid = appfolder; catalogid = catalogid.replace("/", ""); catid.setValue(catalogid); app.getPageSettings().putProperty(catid); getPageManager().saveSettings(app); inReq.putPageValue("newpath", appfolder); } // public void updateProject(WebPageRequest inContext) throws Exception { // checkLogin(inContext); // String strUrl = inContext.getRequestParameter("installscripturl"); // if (strUrl != null) { // // *** configure file path variable // String strOutputFile = "/WEB-INF/install.js"; // // // *** get root path of this object // String root = getRoot().getAbsolutePath(); // if (root.endsWith("/")) { // root = root.substring(0, root.length() - 1); // } // // // *** connect to configured web site // File out = new File(root, strOutputFile); // new Downloader().download(strUrl, out); // // ScriptModule module = (ScriptModule) getModule("Script"); // Map variables = new HashMap(); // variables.put("context", inContext); // List logs = new ArrayList(); // logs.add("Downloading latest upgrade script..."); // inContext.putPageValue("log", logs); // variables.put("log", logs); // try { // log.info("Upgrading " + strUrl); // module.execScript(variables, strOutputFile); // } catch (OpenEditException ex) { // inContext.putPageValue("exception", ex); // log.error(ex); // } // } // // Read in the output file? // // redirect the user to a blank page // } public void updateProjects(WebPageRequest inReq) throws Exception { checkLogin(inReq); if (inReq.getSessionValue("status") != null && !Boolean.parseBoolean(inReq .getRequestParameter("forceupgrade"))) { inReq.putPageValue("error", "Upgrade already in progress"); return; } Upgrader upgrader = getUpgrader(inReq); String[] toupdate = inReq.getRequestParameters("toupdate"); // *** get root path of this object if (upgrader == null || ((upgrader.isCanceled() || upgrader.isComplete()) && toupdate != null)) { String root = getRoot().getAbsolutePath(); if (root.endsWith("/")) { root = root.substring(0, root.length() - 1); } // loop over each project. Keep a log upgrader = new Upgrader(); upgrader.setPlugInFinder(getPlugInFinder(inReq)); upgrader.setRoot(getRoot()); if (toupdate == null) { inReq.putPageValue("error", "No upgrades specified"); return; } upgrader.setToUpgrade(toupdate); upgrader.setScriptModule((ScriptModule) getModule("Script")); String serverid = inReq.findValue("serverid"); inReq.putSessionValue("upgrader" + serverid, upgrader); inReq.putPageValue("upgrader", upgrader); //save these before the server crashes Searcher searcher = getSearcherManager().getSearcher("system", "installedplugin"); searcher.deleteAll(null); List all = new ArrayList(); for (int i = 0; i < toupdate.length; i++) { Data tosave = searcher.createNewData(); tosave.setId(toupdate[i]); tosave.setProperty("date", DateStorageUtil.getStorageUtil().formatForStorage(new Date())); all.add(tosave); } searcher.saveAllData(all, null); } } public void cancelUpdate(WebPageRequest inReq) { Upgrader up = getUpgrader(inReq); if (up != null) { up.cancel(); inReq.putPageValue("upgrader", up); } String serverid = inReq.getRequestParameter("serverid"); if (serverid == null) { serverid = "1"; } inReq.removeSessionValue("upgrader" + serverid); } private Upgrader getUpgrader(WebPageRequest inReq) { String serverid = inReq.getRequestParameter("serverid"); if (serverid == null) { serverid = "1"; } Upgrader upgrader = (Upgrader) inReq.getSessionValue("upgrader" + serverid); return upgrader; } public PlugInFinder getPlugInFinder(WebPageRequest inReq) { Searcher searcher = getSearcherManager().getSearcher("system", "extensionservers"); String serverid = inReq.getRequestParameter("serverid"); if (serverid == null) { serverid = "1"; } PlugInFinder finder = (PlugInFinder) getPluginFinders().get(serverid); if (finder == null) { Data data = (Data) searcher.searchById(serverid); String path = data.get("listingurl"); finder = (PlugInFinder) getModuleManager().getBean("plugInFinder"); finder.setAppServerPath(path); finder.setId(serverid); getPluginFinders().put(serverid, finder); } inReq.putPageValue("pluginfinder", finder); return finder; } protected Map getPluginFinders() { if (fieldPlugInFinders == null) { fieldPlugInFinders = new HashMap(); } return fieldPlugInFinders; } public void upgradeFromZip(WebPageRequest inReq) { FileUpload command = new FileUpload(); command.setPageManager(getPageManager()); UploadRequest properties = command.parseArguments(inReq); if (properties.getFirstItem() == null) { return; } FileUploadItem item = (FileUploadItem) properties.getFirstItem(); String name = item.getFieldName(); String path = "/WEB-INF/temp/" + item.getName(); properties.saveFileAs(item, path, inReq.getUser()); Page outputfolder = getPageManager().getPage("/WEB-INF/temp/upgrade/"); Page inputfile = getPageManager().getPage(path); try { ZipUtil util = new ZipUtil(); File in = new File(inputfile.getContentItem().getAbsolutePath()); File out = new File(outputfolder.getContentItem().getAbsolutePath()); util.unzip(in, out); Page scriptpage = getPageManager().getPage("/WEB-INF/temp/upgrade/etc/install.js"); if(!scriptpage.exists()){ scriptpage = getPageManager().getPage("/WEB-INF/temp/upgrade/etc/zipinstall.js"); } if (scriptpage.exists()) { Map variables = new HashMap(); variables.put("context", inReq); ScriptLogger logger = new ScriptLogger(); logger.startCapture(); variables.put("log", logger); Script script = getScriptManager().loadScript("/WEB-INF/temp/upgrade/etc/install.js"); getScriptManager().execScript(variables, script); } } catch (Exception e) { throw new OpenEditException(e); } finally { getPageManager().removePage(outputfolder); getPageManager().removePage(inputfile); } } }