org.hyperic.hq.ui.util.DashboardUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.hyperic.hq.ui.util.DashboardUtils.java

Source

/*
 * NOTE: This copyright does *not* cover user programs that use HQ
 * program services by normal system calls through the application
 * program interfaces provided as part of the Hyperic Plug-in Development
 * Kit or the Hyperic Client Development Kit - this is merely considered
 * normal use of the program, and does *not* fall under the heading of
 * "derived work".
 * 
 * Copyright (C) [2004-2008], Hyperic, Inc.
 * This file is part of HQ.
 * 
 * HQ is free software; you can redistribute it and/or modify
 * it under the terms version 2 of the GNU General Public License as
 * published by the Free Software Foundation. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA.
 */

package org.hyperic.hq.ui.util;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperic.hq.appdef.shared.AppdefEntityID;
import org.hyperic.hq.appdef.shared.AppdefEntityNotFoundException;
import org.hyperic.hq.appdef.shared.AppdefResourceValue;
import org.hyperic.hq.appdef.shared.InvalidAppdefTypeException;
import org.hyperic.hq.auth.shared.SessionManager;
import org.hyperic.hq.auth.shared.SessionNotFoundException;
import org.hyperic.hq.auth.shared.SessionTimeoutException;
import org.hyperic.hq.authz.server.session.AuthzSubject;
import org.hyperic.hq.authz.shared.PermissionException;
import org.hyperic.hq.bizapp.shared.AppdefBoss;
import org.hyperic.hq.bizapp.shared.AuthzBoss;
import org.hyperic.hq.context.Bootstrap;
import org.hyperic.hq.ui.Constants;
import org.hyperic.hq.ui.WebUser;
import org.hyperic.hq.ui.server.session.DashboardConfig;
import org.hyperic.hq.ui.shared.DashboardManager;
import org.hyperic.util.StringUtil;
import org.hyperic.util.config.ConfigResponse;
import org.hyperic.util.config.InvalidOptionException;
import org.hyperic.util.config.InvalidOptionValueException;

/**
 * Utilities class that provides general convenience methods.
 */
public class DashboardUtils {
    public static final char MULTI_PORTLET_TOKEN = '_';
    public static final Log log = LogFactory.getLog(DashboardUtils.class.getName());

    public static List<AppdefResourceValue> listAsResources(List list, ServletContext ctx, WebUser user,
            AppdefBoss appdefBoss) throws Exception {
        List entityIds = listAsEntityIds(list);
        ArrayList<AppdefResourceValue> resources = new ArrayList<AppdefResourceValue>();
        for (Iterator i = entityIds.iterator(); i.hasNext();) {
            AppdefEntityID entityID = (AppdefEntityID) i.next();

            // Adding try/catch block as a safe guard to issue filed in [SUPPORT-5402]
            // Because of the existing logic, a pending resource list could contain a resource
            // that has since been deleted causing an AppdefEntityNotFound exception.  It wasn't being handled
            // before causing bad results in the UI, now we're catching and logging as it's non fatal.
            // TODO look at redesigning this logic. IMO transient state (which the pending resources list essentially is) 
            //      shouldn't be stored as a user preference...
            try {
                AppdefResourceValue resource = appdefBoss.findById(user.getSessionId().intValue(), entityID);

                resources.add(resource);
            } catch (AppdefEntityNotFoundException e) {
                // ...we have a pending appdef id that does not exist
                // log it, and remove it from the list
                log.warn("Appdef Id: " + entityID + " does not exist, so ignoring it.", e);
            }
        }

        return resources;
    }

    public static List<AppdefEntityID> listAsEntityIds(List list) {
        ArrayList resources = new ArrayList();
        Iterator i = list.iterator();

        while (i.hasNext()) {
            try {
                resources.add(new AppdefEntityID((String) i.next()));
            } catch (InvalidAppdefTypeException e) {
                // Skip resource
            }
        }

        return resources;
    }

    public static List preferencesAsEntityIds(String key, WebUser user) {
        try {
            List resourceList = user.getPreferenceAsList(key, Constants.DASHBOARD_DELIMITER);
            return listAsEntityIds(resourceList);
        } catch (InvalidOptionException e) {
            return new ArrayList(0);
        }
    }

