Fixed #FELIX-2644 /cannot disable plugin/
https://issues.apache.org/jira/browse/FELIX-2644

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1027069 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ComponentsServlet.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ComponentsServlet.java
index 4baaf05..b4688c8 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ComponentsServlet.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ComponentsServlet.java
@@ -61,7 +61,7 @@
     private static final long serialVersionUID = 1L;
 
     private static final String LABEL = "components";
-    private static final String TITLE = "%scr.pluginTitle";
+    private static final String TITLE = "%components.pluginTitle";
     private static final String CSS[] = { "/res/ui/bundles.css" }; // yes, it's correct!
 
     // actions
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ConfigManager.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ConfigManager.java
index 9b6ec2a..8defdb8 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ConfigManager.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ConfigManager.java
@@ -66,7 +66,7 @@
 public class ConfigManager extends ConfigManagerBase
 {
     private static final String LABEL = "configMgr"; // was name
-    private static final String TITLE = "%config.pluginTitle";
+    private static final String TITLE = "%configMgr.pluginTitle";
     private static final String CSS[] = { "/res/ui/config.css" };
 
     private static final String PID_FILTER = "pidFilter";
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/LogServlet.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/LogServlet.java
index f0b864a..c57a2c8 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/LogServlet.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/LogServlet.java
@@ -42,7 +42,7 @@
 public class LogServlet extends SimpleWebConsolePlugin implements OsgiManagerPlugin
 {
     private static final String LABEL = "logs";
-    private static final String TITLE = "%log.pluginTitle";
+    private static final String TITLE = "%logs.pluginTitle";
     private static final String CSS[] = { "/res/ui/logs.css" };
 
     private final static int MAX_LOGS = 200; //maximum number of log entries
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/deppack/DepPackServlet.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/deppack/DepPackServlet.java
index c32920d..33d74a8 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/deppack/DepPackServlet.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/deppack/DepPackServlet.java
@@ -47,7 +47,7 @@
 {
 
     private static final String LABEL = "deppack";
-    private static final String TITLE = "%deployment.pluginTitle";
+    private static final String TITLE = "%deppack.pluginTitle";
     private static final String CSS[] = { "/res/ui/deployment.css" };
 
     //
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/LicenseServlet.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/LicenseServlet.java
index eb4b552..4b1ee96 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/LicenseServlet.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/LicenseServlet.java
@@ -58,7 +58,7 @@
         { "README", "DISCLAIMER", "LICENSE", "NOTICE", "DEPENDENCIES" };
 
     static final String LABEL = "licenses";
-    static final String TITLE = "%license.pluginTitle";
+    static final String TITLE = "%licenses.pluginTitle";
     static final String CSS[] = { "/res/ui/license.css" };
 
     // templates
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/BundleRepositoryRender.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/BundleRepositoryRender.java
index 99a0b26..1cb5380 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/BundleRepositoryRender.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/obr/BundleRepositoryRender.java
@@ -39,7 +39,7 @@
 public class BundleRepositoryRender extends SimpleWebConsolePlugin implements OsgiManagerPlugin
 {
     private static final String LABEL = "obr";
-    private static final String TITLE = "OSGi Repository";
+    private static final String TITLE = "%obr.pluginTitle";
     private static final String[] CSS =
         { "/res/ui/obr.css" };
 
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
index 0bfa367..f01154f 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
@@ -25,7 +25,6 @@
 import java.util.ResourceBundle;
 import java.util.TreeMap;
 
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.cm.ManagedService;
 import org.osgi.service.metatype.AttributeDefinition;
@@ -118,29 +117,24 @@
 
             final TreeMap namesByClassName = new TreeMap();
             final ClassLoader loader = getClass().getClassLoader();
-            final String[] defaultPluginsClasses = OsgiManager.PLUGIN_CLASSES;
+            final String[] defaultPluginsClasses = OsgiManager.PLUGIN_MAP;
             for ( int i = 0; i < defaultPluginsClasses.length; i++ )
             {
+                final String clazz = defaultPluginsClasses[i++];
+                final String label = defaultPluginsClasses[i];
+                String name = null;
                 try
                 {
-                    final Object plugin = loader.loadClass( defaultPluginsClasses[i] ).newInstance();
-                    if ( plugin instanceof AbstractWebConsolePlugin )
-                    {
-                        String name = ( ( AbstractWebConsolePlugin ) plugin ).getTitle();
-                        if (name.startsWith("%"))
-                        {
-                            final ResourceBundle rb = osgiManager.resourceBundleManager.getResourceBundle(
-                                ((AbstractWebConsolePlugin) plugin).getBundle(),
-                                Locale.ENGLISH);
-                            name = rb.getString(name.substring(1));
-                        }
-                        namesByClassName.put( defaultPluginsClasses[i], name );
-                    }
+                    name = label + ".pluginTitle";
+                    final ResourceBundle rb = osgiManager.resourceBundleManager.getResourceBundle(osgiManager.getBundleContext().getBundle(), Locale.ENGLISH);
+                    name = rb.getString(name);
                 }
                 catch ( Throwable t )
                 {
+                    name = label;
                     // ignore
                 }
+                namesByClassName.put(clazz, name);
             }
             final String[] classes = ( String[] ) namesByClassName.keySet().toArray(
                 new String[namesByClassName.size()] );
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
index 8a5d285..0c5c5f5 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
@@ -53,6 +53,7 @@
 import org.apache.felix.webconsole.internal.filter.FilteringResponseWrapper;
 import org.apache.felix.webconsole.internal.i18n.ResourceBundleManager;
 import org.apache.felix.webconsole.internal.misc.ConfigurationRender;
+import org.apache.felix.webconsole.internal.servlet.PluginHolder.InternalPlugin;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -147,23 +148,27 @@
 
     static final String[] PLUGIN_CLASSES =
         { "org.apache.felix.webconsole.internal.compendium.ComponentConfigurationPrinter",
-            "org.apache.felix.webconsole.internal.compendium.ComponentsServlet",
-            "org.apache.felix.webconsole.internal.compendium.ConfigManager",
             "org.apache.felix.webconsole.internal.compendium.ConfigurationAdminConfigurationPrinter",
-            "org.apache.felix.webconsole.internal.compendium.LogServlet",
             "org.apache.felix.webconsole.internal.compendium.PreferencesConfigurationPrinter",
             "org.apache.felix.webconsole.internal.compendium.WireAdminConfigurationPrinter",
-            "org.apache.felix.webconsole.internal.core.BundlesServlet",
             "org.apache.felix.webconsole.internal.core.PermissionsConfigurationPrinter",
             "org.apache.felix.webconsole.internal.core.ServicesConfigurationPrinter",
-            "org.apache.felix.webconsole.internal.core.ServicesServlet",
-            "org.apache.felix.webconsole.internal.deppack.DepPackServlet",
-            "org.apache.felix.webconsole.internal.misc.LicenseServlet",
-            "org.apache.felix.webconsole.internal.misc.ShellServlet",
             "org.apache.felix.webconsole.internal.misc.SystemPropertiesPrinter",
             "org.apache.felix.webconsole.internal.misc.ThreadPrinter",
-            "org.apache.felix.webconsole.internal.obr.BundleRepositoryRender",
-            "org.apache.felix.webconsole.internal.system.VMStatPlugin" };
+        };
+
+    static final String[] PLUGIN_MAP = {
+        "org.apache.felix.webconsole.internal.compendium.ComponentsServlet", "components", //$NON-NLS-1$ //$NON-NLS-2$
+        "org.apache.felix.webconsole.internal.compendium.ConfigManager", "configMgr", //$NON-NLS-1$ //$NON-NLS-2$
+        "org.apache.felix.webconsole.internal.compendium.LogServlet", "logs", //$NON-NLS-1$ //$NON-NLS-2$
+        "org.apache.felix.webconsole.internal.core.BundlesServlet", "bundles", //$NON-NLS-1$ //$NON-NLS-2$
+        "org.apache.felix.webconsole.internal.core.ServicesServlet", "services", //$NON-NLS-1$ //$NON-NLS-2$
+        "org.apache.felix.webconsole.internal.deppack.DepPackServlet", "deppack", //$NON-NLS-1$ //$NON-NLS-2$
+        "org.apache.felix.webconsole.internal.misc.LicenseServlet", "licenses", //$NON-NLS-1$ //$NON-NLS-2$
+        "org.apache.felix.webconsole.internal.misc.ShellServlet", "shell", //$NON-NLS-1$ //$NON-NLS-2$
+        "org.apache.felix.webconsole.internal.obr.BundleRepositoryRender", "obr", //$NON-NLS-1$ //$NON-NLS-2$
+        "org.apache.felix.webconsole.internal.system.VMStatPlugin", "vmstat",  //$NON-NLS-1$ //$NON-NLS-2$
+    };
 
     private BundleContext bundleContext;
 
@@ -208,6 +213,14 @@
         this.bundleContext = bundleContext;
         this.holder = new PluginHolder( bundleContext );
 
+        // new plugins setup
+        for (int i = 0; i < PLUGIN_MAP.length; i++ )
+        {
+            final String pluginClassName = PLUGIN_MAP[i++];
+            final String label = PLUGIN_MAP[i];
+            holder.addInternalPlugin(this, pluginClassName, label);
+        }
+
         // setup the included plugins
         ClassLoader classLoader = getClass().getClassLoader();
         for ( int i = 0; i < PLUGIN_CLASSES.length; i++ )
@@ -219,23 +232,12 @@
                 Class pluginClass = classLoader.loadClass( pluginClassName );
                 Object plugin = pluginClass.newInstance();
 
-                // check whether enabled by configuration
-                if ( isPluginDisabled( pluginClassName, plugin ) )
-                {
-                    log( LogService.LOG_INFO, "Ignoring plugin " + pluginClassName + ": Disabled by configuration" );
-                    continue;
-                }
-
                 if ( plugin instanceof OsgiManagerPlugin )
                 {
                     ( ( OsgiManagerPlugin ) plugin ).activate( bundleContext );
                     osgiManagerPlugins.add( plugin );
                 }
-                if ( plugin instanceof AbstractWebConsolePlugin )
-                {
-                    holder.addOsgiManagerPlugin( ( AbstractWebConsolePlugin ) plugin );
-                }
-                else if ( plugin instanceof BrandingPlugin )
+                if ( plugin instanceof BrandingPlugin )
                 {
                     AbstractWebConsolePlugin.setBrandingPlugin( ( BrandingPlugin ) plugin );
                 }
@@ -529,7 +531,7 @@
      * @param level The log level at which to log the message
      * @param message The message to log
      */
-    private void log( int level, String message )
+    void log( int level, String message )
     {
         if ( logLevel >= level )
         {
@@ -552,7 +554,7 @@
      * @param message The message to log
      * @param t The <code>Throwable</code> to log with the message
      */
-    private void log( int level, String message, Throwable t )
+    void log( int level, String message, Throwable t )
     {
         if ( logLevel >= level )
         {
@@ -664,7 +666,7 @@
 
     private static class BrandingServiceTracker extends ServiceTracker
     {
-        private final OsgiManager osgiManager;
+        private final OsgiManager osgiManager; // FIXME: never read locally
 
 
         BrandingServiceTracker( OsgiManager osgiManager )
@@ -933,18 +935,14 @@
 
 
     /**
-     * Returns <code>true</code> if the plugin is an
-     * {@link AbstractWebConsolePlugin} and a list of enabled plugins is
+     * Returns <code>true</code> if the list of enabled plugins is
      * configured but the plugin is not contained in that list.
      * <p>
-     * This method is intended to be used only for plugins contained in the
-     * web console bundle itself, namely plugins listed in the
-     * {@value #PLUGIN_CLASSES} list.
+     * This method is intended to be used only for {@link InternalPlugin#isEnabled()} 
      */
-    private boolean isPluginDisabled( String pluginClass, Object plugin )
+    boolean isPluginDisabled( String pluginClass )
     {
-        return enabledPlugins != null && !enabledPlugins.contains( pluginClass )
-            && ( plugin instanceof AbstractWebConsolePlugin );
+        return enabledPlugins != null && !enabledPlugins.contains( pluginClass );
     }
 
 
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/PluginHolder.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/PluginHolder.java
index f4188da..48f1e6f 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/PluginHolder.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/PluginHolder.java
@@ -33,6 +33,7 @@
 
 import org.apache.felix.webconsole.AbstractWebConsolePlugin;
 import org.apache.felix.webconsole.WebConsoleConstants;
+import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.apache.felix.webconsole.internal.WebConsolePluginAdapter;
 import org.apache.felix.webconsole.internal.i18n.ResourceBundleManager;
 import org.osgi.framework.Bundle;
@@ -42,6 +43,7 @@
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogService;
 
 
 /**
@@ -149,6 +151,11 @@
         this.defaultPluginLabel = defaultPluginLabel;
     }
 
+    void addInternalPlugin( final OsgiManager osgiManager, final String pluginClassName, final String label)
+    {
+        final Plugin plugin = new InternalPlugin(this, osgiManager, pluginClassName, label);
+        addPlugin( label, plugin );
+    }
 
     /**
      * Adds an internal Web Console plugin
@@ -232,6 +239,8 @@
         for ( int i = 0; i < plugins.length; i++ )
         {
             final Plugin plugin = plugins[i];
+            if (!plugin.isEnabled() || null == plugin.getConsolePlugin()) continue;
+
             final String label = plugin.getLabel();
             String title = plugin.getTitle();
             if ( title.startsWith( "%" ) )
@@ -316,6 +325,8 @@
     /**
      * Called when plugin services are registered or unregistered (or modified,
      * which is currently ignored)
+     *
+     * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
      */
     public void serviceChanged( ServiceEvent event )
     {
@@ -538,6 +549,9 @@
             return consolePlugin;
         }
 
+        protected boolean isEnabled() {
+            return true;
+        }
 
         protected AbstractWebConsolePlugin doGetConsolePlugin()
         {
@@ -637,6 +651,7 @@
          */
         final void ungetService()
         {
+            // FIXME: this method is used by nobody!?!?
             dispose();
         }
 
@@ -707,4 +722,63 @@
         }
 
     }
+
+    static class InternalPlugin extends Plugin
+    {
+        final String pluginClassName;
+        final OsgiManager osgiManager;
+        AbstractWebConsolePlugin plugin;
+
+        protected InternalPlugin(PluginHolder holder, OsgiManager osgiManager, String pluginClassName, String label)
+        {
+            super(holder, label);
+            this.osgiManager = osgiManager;
+            this.pluginClassName = pluginClassName;
+        }
+
+        protected final boolean isEnabled() {
+            // check if the plugin is enabled
+            return !osgiManager.isPluginDisabled(pluginClassName);
+        }
+
+        protected AbstractWebConsolePlugin doGetConsolePlugin()
+        {
+            if (null == plugin) {
+                if (!isEnabled()) 
+                {
+                    osgiManager.log( LogService.LOG_INFO, "Ignoring plugin " + pluginClassName + ": Disabled by configuration" );
+                    return null;
+                }
+
+                try
+                {
+                    Class pluginClass = getClass().getClassLoader().loadClass(pluginClassName);
+                    plugin = (AbstractWebConsolePlugin) pluginClass.newInstance();
+    
+                    if (plugin instanceof OsgiManagerPlugin)
+                    {
+                        ((OsgiManagerPlugin) plugin).activate(getBundle().getBundleContext());
+                    }
+
+                }
+                catch (Throwable t)
+                {
+                    osgiManager.log( LogService.LOG_WARNING, "Failed to instantiate plugin " + pluginClassName, t );
+                }
+            }
+
+            return plugin;
+        }
+
+        protected void doUngetConsolePlugin(AbstractWebConsolePlugin consolePlugin)
+        {
+            if (consolePlugin == plugin) plugin = null;
+            if (consolePlugin instanceof OsgiManagerPlugin)
+            {
+                ((OsgiManagerPlugin) consolePlugin).deactivate();
+            }
+            super.doUngetConsolePlugin(consolePlugin);
+        }
+
+    }
 }
diff --git a/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_bg.properties b/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_bg.properties
index f2bd291..387efa6 100644
--- a/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_bg.properties
+++ b/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_bg.properties
@@ -78,7 +78,7 @@
 services.usingBundles=Използващи бъндъли
 
 # Log plugin
-log.pluginTitle=Журнал
+logs.pluginTitle=Журнал
 log.status.ok=Log Service е активен.
 log.status.missing=Няма активен Log Service.
 log.severity.label=Макс. ниво:
@@ -93,7 +93,7 @@
 log.level.debug=ДЕТАЙЛИ
 
 # Deployment Admin plugin
-deployment.pluginTitle=Управление на пакети
+deppack.pluginTitle=Управление на пакети
 deployment.status.no_data=Няма инсталирани пакети!
 deployment.status.no_service=Услугата Deployment Admin не е налична в момента!
 deployment.status.ok=Deployment Admin е наличен и по-долу е показан списъка с пакет
@@ -163,7 +163,7 @@
 
 
 # Components plugin
-scr.pluginTitle=Компоненти
+components.pluginTitle=Компоненти
 scr.status.no_service=Declarative Service не е наличен!
 scr.status.no_components=Няма инсталирани компонент в момента!
 scr.status.ok=Брой инсталирани компоненти: {0}
@@ -185,7 +185,7 @@
 
 
 # Configuration plugin
-config.pluginTitle=Конфигурации
+configMgr.pluginTitle=Конфигурации
 config.status.ok=Configuration Admin Service е достъпен.
 config.status.missing=Няма Configuration Admin Service
 config.properties=Настройки
@@ -211,7 +211,7 @@
 config.bind.error=Грешка: PID "{0}" е асоцииран с "{1}" но улугата е регистриране от бъндъл "{2}"
 
 # License plugin
-license.pluginTitle=Лицензи
+licenses.pluginTitle=Лицензи
 license.status.ok=Следните бъндъли съдържат лицензионна информация.
 license.status.none=Няма бъндъли съдържащо лицензионна информация
 license.resources=Ресурси на бъндъла: 
diff --git a/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_de.properties b/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_de.properties
index 1ea0ad9..ff76151 100644
--- a/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_de.properties
+++ b/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_de.properties
@@ -77,7 +77,7 @@
 services.usingBundles=Nutzende Bundles
 
 # Log plugin
-log.pluginTitle=Log Service
+logs.pluginTitle=Log Service
 log.status.ok=Log Service ist aktiv.
 log.status.missing=Log Service ist nicht installiert/aktiv.
 log.severity.label=Minimaler Level:
@@ -92,7 +92,7 @@
 log.level.debug=Debug
 
 # Deployment Admin plugin
-deployment.pluginTitle=Deployment Packages
+deppack.pluginTitle=Deployment Packages
 deployment.status.no_data=Kein Deployment Package ist installiert!
 deployment.status.no_service=Deployment Admin Dienst ist nicht instaliert/aktiv!
 deployment.status.ok=Deployment Admin Dienst ist aktiv
@@ -161,7 +161,7 @@
 bundles.error.title=Ein Fehler ist aufgetreten während der Ausführung der Bundle Operation!
 
 # Components plugin
-scr.pluginTitle=Komponenten
+components.pluginTitle=Komponenten
 scr.status.no_service=Declarative Service ist Voraussetzung für diese Funktionalität!
 scr.status.no_components=Zur Zeit sind keine Komponenten installiert!
 scr.status.ok=Anzahl installierter Komponenten: {0}
@@ -183,7 +183,7 @@
 
 
 # Configuration plugin
-config.pluginTitle=Konfiguration
+configMgr.pluginTitle=Konfiguration
 config.status.ok=Configuration Admin Dienst ist aktiv.
 config.status.missing=Configuration Admin Dienst ist nicht installiert/aktiv.
 config.properties=Eigenschaften
@@ -208,7 +208,7 @@
 config.title.name=Name
 
 # License plugin
-license.pluginTitle=Lizenzen
+licenses.pluginTitle=Lizenzen
 license.status.ok=Die folgenden Bundles enthalten Lizenz Informationen.
 license.status.none=Keine Bundles mit Lizenz Informationen installiert
 license.resources=Bundle Resourcen: 
diff --git a/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_ru.properties b/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_ru.properties
index b3b4855..d0bb220 100644
--- a/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_ru.properties
+++ b/webconsole/src/main/native2ascii/OSGI-INF/l10n/bundle_ru.properties
@@ -48,7 +48,7 @@
 services.usingBundles=Используется модулями
 
 # Log plugin
-log.pluginTitle=Журнал
+logs.pluginTitle=Журнал
 log.status.ok=Log Service работает.
 log.status.missing=Log Service не установлен или не запущен.
 log.severity.label=Важность:
@@ -63,7 +63,7 @@
 log.level.debug=ОТЛАДКА
 
 # Deployment Admin plugin
-deployment.pluginTitle=Управление пакетами
+deppack.pluginTitle=Управление пакетами
 deployment.status.no_data=Нет установочных пакетов!
 deployment.status.no_service=Сервис Deployment Admin не установлен или не запущен.
 deployment.status.ok=Сервис Deployment Admin работает
@@ -133,7 +133,7 @@
 
 
 # Components plugin
-scr.pluginTitle=Компоненты
+components.pluginTitle=Компоненты
 scr.status.no_service=Сервис Declarative Service не найден!
 scr.status.no_components=Нет установленных компонентов!
 scr.status.ok=Количество установленных компонентов: {0}
@@ -155,7 +155,7 @@
 
 
 # Configuration plugin
-config.pluginTitle=Конфигурирование
+configMgr.pluginTitle=Конфигурирование
 config.status.ok=Сервис Configuration Admin запущен.
 config.status.missing=Сервис Configuration Admin не найден!
 config.properties=Настройки
@@ -181,7 +181,7 @@
 config.bind.error=Ошибка: PID "{0}" привязан к "{1}", но сервис конфигурирования зарегистрирован модулем "{2}"
 
 # License plugin
-license.pluginTitle=Лицензии
+licenses.pluginTitle=Лицензии
 license.status.ok=Модули, содержащие файлы лицензий.
 license.status.none=Нет модулей с информацией о лицензиях
 license.resources=Ресурсы модуля:
diff --git a/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties b/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties
index 7df8e19..1291e87 100644
--- a/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties
+++ b/webconsole/src/main/resources/OSGI-INF/l10n/bundle.properties
@@ -78,7 +78,7 @@
 services.usingBundles=Using Bundles
 
 # Log plugin
-log.pluginTitle=Log Service
+logs.pluginTitle=Log Service
 log.status.ok=Log Service is running.
 log.status.missing=Log Service is not installed/running.
 log.severity.label=Severity at least:
@@ -93,7 +93,7 @@
 log.level.debug=DEBUG
 
 # Deployment Admin plugin
-deployment.pluginTitle=Deployment Packages
+deppack.pluginTitle=Deployment Packages
 deployment.status.no_data=No deployment packages installed!
 deployment.status.no_service=Deployment Admin is not installed/running!
 deployment.status.ok=Deployment Admin service is running
@@ -163,7 +163,7 @@
 
 
 # Components plugin
-scr.pluginTitle=Components
+components.pluginTitle=Components
 scr.status.no_service=Declarative Service required for this function!
 scr.status.no_components=No components installed currently!
 scr.status.ok=Number of installed components: {0}
@@ -185,7 +185,7 @@
 
 
 # Configuration plugin
-config.pluginTitle=Configuration
+configMgr.pluginTitle=Configuration
 config.status.ok=Configuration Admin Service is running.
 config.status.missing=Configuration Admin Service is not installed/running.
 config.properties=Properties
@@ -211,7 +211,7 @@
 config.bind.error=Error: the PID "{0}" is bound to "{1}" but the actual managed service is registered from "{2}" bundle
 
 # License plugin
-license.pluginTitle=Licenses
+licenses.pluginTitle=Licenses
 license.status.ok=The following bundles contains license files.
 license.status.none=No bundles with license files available
 license.resources=Bundle Resources: