blob: 6536fcca5014fe7edf297c32e08c38ec291d9f19 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.felix.webconsole.internal.servlet;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.TreeMap;
import org.apache.felix.webconsole.internal.Util;
import org.osgi.service.cm.ManagedService;
import org.osgi.service.metatype.AttributeDefinition;
import org.osgi.service.metatype.MetaTypeProvider;
import org.osgi.service.metatype.ObjectClassDefinition;
class ConfigurationSupport implements ManagedService, MetaTypeProvider
{
private static final String[] CONF_PROPS = new String[] {
OsgiManager.PROP_MANAGER_ROOT, OsgiManager.DEFAULT_MANAGER_ROOT, //
OsgiManager.PROP_HTTP_SERVICE_SELECTOR, OsgiManager.DEFAULT_HTTP_SERVICE_SELECTOR, //
OsgiManager.PROP_DEFAULT_RENDER, OsgiManager.DEFAULT_PAGE, //
OsgiManager.PROP_REALM, OsgiManager.DEFAULT_REALM, //
OsgiManager.PROP_USER_NAME, OsgiManager.DEFAULT_USER_NAME, //
OsgiManager.PROP_PASSWORD, OsgiManager.DEFAULT_PASSWORD, //
OsgiManager.PROP_LOCALE, "" , //$NON-NLS-1$
};
// used by an inner class, to prevent synthetic methods
final OsgiManager osgiManager;
private final Object ocdLock = new Object();
private String ocdLocale;
private ObjectClassDefinition ocd;
ConfigurationSupport( OsgiManager osgiManager )
{
this.osgiManager = osgiManager;
}
//---------- ManagedService
@SuppressWarnings("unchecked")
public void updated( @SuppressWarnings("rawtypes") Dictionary config )
{
osgiManager.updateConfiguration( config );
}
//---------- MetaTypeProvider
public String[] getLocales()
{
// there is no locale support here
return null;
}
static final String getString(ResourceBundle rb, String key, String def)
{
try
{
return rb.getString(key);
}
catch (Throwable t)
{
return def;
}
}
public ObjectClassDefinition getObjectClassDefinition( String id, String locale )
{
if ( !osgiManager.getConfigurationPid().equals( id ) )
{
return null;
}
if (locale == null) locale = Locale.ENGLISH.getLanguage();
// check if OCD is already initialized and it's locale is the same as the requested one
synchronized (ocdLock)
{
if ( ocd != null && ocdLocale != null && ocdLocale.equals(locale) )
{
return ocd;
}
}
ObjectClassDefinition xocd = null;
final Locale localeObj = Util.parseLocaleString(locale);
final ResourceBundle rb = osgiManager.resourceBundleManager.getResourceBundle(osgiManager.getBundleContext().getBundle(), localeObj);
final Map<String, ?> defaultConfig = osgiManager.getDefaultConfiguration();
// simple configuration properties
final ArrayList<AttributeDefinition> adList = new ArrayList<AttributeDefinition>();
for (int i = 0; i < CONF_PROPS.length; i++)
{
final String key = CONF_PROPS[i++];
final String defaultValue = ConfigurationUtil.getProperty( defaultConfig, key, CONF_PROPS[i] );
final String name = getString(rb, "metadata." + key + ".name", key); //$NON-NLS-1$ //$NON-NLS-2$
final String descr = getString(rb, "metadata." + key + ".description", key); //$NON-NLS-1$ //$NON-NLS-2$
adList.add( new AttributeDefinitionImpl(key, name, descr, defaultValue) );
}
// log level is select - so no simple default value; requires localized option labels
adList.add( new AttributeDefinitionImpl( OsgiManager.PROP_LOG_LEVEL,
getString(rb, "metadata.loglevel.name", OsgiManager.PROP_LOG_LEVEL), //$NON-NLS-1$
getString(rb, "metadata.loglevel.description", OsgiManager.PROP_LOG_LEVEL), //$NON-NLS-1$
AttributeDefinition.INTEGER, // type
new String[]
{ String.valueOf( ConfigurationUtil.getProperty( defaultConfig, OsgiManager.PROP_LOG_LEVEL,
OsgiManager.DEFAULT_LOG_LEVEL ) ) }, // default values
0, // cardinality
new String[] { // option labels
getString(rb, "log.level.debug", "Debug"), //$NON-NLS-1$ //$NON-NLS-2$
getString(rb, "log.level.info", "Information"), //$NON-NLS-1$ //$NON-NLS-2$
getString(rb, "log.level.warn", "Warn"), //$NON-NLS-1$ //$NON-NLS-2$
getString(rb, "log.level.error", "Error"), //$NON-NLS-1$ //$NON-NLS-2$
},
new String[] { "4", "3", "2", "1" } ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
// list plugins - requires localized plugin titles
final TreeMap<String, String> namesByClassName = new TreeMap<String, String>();
final String[] defaultPluginsClasses = OsgiManager.PLUGIN_MAP;
for ( int i = 0; i < defaultPluginsClasses.length; i++ )
{
final String clazz = defaultPluginsClasses[i++];
final String label = defaultPluginsClasses[i];
final String name = getString(rb, label + ".pluginTitle", label); //$NON-NLS-1$
namesByClassName.put(clazz, name);
}
final String[] classes = namesByClassName.keySet().toArray(
new String[namesByClassName.size()] );
final String[] names = namesByClassName.values().toArray( new String[namesByClassName.size()] );
adList.add( new AttributeDefinitionImpl( OsgiManager.PROP_ENABLED_PLUGINS,
getString(rb, "metadata.plugins.name", OsgiManager.PROP_ENABLED_PLUGINS), //$NON-NLS-1$
getString(rb, "metadata.plugins.description", OsgiManager.PROP_ENABLED_PLUGINS), //$NON-NLS-1$
AttributeDefinition.STRING, classes, Integer.MIN_VALUE, names, classes ) );
xocd = new ObjectClassDefinition()
{
private final AttributeDefinition[] attrs = adList
.toArray( new AttributeDefinition[adList.size()] );
public String getName()
{
return getString(rb, "metadata.name", "Apache Felix OSGi Management Console"); //$NON-NLS-1$ //$NON-NLS-2$
}
public InputStream getIcon( int arg0 )
{
return null;
}
public String getID()
{
return osgiManager.getConfigurationPid();
}
public String getDescription()
{
return getString(rb, "metadata.description", "Configuration of the Apache Felix OSGi Management Console."); //$NON-NLS-1$ //$NON-NLS-2$
}
public AttributeDefinition[] getAttributeDefinitions( int filter )
{
return ( filter == OPTIONAL ) ? null : attrs;
}
};
synchronized(ocdLock) {
this.ocd = xocd;
this.ocdLocale = locale;
}
return ocd;
}
private static class AttributeDefinitionImpl implements AttributeDefinition
{
private final String id;
private final String name;
private final String description;
private final int type;
private final String[] defaultValues;
private final int cardinality;
private final String[] optionLabels;
private final String[] optionValues;
AttributeDefinitionImpl( final String id, final String name, final String description, final String defaultValue )
{
this( id, name, description, STRING, new String[]
{ defaultValue }, 0, null, null );
}
AttributeDefinitionImpl( final String id, final String name, final String description, final int type,
final String[] defaultValues, final int cardinality, final String[] optionLabels,
final String[] optionValues )
{
this.id = id;
this.name = name;
this.description = description;
this.type = type;
this.defaultValues = defaultValues;
this.cardinality = cardinality;
this.optionLabels = optionLabels;
this.optionValues = optionValues;
}
public int getCardinality()
{
return cardinality;
}
public String[] getDefaultValue()
{
return defaultValues;
}
public String getDescription()
{
return description;
}
public String getID()
{
return id;
}
public String getName()
{
return name;
}
public String[] getOptionLabels()
{
return optionLabels;
}
public String[] getOptionValues()
{
return optionValues;
}
public int getType()
{
return type;
}
public String validate( String arg0 )
{
return null;
}
}
}