    public static List<AppdefEntityID> preferencesAsEntityIds(String key, ConfigResponse userConfig) {
        try {
            List resourceList = userConfig.getPreferenceAsList(key, Constants.DASHBOARD_DELIMITER);
            return listAsEntityIds(resourceList);
        } catch (InvalidOptionException e) {
            return new ArrayList(0);
        }
    }

    // TODO: It doesn't look like this method is being used in the app.  May want 
    //       to yank it out or at least change the impl to call the other 
    //       removePortlet method below
    public static void removePortlet(WebUser user, String portlet)
            throws InvalidOptionException, InvalidOptionValueException {

        // Get list of portlets from first column...
        String portlets = user.getPreference(Constants.USER_PORTLETS_FIRST);
        // ...make sure there's something there before assigning a value...
        String first = (portlets != null) ? portlets + Constants.DASHBOARD_DELIMITER :
        // ...if portlet is null just assign the delimiter,
        //    otherwise, the dashboard will think it should assign defaults
                Constants.DASHBOARD_DELIMITER;
        // Do the same for portlets from second column...
        portlets = user.getPreference(Constants.USER_PORTLETS_SECOND);
        // ...don't forget to check before assigning
        String second = (portlets != null) ? portlets + Constants.DASHBOARD_DELIMITER
                : Constants.DASHBOARD_DELIMITER;

        first = StringUtil.remove(first, portlet + Constants.DASHBOARD_DELIMITER);
        second = StringUtil.remove(second, portlet + Constants.DASHBOARD_DELIMITER);

        first = StringUtil.replace(first, Constants.EMPTY_DELIMITER, Constants.DASHBOARD_DELIMITER);
        second = StringUtil.replace(second, Constants.EMPTY_DELIMITER, Constants.DASHBOARD_DELIMITER);

        user.setPreference(Constants.USER_PORTLETS_FIRST, first);
        user.setPreference(Constants.USER_PORTLETS_SECOND, second);

        // Need to clear out the preferences for multiple portlets
        int index;
        if ((index = portlet.lastIndexOf(MULTI_PORTLET_TOKEN)) > -1) {
            String token = portlet.substring(index);

            // If there are other portlets with the same token, then we can't
            // arbitrarily delete preferences
            if (first.indexOf(token) > -1 || second.indexOf(token) > -1) {
                return;
            }

            // Look through preferences for the token
            ConfigResponse prefs = user.getPreferences();
            String[] keys = (String[]) prefs.getKeys().toArray(new String[0]);
            for (int i = 0; i < keys.length; i++) {
                if (keys[i].indexOf(token) > -1) {
                    prefs.unsetValue(keys[i]);
                }
            }

            user.setPreferences(prefs);
        }
    }

    public static void removePortlet(ConfigResponse config, String portlet)
            throws InvalidOptionException, InvalidOptionValueException {

        // Get list of portlets from first column...
        String portlets = config.getValue(Constants.USER_PORTLETS_FIRST);
        // ...make sure there's something there before assigning a value...
        String first = (portlets != null) ? portlets + Constants.DASHBOARD_DELIMITER :
        // ...if portlet is null just assign the delimiter,
        //    otherwise, the dashboard will think it should assign defaults
                "";
        // Do the same for portlets from second column...
        portlets = config.getValue(Constants.USER_PORTLETS_SECOND);
        // ...don't forget to check before assigning
        String second = (portlets != null) ? portlets + Constants.DASHBOARD_DELIMITER : "";

        first = StringUtil.remove(first, portlet + Constants.DASHBOARD_DELIMITER);
        second = StringUtil.remove(second, portlet + Constants.DASHBOARD_DELIMITER);

        first = StringUtil.replace(first, Constants.EMPTY_DELIMITER, Constants.DASHBOARD_DELIMITER);
        second = StringUtil.replace(second, Constants.EMPTY_DELIMITER, Constants.DASHBOARD_DELIMITER);

        config.setValue(Constants.USER_PORTLETS_FIRST, first);
        config.setValue(Constants.USER_PORTLETS_SECOND, second);

        // Need to clear out the preferences for multiple portlets
        int index;
        if ((index = portlet.lastIndexOf(MULTI_PORTLET_TOKEN)) > -1) {
            String token = portlet.substring(index);

            // If there are other portlets with the same token, then we can't
            // arbitrarily delete preferences
            if (first.indexOf(token) > -1 || second.indexOf(token) > -1) {
                return;
            }

            // Look through preferences for the token
            String[] keys = (String[]) config.getKeys().toArray(new String[0]);
            for (int i = 0; i < keys.length; i++) {
                if (keys[i].indexOf(token) > -1) {
                    config.unsetValue(keys[i]);
                }
            }

        }
    }

