org.apache.webapp.admin.context.SaveContextAction.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.webapp.admin.context.SaveContextAction.java

Source

/*
 * $Header: /home/cvs/jakarta-tomcat-catalina/webapps/admin/WEB-INF/classes/org/apache/webapp/admin/context/SaveContextAction.java,v 1.11 2003/05/27 23:11:25 amyroh Exp $
 * $Revision: 1.11 $
 * $Date: 2003/05/27 23:11:25 $
 *
 * ====================================================================
 *
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2001-2002 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution, if
 *    any, must include the following acknowlegement:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowlegement may appear in the software itself,
 *    if and wherever such third-party acknowlegements normally appear.
 *
 * 4. The names "The Jakarta Project", "Struts", and "Apache Software
 *    Foundation" must not be used to endorse or promote products derived
 *    from this software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache"
 *    nor may "Apache" appear in their names without prior written
 *    permission of the Apache Group.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 */

package org.apache.webapp.admin.context;

import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Locale;
import java.io.IOException;
import javax.management.Attribute;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.QueryExp;
import javax.management.Query;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.JMException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.modeler.Registry;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
import org.apache.webapp.admin.ApplicationServlet;
import org.apache.webapp.admin.TomcatTreeBuilder;
import org.apache.webapp.admin.TreeControl;
import org.apache.webapp.admin.TreeControlNode;

/**
 * The <code>Action</code> that completes <em>Add Context</em> and
 * <em>Edit Context</em> transactions.
 *
 * @author Manveen Kaur
 * @version $Revision: 1.11 $ $Date: 2003/05/27 23:11:25 $
 */

public final class SaveContextAction extends Action {

    // ----------------------------------------------------- Instance Variables

    /**
     * Signature for the <code>createStandardContext</code> operation.
     */
    private String createStandardContextTypes[] = { "java.lang.String", // parent
            "java.lang.String", // path
            "java.lang.String", // docBase
    };

    /**
      * Signature for the <code>createStandardLoader</code> operation.
      */
    private String createStandardLoaderTypes[] = { "java.lang.String", // parent
    };

    /**
      * Signature for the <code>createStandardManager</code> operation.
      */
    private String createStandardManagerTypes[] = { "java.lang.String", // parent
    };

    /**
     * Signature for the <code>removeContext</code> operation.
     */
    private String removeContextTypes[] = { "java.lang.String", // Object name
    };

    /**
     * The MBeanServer we will be interacting with.
     */
    private MBeanServer mBServer = null;

    /**
     * The MessageResources we will be retrieving messages from.
     */
    private MessageResources resources = null;

    // --------------------------------------------------------- Public Methods

