package org.pentaho.mantle.client.solutionbrowser; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.pentaho.gwt.widgets.client.utils.string.StringUtils; import org.pentaho.mantle.client.commands.AnalysisViewCommand; import org.pentaho.mantle.client.commands.UrlCommand; import org.pentaho.mantle.client.commands.WAQRCommand; import org.pentaho.mantle.client.solutionbrowser.filelist.FileItem; import org.pentaho.mantle.client.solutionbrowser.filelist.FileCommand.COMMAND; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; public class PluginOptionsHelper { private static ArrayList<FileTypeEnabledOptions> enabledOptionsList = new ArrayList<FileTypeEnabledOptions>(); private static ArrayList<ContentTypePlugin> contentTypePluginList = new ArrayList<ContentTypePlugin>(); private static String newAnalysisViewOverrideCommandUrl; private static String newAnalysisViewOverrideCommandTitle; private static String newReportOverrideCommandUrl; private static String newReportOverrideCommandTitle; public static void buildEnabledOptionsList(Map<String, String> settings) { enabledOptionsList.clear(); contentTypePluginList.clear(); // Check for override of NewAnalysisView // Poked in via pentaho.xml entry if (settings.containsKey("new-analysis-view-command-url")) { //$NON-NLS-1$ newAnalysisViewOverrideCommandUrl = settings.get("new-analysis-view-command-url"); //$NON-NLS-1$ newAnalysisViewOverrideCommandTitle = settings.get("new-analysis-view-command-title"); //$NON-NLS-1$ } // Check for override of New Report // Poked in via pentaho.xml entry // <new-analysis-view> // <command-url>http://www.google.com</command-url> // <command-title>Marc Analysis View</command-title> // </new-analysis-view> // <new-report> // <command-url>http://www.yahoo.com</command-url> // <command-title>Marc New Report</command-title> // </new-report> // if (settings.containsKey("new-report-command-url")) { //$NON-NLS-1$ newReportOverrideCommandUrl = settings.get("new-report-command-url"); //$NON-NLS-1$ newReportOverrideCommandTitle = settings.get("new-report-command-title"); //$NON-NLS-1$ } // Another way to override is from a plugin.xml... // // <menu-item id="waqr_menu_item" anchor="file-new-submenu-waqr_menu_item" label="New WAQR" command="http://www.amazon.com" type="MENU_ITEM" how="REPLACE"/> // <menu-item id="new_analysis_view_menu_item" anchor="file-new-submenu-new_analysis_view_menu_item" label="New Analysis" command="http://www.dogpile.com" // type="MENU_ITEM" how="REPLACE"/> if (settings.get("file-newMenuOverrideTitle0") != null) { //$NON-NLS-1$ // For now, only support override of these two menus for (int i = 0; i < 2; i++) { String title = settings.get("file-newMenuOverrideTitle" + i); //$NON-NLS-1$ String command = settings.get("file-newMenuOverrideCommand" + i); //$NON-NLS-1$ String menuItem = settings.get("file-newMenuOverrideMenuItem" + i); //$NON-NLS-1$ if ((menuItem != null) && (command != null) && (title != null)) { if (menuItem.equals("waqr_menu_item")) { //$NON-NLS-1$ newReportOverrideCommandUrl = command; newReportOverrideCommandTitle = title; } else if (menuItem.equals("new_analysis_view_menu_item")) { //$NON-NLS-1$ newAnalysisViewOverrideCommandUrl = command; newAnalysisViewOverrideCommandTitle = title; } } } } // load plugins int index = 0; String pluginSetting = "plugin-content-type-" + index; //$NON-NLS-1$ while (settings.containsKey(pluginSetting)) { String fileExtension = settings.get(pluginSetting); String fileIcon = settings.get("plugin-content-type-icon-" + index); FileTypeEnabledOptions pluginMenu = new FileTypeEnabledOptions(fileExtension); ContentTypePlugin plugin = new ContentTypePlugin(fileExtension, fileIcon); int cmdIndex = 0; String cmdSetting = pluginSetting + "-command-" + cmdIndex; while (settings.containsKey(cmdSetting)) { try { COMMAND cmd = COMMAND.valueOf(settings.get(cmdSetting)); String url = settings.get(pluginSetting + "-command-url-" + cmdIndex); pluginMenu.addCommand(cmd); plugin.addUrlCommand(cmd, url); cmdSetting = pluginSetting + "-command-" + (++cmdIndex); } catch (Throwable t) { cmdSetting = pluginSetting + "-command-" + (++cmdIndex); // command is not found, invalid, we cannot let this break // the entire application, and it doesn't help to annoy every // single user everytime they start their application if // a plugin has a poorly configured plugin } } // all files can share, delete, and have properties pluginMenu.addCommand(COMMAND.SHARE); pluginMenu.addCommand(COMMAND.DELETE); pluginMenu.addCommand(COMMAND.PROPERTIES); contentTypePluginList.add(plugin); enabledOptionsList.add(pluginMenu); // check for another one pluginSetting = "plugin-content-type-" + (++index); //$NON-NLS-1$ } FileTypeEnabledOptions waqrMenu = new FileTypeEnabledOptions(FileItem.WAQR_VIEW_SUFFIX); waqrMenu.addCommand(COMMAND.RUN); waqrMenu.addCommand(COMMAND.NEWWINDOW); waqrMenu.addCommand(COMMAND.BACKGROUND); waqrMenu.addCommand(COMMAND.EDIT); waqrMenu.addCommand(COMMAND.EDIT_ACTION); waqrMenu.addCommand(COMMAND.DELETE); waqrMenu.addCommand(COMMAND.SHARE); waqrMenu.addCommand(COMMAND.SCHEDULE_NEW); waqrMenu.addCommand(COMMAND.PROPERTIES); enabledOptionsList.add(waqrMenu); FileTypeEnabledOptions analysisMenu = new FileTypeEnabledOptions(FileItem.ANALYSIS_VIEW_SUFFIX); analysisMenu.addCommand(COMMAND.RUN); analysisMenu.addCommand(COMMAND.NEWWINDOW); analysisMenu.addCommand(COMMAND.EDIT); analysisMenu.addCommand(COMMAND.EDIT_ACTION); analysisMenu.addCommand(COMMAND.DELETE); analysisMenu.addCommand(COMMAND.SHARE); analysisMenu.addCommand(COMMAND.PROPERTIES); enabledOptionsList.add(analysisMenu); FileTypeEnabledOptions xactionMenu = new FileTypeEnabledOptions(FileItem.XACTION_SUFFIX); xactionMenu.addCommand(COMMAND.RUN); xactionMenu.addCommand(COMMAND.NEWWINDOW); xactionMenu.addCommand(COMMAND.BACKGROUND); xactionMenu.addCommand(COMMAND.EDIT_ACTION); xactionMenu.addCommand(COMMAND.DELETE); xactionMenu.addCommand(COMMAND.SCHEDULE_NEW); xactionMenu.addCommand(COMMAND.SHARE); xactionMenu.addCommand(COMMAND.PROPERTIES); enabledOptionsList.add(xactionMenu); FileTypeEnabledOptions defaultMenu = new FileTypeEnabledOptions(null); defaultMenu.addCommand(COMMAND.RUN); defaultMenu.addCommand(COMMAND.NEWWINDOW); defaultMenu.addCommand(COMMAND.DELETE); defaultMenu.addCommand(COMMAND.SHARE); defaultMenu.addCommand(COMMAND.PROPERTIES); enabledOptionsList.add(defaultMenu); } public static FileTypeEnabledOptions getEnabledOptions(String filename) { for (FileTypeEnabledOptions option : enabledOptionsList) { if (option.isSupportedFile(filename)) { return option; } } return null; } public static ContentTypePlugin getContentTypePlugin(String filename) { for (ContentTypePlugin plugin : contentTypePluginList) { if (plugin.isSupportedFile(filename)) { return plugin; } } return null; } public static Command getNewAnalysisViewCommand() { if (newAnalysisViewOverrideCommandUrl == null) { return new AnalysisViewCommand(); } else { return new UrlCommand(newAnalysisViewOverrideCommandUrl, newAnalysisViewOverrideCommandTitle); } } public static Command getNewReportCommand() { if (newReportOverrideCommandUrl == null) { return new WAQRCommand(); } else { return new UrlCommand(newReportOverrideCommandUrl, newReportOverrideCommandTitle); } } public static class ContentTypePlugin { String fileExtension; String fileIcon; Map<COMMAND, String> urlCommands = new HashMap<COMMAND, String>(); ContentTypePlugin(String fileExtension, String fileIcon) { this.fileExtension = fileExtension; this.fileIcon = fileIcon; } public void addUrlCommand(COMMAND cmd, String url) { urlCommands.put(cmd, url); } public boolean isSupportedFile(String filename) { return filename != null && filename.endsWith(fileExtension); } private String replacePattern(String url, FileItem item) { if (url == null) { return null; } String newurl = url.replaceAll("\\{solution\\}", item.getSolution()); //$NON-NLS-1$ newurl = newurl.replaceAll("\\{path\\}", item.getPath()); //$NON-NLS-1$ return newurl.replaceAll("\\{name\\}", item.getName()); //$NON-NLS-1$ } public boolean hasCommand(COMMAND cmd) { return urlCommands.containsKey(cmd); } public String getCommandUrl(FileItem item, COMMAND cmd) { String url = replacePattern(urlCommands.get(cmd), item); if (!StringUtils.isEmpty(url)) { if (!url.startsWith("http")) { String href = Window.Location.getHref().substring(0, Window.Location.getHref().indexOf("Home")); if (href.endsWith("/") || url.startsWith("/")) { url = href += url; } else { url = href + "/" + url; } } } return url; } public String getFileIcon() { return fileIcon; } } }