Package org.jboss.dashboard.workspace

Source Code of org.jboss.dashboard.workspace.PanelsProvidersManagerImpl$PanelProviderComparator

/**
* Copyright (C) 2012 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*       http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.dashboard.workspace;

import org.jboss.dashboard.Application;
import org.jboss.dashboard.LocaleManager;
import org.jboss.dashboard.annotation.Priority;
import org.jboss.dashboard.annotation.Startable;
import org.jboss.dashboard.annotation.config.Config;
import org.jboss.dashboard.factory.Factory;
import org.jboss.dashboard.commons.io.DirectoriesScanner;
import org.jboss.dashboard.ui.panel.PanelDriver;
import org.jboss.dashboard.ui.panel.PanelProvider;
import org.jboss.dashboard.workspace.PanelsProvidersManager;
import org.jboss.dashboard.workspace.Workspace;
import org.jboss.dashboard.ui.panel.help.PanelHelp;
import org.jboss.dashboard.ui.panel.help.PanelHelpManager;
import org.apache.commons.lang.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;

/**
* Files based implementation for the PanelsProvidersManager interface.
* It reads the information about the installed providers by scanning all
* the properties files with the extension .panel in a given directory.
*/
@ApplicationScoped
@Named("panelsProvidersManager")
public class PanelsProvidersManagerImpl implements PanelsProvidersManager, Startable {

    private static transient Logger log = LoggerFactory.getLogger(PanelsProvidersManagerImpl.class.getName());

    @Inject @Config("WEB-INF/etc/panels")
    private String panelDriversDir;

    @Inject @Config("/panels/helpPage.jsp")
    private String helpModePage;

    @Inject @Config("navigation.sections_horiz," +
                    "navigation.workspace_vert," +
                    "navigation.workspace," +
                    "navigation.sections_vert," +
                    "navigation.language_horiz," +
                    "navigation.sections," +
                    "navigation.workspace_horiz," +
                    "navigation.bread_crumb," +
                    "navigation.tree_menu," +
                    "navigation.logout," +
                    "dashboard.html_editor," +
                    "dashboard.data_provider_management," +
                    "dashboard.filter," +
                    "dashboard.kpi," +
                    "dashboard.export," +
                    "system.workspace_import_export," +
                    "system.data_source_manager")
    private String[] basePanelsIds;

    @Inject @Config("")
    private String[] deprecatedPanelsIds;

    @Inject @Config("panels/thumbnails/defaultProviderThumbnail.png")
    private String defaultProviderThumbnail;

    @Inject @Config("panels/groups/defaultProviderGroup.png")
    private String defaultProviderGroupThumbnail;

    @Inject @Config("panel_group_navigation=panels/groups/navigation.png," +
                    "panel_group_contents=panels/groups/contents.png")
    private Map<String,String> providerGroupImg = new HashMap<String,String>();

    @Inject
    private PanelHelpManager panelHelpManager;

    private Map<String,PanelProvider> panels = new HashMap<String,PanelProvider>();

    public Priority getPriority() {
        return Priority.HIGH;
    }

    public void start() throws Exception {
        log.debug("Start");

        if (getPanelDriversDir() == null) {
            throw new Exception("Parameter 'panelsDriversDir' not set");
        }
        String dir = Application.lookup().getBaseAppDirectory() + "/" + getPanelDriversDir();

        File fdir = new File(dir);
        log.info("Loading panels. Scanning dir: " + fdir.getCanonicalPath());

        DirectoriesScanner scanner = new DirectoriesScanner("panel");
        File[] files = scanner.findFiles(fdir);

        for (int i = 0; i < files.length; i++) {
            File f = files[i];

            log.info("Reading file: " + f);

            PanelProvider p = null;
            try {
                p = loadPanelProvider(f);
                p.initialize();
            } catch (Exception e) {
                log.error("Error loading panel from file " + f, e);
            }
            if (p != null) {
                panels.put(p.getId(), p);
            } else {
                log.error("File format is not valid: " + f);
            }
        }

        DirectoriesScanner scannerHelp = new DirectoriesScanner("phelp");
        File[] helpFiles = scannerHelp.findFiles(fdir);
        for (int i = 0; i < helpFiles.length; i++) {
            File helpFile = helpFiles[i];
            PanelHelp pHelp = null;
            try {
                pHelp = loadHelpFile(helpFile);
            } catch (IOException e) {
                log.error("Error loading help file:", e);
            } catch (SAXException e) {
                log.error("Error loading help file:", e);
            }
            if (pHelp != null) {
                String[] ids = pHelp.getIds();
                for (int j = 0; j < ids.length; j++) {
                    String id = ids[j];
                    PanelProvider provider = getProvider(id);
                    if (provider != null) {
                        provider.setPanelHelp(pHelp);
                    } else {
                        log.error("Invalid panel provider id " + id + " in help file: " + helpFile);
                    }
                }
            } else {
                log.error("Invalid help file: " + helpFile);
            }
        }
    }