    /**
     * Process the specified HTTP request, and create the corresponding HTTP
     * response (or forward to another web component that will create it).
     * Return an <code>ActionForward</code> instance describing where and how
     * control should be forwarded, or <code>null</code> if the response has
     * already been completed.
     *
     * @param mapping The ActionMapping used to select this instance
     * @param actionForm The optional ActionForm bean for this request (if any)
     * @param request The HTTP request we are processing
     * @param response The HTTP response we are creating
     *
     * @exception IOException if an input/output error occurs
     * @exception ServletException if a servlet exception occurs
     */
    public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws IOException, ServletException {

        // Acquire the resources that we need
        HttpSession session = request.getSession();
        Locale locale = (Locale) session.getAttribute(Action.LOCALE_KEY);
        if (resources == null) {
            resources = getServlet().getResources();
        }

        // Acquire a reference to the MBeanServer containing our MBeans
        try {
            mBServer = ((ApplicationServlet) getServlet()).getServer();
        } catch (Throwable t) {
            throw new ServletException("Cannot acquire MBeanServer reference", t);
        }

        // Identify the requested action
        ContextForm cform = (ContextForm) form;
        String adminAction = cform.getAdminAction();
        String cObjectName = cform.getObjectName();
        String lObjectName = cform.getLoaderObjectName();
        String mObjectName = cform.getManagerObjectName();
        if ((cform.getPath() == null) || (cform.getPath().length() < 1)) {
            cform.setPath("/");
        }

        // Perform a "Create Context" transaction (if requested)
        if ("Create".equals(adminAction)) {

            String operation = null;
            Object values[] = null;

            try {
                // get the parent host name
                String parentName = cform.getParentObjectName();
                ObjectName honame = new ObjectName(parentName);

                // Ensure that the requested context name is unique
                ObjectName oname = new ObjectName(honame.getDomain() + ":j2eeType=WebModule,name=//"
                        + honame.getKeyProperty("host") + cform.getPath() +
                        // FIXME set J2EEApplication and J2EEServer
                        ",J2EEApplication=none,J2EEServer=none");

                if (mBServer.isRegistered(oname)) {
                    ActionErrors errors = new ActionErrors();
                    errors.add("contextName", new ActionError("error.contextName.exists"));
                    saveErrors(request, errors);
                    return (new ActionForward(mapping.getInput()));
                }

                // Look up our MBeanFactory MBean
                ObjectName fname = TomcatTreeBuilder.getMBeanFactory();

                // Create a new StandardContext object
                values = new Object[3];
                values[0] = parentName;
                values[1] = cform.getPath();
                values[2] = cform.getDocBase();

                operation = "createStandardContext";
                cObjectName = (String) mBServer.invoke(fname, operation, values, createStandardContextTypes);
                // Create a new Loader object
                values = new String[1];
                // parent of loader is the newly created context
                values[0] = cObjectName.toString();
                operation = "createWebappLoader";
                lObjectName = (String) mBServer.invoke(fname, operation, values, createStandardLoaderTypes);

                // Create a new StandardManager object
                values = new String[1];
                // parent of manager is the newly created Context
                values[0] = cObjectName.toString();
                operation = "createStandardManager";
                mObjectName = (String) mBServer.invoke(fname, operation, values, createStandardManagerTypes);

                if (mObjectName == null) {
                    operation = "removeLoader";
                    values[0] = lObjectName;
                    mBServer.invoke(fname, operation, values, removeContextTypes);
                    operation = "removeContext";
                    values[0] = cObjectName;
                    mBServer.invoke(fname, operation, values, removeContextTypes);
                    Registry.getRegistry().unregisterComponent(new ObjectName(cObjectName));
                    request.setAttribute("warning", "error.context.directory");
                    return (mapping.findForward("Save Unsuccessful"));
                }

                // Add the new Context to our tree control node
                addToTreeControlNode(oname, cObjectName, parentName, resources, session);

            } catch (Exception e) {
                getServlet().log(resources.getMessage(locale, "users.error.invoke", operation), e);
                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                        resources.getMessage(locale, "users.error.invoke", operation));
                return (null);

            }

        }

