blob: 4d0271b9788b9e0a9cde840758a260b3e5771f4a [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.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.TreeMap;
import org.apache.felix.webconsole.internal.Util;
import org.osgi.service.metatype.AttributeDefinition;
import org.osgi.service.metatype.MetaTypeProvider;
import org.osgi.service.metatype.ObjectClassDefinition;
class ConfigurationMetatypeSupport extends ConfigurationSupport implements 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_CATEGORY, OsgiManager.DEFAULT_CATEGORY, //
OsgiManager.PROP_LOCALE, "", //$NON-NLS-1$
};
private final Object ocdLock = new Object();
private String ocdLocale;
private ObjectClassDefinition ocd;
ConfigurationMetatypeSupport( OsgiManager osgiManager )
{
super( osgiManager );
}
//---------- MetaTypeProvider
public String[] getLocales()
{
// there is no locale support here
return null;
}
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 defaultConfig = osgiManager.getDefaultConfiguration();
// simple configuration properties
final ArrayList adList = new ArrayList();
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 namesByClassName = new TreeMap();
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 = ( String[] ) namesByClassName.keySet().toArray( new String[namesByClassName.size()] );
final String[] names = ( String[] ) 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 = ( AttributeDefinition[] ) 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 final String getString( ResourceBundle rb, String key, String def )
{
try
{
return rb.getString( key );
}
catch ( Throwable t )
{
return def;
}
}
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;
}
}
}