    public String[] getDeprecatedPanelsIds() {
        return deprecatedPanelsIds;
    }

    public void setDeprecatedPanelsIds(String[] deprecatedPanelsIds) {
        this.deprecatedPanelsIds = deprecatedPanelsIds;
    }

    public String[] getBasePanelsIds() {
        return basePanelsIds;
    }

    public void setBasePanelsIds(String[] basePanelsIds) {
        this.basePanelsIds = basePanelsIds;
    }

    public String getPanelDriversDir() {
        return panelDriversDir;
    }

    public void setPanelDriversDir(String panelDriversDir) {
        this.panelDriversDir = panelDriversDir;
    }

    public String getHelpModePage() {
        return helpModePage;
    }

    public void setHelpModePage(String helpModePage) {
        this.helpModePage = helpModePage;
    }

    public String getDefaultProviderThumbnail() {
        return defaultProviderThumbnail;
    }

    public void setDefaultProviderThumbnail(String defaultProviderThumbnail) {
        this.defaultProviderThumbnail = defaultProviderThumbnail;
    }

    public String getDefaultProviderGroupThumbnail() {
        return defaultProviderGroupThumbnail;
    }

    public void setDefaultProviderGroupThumbnail(String defaultProviderGroupThumbnail) {
        this.defaultProviderGroupThumbnail = defaultProviderGroupThumbnail;
    }

    public Map getProviderGroupImg() {
        if (providerGroupImg == null)
            providerGroupImg = new HashMap();
        return providerGroupImg;
    }

    public void setProviderGroupImg(Map providerGroupImg) {
        this.providerGroupImg = providerGroupImg;
    }

    /**
     * Returns all providers, sorted by description
     *
     * @return
     */
    public PanelProvider[] getProviders() {
        return getProviders(null);
    }

    /**
     * Returns all panels providers installed in the system allowed for given workspace
     *
     * @param workspace Workspace that allows returned providers.
     */
    public PanelProvider[] getProviders(Workspace workspace) {
        HashSet panelProviders = new HashSet();
        for (Iterator it = panels.values().iterator(); it.hasNext();) {
            PanelProvider p = (PanelProvider) it.next();
            if (!p.isEnabled()) continue;
            if (workspace != null && !workspace.isProviderAllowed(p.getId()) && !workspace.isProviderAllowed("*"))
                continue;
            panelProviders.add(p);
        }
        PanelProvider[] p = (PanelProvider[]) panelProviders.toArray(new PanelProvider[panels.size()]);
        // Sort providers by description (just for display purpouses)
        Arrays.sort(p, new PanelProviderComparator());
        return p;
    }

    /**
     * Returns all providers groups
     *
     * @return
     */
    public String[] enumerateProvidersGroups() {
        return enumerateProvidersGroups(null);
    }

    /**
     * Enumerates all existing groups of providers containing panel Instances allowed by given workspace
     *
     * @param workspace Workspace that allows returned providers.
     * @return
     */
    public String[] enumerateProvidersGroups(Workspace workspace) {
        Set groups = new HashSet();
        for (Iterator iterator = panels.values().iterator(); iterator.hasNext();) {
            PanelProvider panelProvider = (PanelProvider) iterator.next();
            if (workspace != null && !workspace.isProviderAllowed(panelProvider.getId()) && !workspace.isProviderAllowed("*"))
                continue;
            if (panelProvider.isEnabled() && panelProvider.getGroup() != null) {
                groups.add(panelProvider.getGroup());
            }
        }
        return (String[]) groups.toArray(new String[groups.size()]);
    }

    /**
     * Returns group display name
     *
     * @return
     */
    public String getGroupDisplayName(String groupId) {
        return getGroupDisplayName(groupId, null);
    }

    /**
     * Returns group display name
     *
     * @return
     */
    public String getGroupDisplayName(String groupId, Locale locale) {
        for (Iterator iterator = panels.values().iterator(); iterator.hasNext();) {
            PanelProvider panelProvider = (PanelProvider) iterator.next();
            if (panelProvider.getGroup().equals(groupId)) {
                String resourceStr = panelProvider.getResource(groupId, locale);
                if (!resourceStr.equals(groupId)) {
                    return resourceStr;
                }
            }
        }
        return groupId;
    }

    /**
     * Returns all providers belonging to a given group, sorted by description
     *
     * @param group or null if we want all panels NOT belonging to any group
     * @return
     */
    public PanelProvider[] getProvidersInGroup(String group) {
        return getProvidersInGroup(group, null);
    }

    /**
     * Returns all providers belonging to a given group, sorted by description,
     * and allowed by given workspace
     *
     * @param group  or null if we want all panels NOT belonging to any group
     * @param workspace Workspace that allows returned providers.
     * @return
     */
    public PanelProvider[] getProvidersInGroup(String group, Workspace workspace) {
        List groupPanels = new ArrayList();
        for (Iterator iterator = panels.values().iterator(); iterator.hasNext();) {
            PanelProvider panelProvider = (PanelProvider) iterator.next();
            if (!panelProvider.isEnabled()) continue;
            if (workspace != null && !workspace.isProviderAllowed(panelProvider.getId()) && !workspace.isProviderAllowed("*"))
                continue;
            if ((group == null && panelProvider.getGroup() == null) ||
                    (group != null && group.equals(panelProvider.getGroup()))) {
                groupPanels.add(panelProvider);
            }
        }
        PanelProvider[] p = (PanelProvider[]) groupPanels.toArray(new PanelProvider[groupPanels.size()]);
        Arrays.sort(p, new PanelProviderComparator());
        return p;
    }

    /**
     * @return The providers installed, but not licensed for use in the workspace.
     */
    public PanelProvider[] getDisabledProviders() {
        HashSet panelProviders = new HashSet();
        for (Iterator it = panels.values().iterator(); it.hasNext();) {
            PanelProvider p = (PanelProvider) it.next();
            if (!p.isEnabled()) panelProviders.add(p);
        }
        PanelProvider[] p = (PanelProvider[]) panelProviders.toArray(new PanelProvider[panels.size()]);
        // Sort providers by description (just for display purpouses)
        Arrays.sort(p, new PanelProviderComparator());
        return p;
    }

    /**
     * Returns all providers belonging to a given group, sorted by description, but
     * disabled by license.
     *
     * @param group or null if we want all panels NOT belonging to any group
     * @return
     */
    public PanelProvider[] getDisabledProvidersInGroup(String group) {
        List groupPanels = new ArrayList();
        for (Iterator iterator = panels.values().iterator(); iterator.hasNext();) {
            PanelProvider panelProvider = (PanelProvider) iterator.next();
            if (panelProvider.isEnabled()) continue;
            if ((group == null && panelProvider.getGroup() == null) ||
                    (group != null && group.equals(panelProvider.getGroup()))) {
                groupPanels.add(panelProvider);
            }
        }
        PanelProvider[] p = (PanelProvider[]) groupPanels.toArray(new PanelProvider[groupPanels.size()]);
        Arrays.sort(p, new PanelProviderComparator());
        return p;
    }

    /**
     * Enumerates all existing groups of providers containing only disabled panel Instances
     *
     * @return all existing groups of providers containing only disabled panel Instances
     */
    public String[] enumerateDisabledProvidersGroups() {
        Set groups = new HashSet();
        for (Iterator iterator = panels.values().iterator(); iterator.hasNext();) {
            PanelProvider panelProvider = (PanelProvider) iterator.next();
            if (!panelProvider.isEnabled() && panelProvider.getGroup() != null) {
                groups.add(panelProvider.getGroup());
            }
        }
        return (String[]) groups.toArray(new String[groups.size()]);
    }