        // Perform attribute updates as requested
        String attribute = null;
        try {

            ObjectName coname = new ObjectName(cObjectName);
            ObjectName loname = new ObjectName(lObjectName);
            ObjectName moname = new ObjectName(mObjectName);

            attribute = "debug";
            int debug = 0;
            try {
                debug = Integer.parseInt(cform.getDebugLvl());
            } catch (Throwable t) {
                debug = 0;
            }
            mBServer.setAttribute(coname, new Attribute("debug", new Integer(debug)));

            attribute = "path";
            String path = "";
            try {
                path = cform.getPath();
            } catch (Throwable t) {
                path = "";
            }
            mBServer.setAttribute(coname, new Attribute("path", path));

            attribute = "workDir";
            String workDir = "";
            workDir = cform.getWorkDir();
            if ((workDir != null) && (workDir.length() >= 1)) {
                mBServer.setAttribute(coname, new Attribute("workDir", workDir));
            }

            attribute = "cookies";
            String cookies = "false";
            try {
                cookies = cform.getCookies();
            } catch (Throwable t) {
                cookies = "false";
            }
            mBServer.setAttribute(coname, new Attribute("cookies", new Boolean(cookies)));

            attribute = "crossContext";
            String crossContext = "false";
            try {
                crossContext = cform.getCrossContext();
            } catch (Throwable t) {
                crossContext = "false";
            }
            mBServer.setAttribute(coname, new Attribute("crossContext", new Boolean(crossContext)));

            attribute = "override";
            String override = "false";
            try {
                override = cform.getOverride();
            } catch (Throwable t) {
                override = "false";
            }
            mBServer.setAttribute(coname, new Attribute("override", new Boolean(override)));

            attribute = "reloadable";
            String reloadable = "false";
            try {
                reloadable = cform.getReloadable();
            } catch (Throwable t) {
                reloadable = "false";
            }
            mBServer.setAttribute(coname, new Attribute("reloadable", new Boolean(reloadable)));

            attribute = "swallowOutput";
            String swallowOutput = "false";
            try {
                swallowOutput = cform.getSwallowOutput();
            } catch (Throwable t) {
                swallowOutput = "false";
            }
            mBServer.setAttribute(coname, new Attribute("swallowOutput", new Boolean(swallowOutput)));

            attribute = "useNaming";
            String useNaming = "false";
            try {
                useNaming = cform.getUseNaming();
            } catch (Throwable t) {
                useNaming = "false";
            }
            mBServer.setAttribute(coname, new Attribute("useNaming", new Boolean(useNaming)));

            // Loader properties            
            attribute = "reloadable";
            try {
                reloadable = cform.getLdrReloadable();
            } catch (Throwable t) {
                reloadable = "false";
            }
            mBServer.setAttribute(loname, new Attribute("reloadable", new Boolean(reloadable)));

            attribute = "debug";
            try {
                debug = Integer.parseInt(cform.getLdrDebugLvl());
            } catch (Throwable t) {
                debug = 0;
            }
            mBServer.setAttribute(loname, new Attribute("debug", new Integer(debug)));

            //attribute = "checkInterval";
            //int checkInterval = 15;
            //try {
            //    checkInterval = Integer.parseInt(cform.getLdrCheckInterval());
            //} catch (Throwable t) {
            //    checkInterval = 15;
            //}
            //mBServer.setAttribute(loname,
            //                      new Attribute("checkInterval", new Integer(checkInterval)));

            // Manager properties            
            attribute = "entropy";
            String entropy = cform.getMgrSessionIDInit();
            if ((entropy != null) && (entropy.length() >= 1)) {
                mBServer.setAttribute(moname, new Attribute("entropy", entropy));
            }

            attribute = "debug";
            try {
                debug = Integer.parseInt(cform.getMgrDebugLvl());
            } catch (Throwable t) {
                debug = 0;
            }
            mBServer.setAttribute(moname, new Attribute("debug", new Integer(debug)));

            //attribute = "checkInterval";
            //try {
            //    checkInterval = Integer.parseInt(cform.getMgrCheckInterval());
            //} catch (Throwable t) {
            //    checkInterval = 60;
            //}
            //mBServer.setAttribute(moname,
            //                      new Attribute("checkInterval", new Integer(checkInterval)));

            attribute = "maxActiveSessions";
            int maxActiveSessions = -1;
            try {
                maxActiveSessions = Integer.parseInt(cform.getMgrMaxSessions());
            } catch (Throwable t) {
                maxActiveSessions = -1;
            }
            mBServer.setAttribute(moname, new Attribute("maxActiveSessions", new Integer(maxActiveSessions)));

        } catch (Exception e) {

            getServlet().log(resources.getMessage(locale, "users.error.attribute.set", attribute), e);
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                    resources.getMessage(locale, "users.error.attribute.set", attribute));
            return (null);
        }

        // Forward to the success reporting page
        session.removeAttribute(mapping.getAttribute());
        return (mapping.findForward("Save Successful"));

    }

    /**
     * Append nodes for any define resources for the specified Context.
     *
     * @param containerNode Container node for the tree control
     * @param containerName Object name of the parent container
     * @param resources The MessageResources for our localized messages
     *  messages
     */
    public void addToTreeControlNode(ObjectName oname, String containerName, String parentName,
            MessageResources resources, HttpSession session) throws Exception {

        String domain = oname.getDomain();
        TreeControl control = (TreeControl) session.getAttribute("treeControlTest");
        if (control != null) {
            TreeControlNode parentNode = control.findNode(parentName);
            if (parentNode != null) {
                String type = "Context";
                String path = "";
                String host = "";
                String name = oname.getKeyProperty("name");
                if ((name != null) && (name.length() > 0)) {
                    name = name.substring(2);
                    int i = name.indexOf("/");
                    host = name.substring(0, i);
                    path = name.substring(i);
                }
                String nodeLabel = "Context (" + path + ")";
                String encodedName = URLEncoder.encode(oname.toString());
                TreeControlNode childNode = new TreeControlNode(oname.toString(), "Context.gif", nodeLabel,
                        "EditContext.do?select=" + encodedName, "content", true, domain);
                parentNode.addChild(childNode);

                // FIXME - force a redisplay
                TreeControlNode subtree = new TreeControlNode("Context Resource Administration " + containerName,
                        "folder_16_pad.gif", resources.getMessage("resources.treeBuilder.subtreeNode"), null,
                        "content", true, domain);
                childNode.addChild(subtree);
                TreeControlNode datasources = new TreeControlNode("Context Data Sources " + containerName,
                        "Datasource.gif", resources.getMessage("resources.treeBuilder.datasources"),
                        "resources/listDataSources.do?resourcetype=" + URLEncoder.encode(type) + "&path="
                                + URLEncoder.encode(path) + "&host=" + URLEncoder.encode(host) + "&forward="
                                + URLEncoder.encode("DataSources List Setup"),
                        "content", false, domain);
                TreeControlNode mailsessions = new TreeControlNode("Context Mail Sessions " + containerName,
                        "Mailsession.gif", resources.getMessage("resources.treeBuilder.mailsessions"),
                        "resources/listMailSessions.do?resourcetype=" + URLEncoder.encode(type) + "&path="
                                + URLEncoder.encode(path) + "&host=" + URLEncoder.encode(host) + "&forward="
                                + URLEncoder.encode("MailSessions List Setup"),
                        "content", false, domain);
                TreeControlNode resourcelinks = new TreeControlNode("Resource Links " + containerName,
                        "ResourceLink.gif", resources.getMessage("resources.treeBuilder.resourcelinks"),
                        "resources/listResourceLinks.do?resourcetype=" + URLEncoder.encode(type) + "&path="
                                + URLEncoder.encode(path) + "&host=" + URLEncoder.encode(host) + "&forward="
                                + URLEncoder.encode("ResourceLinks List Setup"),
                        "content", false, domain);
                TreeControlNode envs = new TreeControlNode("Context Environment Entries " + containerName,
                        "EnvironmentEntries.gif", resources.getMessage("resources.env.entries"),
                        "resources/listEnvEntries.do?resourcetype=" + URLEncoder.encode(type) + "&path="
                                + URLEncoder.encode(path) + "&host=" + URLEncoder.encode(host) + "&forward="
                                + URLEncoder.encode("EnvEntries List Setup"),
                        "content", false, domain);
                subtree.addChild(datasources);
                subtree.addChild(mailsessions);
                subtree.addChild(resourcelinks);
                subtree.addChild(envs);
            } else {
                getServlet().log("Cannot find parent node '" + parentName + "'");
            }
        } else {
            getServlet().log("Cannot find TreeControlNode!");
        }
    }

}