    public static void removeResources(String[] ids, String key, WebUser user) throws Exception {
        String resources = user.getPreference(key);

        for (int i = 0; i < ids.length; i++) {
            String resource = ids[i];
            resources = StringUtil.remove(resources, resource);
            resources = StringUtil.replace(resources, Constants.EMPTY_DELIMITER, Constants.DASHBOARD_DELIMITER);
        }

        user.setPreference(key, resources);
    }

    public static void removeResources(String[] ids, String key, ConfigResponse userConfg) throws Exception {
        String resources = userConfg.getValue(key);

        for (int i = 0; i < ids.length; i++) {
            String resource = ids[i];
            resources = StringUtil.remove(resources, resource);
            resources = StringUtil.replace(resources, Constants.EMPTY_DELIMITER, Constants.DASHBOARD_DELIMITER);
        }

        userConfg.setValue(key, resources);
    }

    public static void verifyResources(String key, ServletContext ctx, ConfigResponse config, WebUser user,
            AppdefBoss appdefBoss, AuthzBoss authzBoss) throws Exception {
        List resourcelist = preferencesAsEntityIds(key, config);
        ArrayList toRemove = new ArrayList();
        for (Iterator i = resourcelist.iterator(); i.hasNext();) {
            AppdefEntityID entityID = (AppdefEntityID) i.next();
            try {
                appdefBoss.findById(user.getSessionId().intValue(), entityID);
            } catch (Exception e) {
                String entityid = entityID.getAppdefKey();
                toRemove.add(entityid);
            }
        }

        if (toRemove.size() > 0) {
            String[] ids = (String[]) toRemove.toArray(new String[0]);
            removeResources(ids, key, config);
            authzBoss.setUserPrefs(user.getSessionId(), user.getId(), user.getPreferences());
        }
    }

    public static void addEntityToPreferences(String key, WebUser user, AppdefEntityID newId, int max)
            throws Exception {
        List existing = preferencesAsEntityIds(key, user);
        for (Iterator it = existing.iterator(); it.hasNext();) {
            AppdefEntityID entityID = (AppdefEntityID) it.next();
            if (entityID.equals(newId))
                it.remove();
        }

        // Now add the new one
        existing.add(newId);
        if (max < Integer.MAX_VALUE && existing.size() > max)
            existing.remove(0);

        user.setPreference(key, StringUtil.listToString(existing, Constants.DASHBOARD_DELIMITER));
    }

    public static boolean addEntityToPreferences(String key, ConfigResponse userConfig, AppdefEntityID newId,
            int max) {
        List existing = preferencesAsEntityIds(key, userConfig);

        int lastIdx = existing.lastIndexOf(newId);
        if (existing.size() > 0 && lastIdx == (existing.size() - 1)) {
            return false; // Already the last one
        }

        // Now add the new one
        existing.add(newId);

        if (lastIdx > -1) {
            for (Iterator it = existing.iterator(); it.hasNext();) {
                AppdefEntityID entityID = (AppdefEntityID) it.next();
                if (entityID.equals(newId)) {
                    it.remove();
                    break;
                }
            }
        } else {
            if (max < Integer.MAX_VALUE && existing.size() > max)
                existing.remove(0);
        }

        userConfig.setValue(key, StringUtil.listToString(existing, Constants.DASHBOARD_DELIMITER));

        return true;
    }

    public static DashboardConfig findDashboard(ArrayList dashboardList, Integer id) {
        Iterator i = dashboardList.iterator();
        while (i.hasNext()) {
            DashboardConfig config = (DashboardConfig) i.next();
            if (config.getId().equals(id)) {
                return config;
            }
        }
        return null;
    }

    /**
     * Find the user's dashboard
     */
    public static ConfigResponse findUserDashboardConfig(WebUser user, DashboardManager dashboardManager,
            SessionManager sessionManager)
            throws SessionNotFoundException, SessionTimeoutException, PermissionException, RemoteException {
        AuthzSubject subj = sessionManager.getSubject(user.getSessionId());
        return dashboardManager.getUserDashboard(subj, subj).getConfig();
    }
}