    public PanelProvider getProvider(String id) {
        return (PanelProvider) panels.get(id);
    }

    /**
     * Loads a panelHelp from a helpFile.
     *
     * @param helpFile
     * @return a help file information loaded from a file.
     */
    protected PanelHelp loadHelpFile(File helpFile) throws IOException, SAXException {
        return panelHelpManager.readPanelHelp(new FileInputStream(helpFile));
    }

    /**
     * Loads a provider from its file definition
     */
    protected PanelProvider loadPanelProvider(File f) throws Exception {
        Properties prop = new Properties();

        FileInputStream str = new FileInputStream(f);
        prop.load(str);
        str.close();

        // Create driver
        String driver = prop.getProperty("panel.driver");
        PanelProvider p = (PanelProvider) Factory.lookup("org.jboss.dashboard.ui.panel.PanelProvider");
        try {
            PanelDriver pdriver = (PanelDriver) Factory.lookup(driver);
            pdriver = pdriver == null ? (PanelDriver) Class.forName(driver).newInstance() : pdriver;
            p.setDriver(pdriver);
        }
        catch (Throwable e) {
            log.error("Error creating instance for driver "+driver+" :", e);
        }
        // Set attributes
        p.setId(prop.getProperty("panel.id"));
        p.setBasePanel(ArrayUtils.contains(getBasePanelsIds(), prop.getProperty("panel.id")));
        p.setDeprecatedPanel(ArrayUtils.contains(getDeprecatedPanelsIds(), prop.getProperty("panel.id")));
        p.setDescription(prop.getProperty("panel.description"));
        p.setGroup(prop.getProperty("panel.group"));
        p.setStyleSheet(prop.getProperty("stylesheet"));
        if(prop.getProperty("panel.thumbnail")== null){
            p.setThumbnail(defaultProviderThumbnail);
        } else {
            p.setThumbnail(prop.getProperty("panel.thumbnail"));
        }

        // We keep files to import in a array a perform it after the loop to avoid a ConcurrentModificationException
        List filesToImport = new ArrayList();

        /*
         * Iterate over properties
         */
        Iterator it = prop.keySet().iterator();
        while (it.hasNext()) {
            String key = (String) it.next();
            String value = prop.getProperty(key).trim();

            if (key.startsWith("jsp.")) {
                String text = key.substring(4).trim();
                p.addPage(text, value);
            } else if (key.startsWith("resources.")) {
                // Import resource bundles
                String bundleName = value;
                if (value.endsWith(".properties")) bundleName = value.substring(0, value.length() - 11);
                String[] locales = LocaleManager.lookup().getInstalledLocaleIds();
                for (int i = 0; i < locales.length; i++) {
                    String locale = locales[i];
                    File localeFile = new File(f.getParent() + "/" + bundleName + "_" + locale + ".properties");
                    if (!localeFile.exists() || !localeFile.isFile()) {
                        log.error("Bundle file '" + localeFile.getName() + "' not found for the panel provider with id=" + p.getId());
                        continue;
                    }
                    File bundleFile = new File(f.getParent() + "/" + bundleName + ".properties");
                    p.getBundles().add(bundleFile);
                }               
            }
        }

        // Add the help page
        p.addPage(PanelDriver.PAGE_HELP_MODE, getHelpModePage());

        // Make the properties file available to the driver
        p.setProperties(prop);
        return p;

    }

    public class PanelProviderComparator implements Comparator {
        final Locale locale = LocaleManager.currentLocale();

        public int compare(Object o1, Object o2) {
            PanelProvider p1 = (PanelProvider) o1;
            PanelProvider p2 = (PanelProvider) o2;
            return p1.getResource(p1.getDescription(), locale).compareTo(p2.getResource(p2.getDescription(), locale));
        }
    }

    public String getProviderGroupImage(String groupId){
        try{
            String img=(String)providerGroupImg.get(groupId.replace(".","_"));
            if(img!=null)
                return img;
        }catch (Exception e){
        }
        return defaultProviderGroupThumbnail;
    }
}
TOP

Related Classes of org.jboss.dashboard.workspace.PanelsProvidersManagerImpl$PanelProviderComparator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.