/*
* Adito
*
* Copyright (C) 2003-2006 3SP LTD. All Rights Reserved
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package com.adito.extensions.actions;
import java.io.InputStream;
import java.net.URLConnection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import com.adito.boot.Util;
import com.adito.core.BundleActionMessage;
import com.adito.core.CoreException;
import com.adito.core.CoreUtil;
import com.adito.core.GlobalWarning;
import com.adito.core.GlobalWarningManager;
import com.adito.core.RedirectWithMessages;
import com.adito.core.GlobalWarning.DismissType;
import com.adito.extensions.ExtensionBundle;
import com.adito.extensions.ExtensionUploadHandler;
import com.adito.extensions.ExtensionBundle.ExtensionBundleStatus;
import com.adito.extensions.forms.DefaultExtensionsForm;
import com.adito.extensions.store.ExtensionStore;
import com.adito.extensions.store.ExtensionStoreDescriptor;
import com.adito.policyframework.Permission;
import com.adito.policyframework.PolicyConstants;
import com.adito.policyframework.PolicyUtil;
import com.adito.properties.Property;
import com.adito.properties.impl.systemconfig.SystemConfigKey;
import com.adito.security.Constants;
import com.adito.security.SessionInfo;
import com.adito.table.actions.AbstractPagerAction;
import com.adito.vfs.UploadDetails;
public class DefaultExtensionsAction extends AbstractPagerAction {
final static Log log = LogFactory.getLog(DefaultExtensionsAction.class);
String extensionCategory = null;
public DefaultExtensionsAction(String extensionCategory) {
super(PolicyConstants.EXTENSIONS_RESOURCE_TYPE, new Permission[] { PolicyConstants.PERM_CHANGE });
this.extensionCategory = extensionCategory;
}
public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
return this.list(mapping, form, request, response);
}
public ActionForward list(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
DefaultExtensionsForm defaultExtensionForm = (DefaultExtensionsForm) form;
CoreUtil.clearFlow(request);
if (!ExtensionStore.STORE_PREF.getBoolean("warnedAboutExtensionStoreConnect", true)) {
if (request.getParameter("agree") != null) {
ExtensionStore.STORE_PREF.putBoolean("warnedAboutExtensionStoreConnect", true);
SessionInfo info = this.getSessionInfo(request);
Property.setProperty(new SystemConfigKey("updates.automaticallyConnectToApplicationStore"),
request.getParameter("agree"),
info);
} else {
return mapping.findForward("agreement");
}
}
try {
ExtensionStoreDescriptor storeDescriptor = ExtensionStore.getInstance()
.getDownloadableExtensionStoreDescriptor(request.getParameter("connect") != null || Property.getPropertyBoolean(new SystemConfigKey("updates.automaticallyConnectToApplicationStore")));
Util.noCache(response);
} catch (Exception e) {
}
defaultExtensionForm.initialise(request.getSession(), ExtensionStore.getInstance().getAllAvailableExtensionBundles(extensionCategory));
return null; // Return null because we are in a subform
}
public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
DefaultExtensionsForm defaultExtensionsForm = (DefaultExtensionsForm) form;
ExtensionStoreDescriptor storeDescriptor = null;
PolicyUtil.checkPermissions(PolicyConstants.EXTENSIONS_RESOURCE_TYPE, new Permission[] { PolicyConstants.PERM_CHANGE },
request);
ExtensionStore extensionStore = ExtensionStore.getInstance();
ActionMessages msgs = new ActionMessages();
try {
extensionStore.resetExtensionStoreUpdate();
storeDescriptor = extensionStore.getDownloadableExtensionStoreDescriptor(true, ExtensionStore.getWorkingVersion());
msgs.add(Globals.MESSAGE_KEY, new BundleActionMessage("extensions", "extensionStore.message.refreshed"));
saveMessages(request, msgs);
} catch (Exception e) {
log.error("Failed to refresh extension store.", e);
msgs.add(Globals.ERROR_KEY, new BundleActionMessage("extensions", "extensionStore.message.failedToRefresh", e
.getMessage()));
saveErrors(request, msgs);
}
defaultExtensionsForm.initialise(request.getSession(), ExtensionStore.getInstance().getAllAvailableExtensionBundles(extensionCategory));
return null; // Return null because we are in a subform
}
/**
* Upload an extension
*
* @param mapping mapping
* @param form form
* @param request request
* @param response response
* @return forward
* @throws Exception on any error
*/
public ActionForward upload(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
PolicyUtil.checkPermissions(PolicyConstants.EXTENSIONS_RESOURCE_TYPE,
new Permission[] { PolicyConstants.PERM_CHANGE },
request);
UploadDetails details = new UploadDetails("extensions",
ExtensionUploadHandler.TYPE_EXTENSION,
null,
mapping.findForward("list"),
null, // Keep this as NULL. We do not want to show Exit button here!
mapping.findForward("list"));
int id = CoreUtil.addUpload(request.getSession(), details);
request.setAttribute(Constants.REQ_ATTR_UPLOAD_DETAILS, new Integer(id));
return mapping.findForward("upload");
}
/**
* Remove selected extension
*
* @param mapping mapping
* @param form form
* @param request request
* @param response response
* @return forward
* @throws Exception on any error
*/
public ActionForward remove(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
PolicyUtil.checkPermission(PolicyConstants.EXTENSIONS_RESOURCE_TYPE,
PolicyConstants.PERM_CHANGE,
getSessionInfo(request).getUser());
String id = request.getParameter("id");
if (id == null || id.equals("")) {
throw new Exception("No id parameter supplied.");
}
ExtensionBundle bundle = ExtensionStore.getInstance().getExtensionBundle(id);
if (bundle == null) {
throw new Exception("No application with an id of " + id);
}
ExtensionStore.getInstance().removeExtensionBundle(bundle);
if (bundle.isContainsPlugin())
GlobalWarningManager.getInstance().addMultipleGlobalWarning(new GlobalWarning(GlobalWarning.MANAGEMENT_USERS, new BundleActionMessage("extensions",
"extensionStore.message.pluginRemovedRestartRequired"), DismissType.DISMISS_FOR_USER));
ActionMessages msgs = new ActionMessages();
msgs.add(Globals.MESSAGE_KEY, new ActionMessage("extensionStore.message.applicationRemoved", bundle.getName()));
saveMessages(request, msgs);
return new RedirectWithMessages(mapping.findForward("refresh"), request);
}
/**
* Install selected extension
*
* @param mapping mapping
* @param form form
* @param request request
* @param response response
* @return forward
* @throws Exception on any error
*/
public ActionForward install(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
String id = request.getParameter("id");
String version = request.getParameter("version");
PolicyUtil.checkPermission(PolicyConstants.EXTENSIONS_RESOURCE_TYPE,
PolicyConstants.PERM_CHANGE,
getSessionInfo(request).getUser());
ActionForward fwd = new RedirectWithMessages(mapping.findForward("refresh"), request);
URLConnection con = ExtensionStore.getInstance().downloadExtension(id, version);
try {
InputStream in = con.getInputStream();
ExtensionBundle bundle = ExtensionStore.getInstance().installExtensionFromStore(id, in, request, con.getContentLength());
ExtensionStore.getInstance().licenseCheck(bundle, request, fwd);
ExtensionStore.getInstance().postInstallExtension(bundle, request);
ActionMessages msgs = new ActionMessages();
msgs.add(Globals.MESSAGE_KEY, new ActionMessage("extensionStore.message.applicationInstalled", bundle.getName()));
saveMessages(request, msgs);
} catch (CoreException ce) {
ActionMessages errs = new ActionMessages();
errs.add(Globals.ERROR_KEY, ce.getBundleActionMessage());
saveErrors(request, errs);
}
return new RedirectWithMessages(mapping.findForward("refresh"), request);
}
/**
* Update selected extension
*
* @param mapping mapping
* @param form form
* @param request request
* @param response response
* @return forward
* @throws Exception on any error
*/
public ActionForward update(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
String id = request.getParameter("id");
String version = request.getParameter("version");
PolicyUtil.checkPermission(PolicyConstants.EXTENSIONS_RESOURCE_TYPE,
PolicyConstants.PERM_CHANGE,
getSessionInfo(request).getUser());
URLConnection con = ExtensionStore.getInstance().downloadExtension(id, version);
try {
InputStream in = con.getInputStream();
ExtensionBundle bundle = ExtensionStore.getInstance().updateExtension(id, in, request, con.getContentLength());
if (bundle.isContainsPlugin())
GlobalWarningManager.getInstance().addMultipleGlobalWarning(new GlobalWarning(GlobalWarning.MANAGEMENT_USERS, new BundleActionMessage("extensions",
"extensionStore.message.extensionUpdatedRestartRequired"), DismissType.DISMISS_FOR_USER));
ActionMessages msgs = new ActionMessages();
msgs.add(Globals.MESSAGE_KEY, new ActionMessage("extensionStore.message.applicationUpdated", bundle.getName()));
saveMessages(request, msgs);
} catch (CoreException ce) {
ActionMessages errs = new ActionMessages();
errs.add(Globals.ERROR_KEY, ce.getBundleActionMessage());
saveErrors(request, errs);
}
return new RedirectWithMessages(mapping.findForward("refresh"), request);
}
/**
* Start an extension. The 'id' request parameter must be supplied providing
* the extension bundle ID to stop.
*
* @param mapping mapping
* @param form form
* @param request request
* @param response response
* @return ActionForward forward
* @throws Exception on any error
*/
public ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
String id = request.getParameter("id");
PolicyUtil.checkPermission(PolicyConstants.EXTENSIONS_RESOURCE_TYPE,
PolicyConstants.PERM_CHANGE,
getSessionInfo(request).getUser());
ExtensionBundle bundle = ExtensionStore.getInstance().getExtensionBundle(id);
if (bundle.getStatus() == ExtensionBundleStatus.ENABLED) {
bundle.start();
}
if (bundle.getStatus() == ExtensionBundleStatus.STARTED) {
bundle.activate();
}
ActionMessages messages = new ActionMessages();
messages.add(Globals.MESSAGE_KEY, new ActionMessage("extensionStore.message.applicationDisable", bundle.getName()));
saveMessages(request, messages);
return mapping.findForward("list");
}
/**
* Stop an extension. The 'id' request parameter must be supplied providing
* the extension bundle ID to stop.
*
* @param mapping mapping
* @param form form
* @param request request
* @param response response
* @return ActionForward forward
* @throws Exception on any error
*/
public ActionForward stop(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
String id = request.getParameter("id");
PolicyUtil.checkPermission(PolicyConstants.EXTENSIONS_RESOURCE_TYPE,
PolicyConstants.PERM_CHANGE,
getSessionInfo(request).getUser());
ExtensionBundle bundle = ExtensionStore.getInstance().getExtensionBundle(id);
bundle.stop();
ActionMessages messages = new ActionMessages();
messages.add(Globals.MESSAGE_KEY, new ActionMessage("extensionStore.message.applicationDisable", bundle.getName()));
saveMessages(request, messages);
return mapping.findForward("list");
}
/**
* Disable an extension. The 'id' request parameter must be supplied
* providing the extension bundle ID to stop.
*
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
* @throws Exception
*/
public ActionForward disable(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
String id = request.getParameter("id");
PolicyUtil.checkPermission(PolicyConstants.EXTENSIONS_RESOURCE_TYPE,
PolicyConstants.PERM_CHANGE,
getSessionInfo(request).getUser());
ExtensionBundle bundle = ExtensionStore.getInstance().getExtensionBundle(id);
if (!bundle.canDisable()) {
throw new Exception("Bundle cannot be disabled.");
}
if (!bundle.isContainsPlugin()) {
bundle.stop();
}
ExtensionStore.getInstance().disableExtension(id);
if(bundle.isContainsPlugin()) {
GlobalWarningManager.getInstance().addMultipleGlobalWarning(new GlobalWarning(GlobalWarning.MANAGEMENT_USERS, new BundleActionMessage("extensions",
"extensionStore.message.stateChangeRestartRequired"), DismissType.DISMISS_FOR_USER));
}
ActionMessages messages = new ActionMessages();
messages.add(Globals.MESSAGE_KEY, new ActionMessage("extensionStore.message.applicationDisable", bundle.getName()));
saveMessages(request, messages);
return new RedirectWithMessages(mapping.findForward("list"), request);
}
/**
* Enable an extension. The 'id' request parameter must be supplied
* providing the extension bundle ID to stop.
*
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
* @throws Exception
*/
public ActionForward enable(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
String id = request.getParameter("id");
PolicyUtil.checkPermission(PolicyConstants.EXTENSIONS_RESOURCE_TYPE,
PolicyConstants.PERM_CHANGE,
getSessionInfo(request).getUser());
ExtensionBundle bundle = ExtensionStore.getInstance().getExtensionBundle(id);
if (!bundle.canEnable()) {
throw new Exception("Bundle cannot be enabled.");
}
ExtensionStore.getInstance().enableExtension(id);
if(bundle.isContainsPlugin()) {
GlobalWarningManager.getInstance().addMultipleGlobalWarning(new GlobalWarning(GlobalWarning.MANAGEMENT_USERS, new BundleActionMessage("extensions",
"extensionStore.message.stateChangeRestartRequired"), DismissType.DISMISS_FOR_USER));
} else {
bundle.activate();
}
ActionMessages messages = new ActionMessages();
messages.add(Globals.MESSAGE_KEY, new ActionMessage("extensionStore.message.applicationEnable", bundle.getName()));
saveMessages(request, messages);
return new RedirectWithMessages(mapping.findForward("list"), request);
}
/* (non-Javadoc)
* @see com.adito.core.actions.CoreAction#getNavigationContext(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public int getNavigationContext(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
return SessionInfo.MANAGEMENT_CONSOLE_CONTEXT;
}
}