/* * #! * Ontopia Navigator * #- * Copyright (C) 2001 - 2013 The Ontopia Project * #- * 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 net.ontopia.topicmaps.nav2.impl.basic; import java.text.Collator; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import net.ontopia.utils.StringUtils; import net.ontopia.topicmaps.nav2.core.NavigatorConfigurationIF; import net.ontopia.topicmaps.nav2.impl.framework.MVSConfig; import net.ontopia.topicmaps.nav2.plugins.PluginIF; import net.ontopia.topicmaps.nav2.plugins.PluginUtils; import net.ontopia.topicmaps.nav2.plugins.PluginComparator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * INTERNAL: A configuration holder class for storing * and providing information about the application * configuration. */ public class NavigatorConfiguration implements NavigatorConfigurationIF { // initialization of logging facility private static Logger log = LoggerFactory .getLogger(NavigatorConfiguration.class.getName()); // constants public final static String AUTOLOAD_ALL_KEY = "~all"; // members protected Map properties; protected Map classmap; protected Map plugins; protected MVSConfig mvsConfig; protected Set autoloads; protected boolean isAutoloadAll; /** * INTERNAL: default constructor. */ public NavigatorConfiguration() { properties = new HashMap(); classmap = new HashMap(); plugins = new HashMap(); mvsConfig = new MVSConfig(); autoloads = new HashSet(); isAutoloadAll = false; } // ------------------------------------------------ // Properties related methods // ------------------------------------------------ public void addProperty(String name, String value) { properties.put(name, value); } public String getProperty(String name) { return getProperty(name, ""); } public String getProperty(String name, String defaultValue) { String value = (String)properties.get(name); if (value == null) return defaultValue; else return value; } public int getProperty(String name, int defaultValue) { try { String value = (String)properties.get(name); if (value == null) return defaultValue; else return Integer.parseInt(value); } catch (NumberFormatException e) { return defaultValue; } } public Map getProperties() { return this.properties; } public void setProperties(Map properties) { this.properties = properties; } // ------------------------------------------------ // Classmap related methods // ------------------------------------------------ public void addClass(String shortcut, String fullClassName) { classmap.put(shortcut, fullClassName); } public String getClass(String shortcut) { if (classmap.get(shortcut) != null) return (String) classmap.get(shortcut); else return ""; } public Map getClassmap() { return this.classmap; } public void setClassmap(Map classmap) { this.classmap = classmap; } // ------------------------------------------------ // Properties related methods // ------------------------------------------------ public void addAutoloadTopicMap(String topicmapId) { if (topicmapId.equals(AUTOLOAD_ALL_KEY)) isAutoloadAll = true; else autoloads.add(topicmapId); } public boolean isAutoloadTopicMap(String topicmapId) { return autoloads.contains(topicmapId); } public boolean isAutoloadAllTopicMaps() { return isAutoloadAll; } public Collection getAutoloadTopicMaps() { return this.autoloads; } public void setAutoloads(Collection autoloads) { this.autoloads = new HashSet(autoloads); } // ------------------------------------------------ // MVS related methods // ------------------------------------------------ public MVSConfig getMVSConfig() { return mvsConfig; } public void setMVSConfig(MVSConfig mvsConfig) { this.mvsConfig = mvsConfig; } // --- model public void addModel(String name, String title, boolean isDefault) { mvsConfig.addModel(name, title); if (isDefault) mvsConfig.setModel(name); } public Collection getModels() { return mvsConfig.getModels(); } public String getDefaultModel() { return mvsConfig.getModel(); } // --- view public void addView(String name, String title, boolean isDefault) { mvsConfig.addView(name, title); if (isDefault) mvsConfig.setView(name); } public Collection getViews() { return mvsConfig.getViews(); } public String getDefaultView() { return mvsConfig.getView(); } // --- skin public void addSkin(String name, String title, boolean isDefault) { mvsConfig.addSkin(name, title); if (isDefault) mvsConfig.setSkin(name); } public Collection getSkins() { return mvsConfig.getSkins(); } public String getDefaultSkin() { return mvsConfig.getSkin(); } // ------------------------------------------------ // plugins related methods // ------------------------------------------------ public void addPlugin(PluginIF aPlugin) { plugins.put(aPlugin.getId(), aPlugin); } public PluginIF getPlugin(String id) { return (PluginIF) plugins.get(id); } public Collection getPlugins(String groupId) { if (groupId == null) groupId = ""; // generate Property name to look up StringBuilder propName = new StringBuilder(PLUGINS_ORDER); if (!groupId.equals("")) propName.append("_" + groupId); // get string which specifies sort order of plugins String orderProp = getProperty(propName.toString()); if ((orderProp == null || orderProp.equals("")) && groupId.equals("")) return plugins.values(); List orderedPlugins = new ArrayList(); // -- first put in plugins which are specified by sort order if (!orderProp.equals("")) { String[] order = StringUtils.split(orderProp); for (int ix = 0; ix < order.length; ix++) { PluginIF plugin = (PluginIF) plugins.get(order[ix]); if (plugin != null) { if (groupId == null || (groupId != null && PluginUtils.inPluginGroups(groupId, plugin.getGroups()))) orderedPlugins.add(plugin); } else { log.warn("property " + propName + " contains non-existent plugin: " + order[ix]); } } // for } // -- second append plugins which are not listed in sort order Iterator it = plugins.values().iterator(); while (it.hasNext()) { PluginIF plugin = (PluginIF) it.next(); if (orderedPlugins.contains(plugin)) continue; // check if matches with group id, if set. if (groupId == null || (groupId != null && PluginUtils.inPluginGroups(groupId, plugin.getGroups()))) orderedPlugins.add(plugin); } return orderedPlugins; } public Collection getPlugins() { return getPlugins(null); } public Collection getOrderedPlugins() { List orderedPlugins = new ArrayList(plugins.values()); // sort the titles alphabetically Comparator comparator = new PluginComparator(); Collections.sort(orderedPlugins, comparator); return orderedPlugins; } public List getPluginGroups() { // gather all different groups Set groups = new HashSet(); Iterator it = plugins.values().iterator(); while (it.hasNext()) { PluginIF plugin = (PluginIF) it.next(); groups.addAll(plugin.getGroups()); } // sort the groups alphabetically List allGroups = new ArrayList(groups); Comparator comparator = Collator.getInstance(); Collections.sort(allGroups, comparator); return allGroups; } // ------------------------------------------------ public String toString() { StringBuilder strBuf = new StringBuilder(); strBuf.append("NavigatorConfiguration: [") .append("autoloads: ").append(autoloads.toString()) .append(", classmap: ").append(classmap.toString()) .append(", plugins: ").append(plugins.toString()) .append(", properties: ").append(properties.toString()) .append(", models: ").append(mvsConfig.getModels().toString()) .append(", views: ").append(mvsConfig.getViews().toString()) .append(", skins: ").append(mvsConfig.getSkins().toString()) .append("]"); return strBuf.toString(); } }