/*
 * 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;


/**
 * WebConsoleConstants provides some common constants that are used by plugin
 * developers.
 */
public interface WebConsoleConstants
{

    /**
     * The name of the service to register as to be used as a "plugin" for
     * the OSGi Manager (value is "javax.servlet.Servlet").
     */
    public static final String SERVICE_NAME = "javax.servlet.Servlet"; //$NON-NLS-1$

    /**
     * The URI address label under which the OSGi Manager plugin is called by
     * the OSGi Manager (value is "felix.webconsole.label").
     * <p>
     * This service registration property must be set to a single non-empty
     * String value. Otherwise the {@link #SERVICE_NAME Servlet} services will
     * be ignored by the Felix Web Console and not be used as a plugin.
     */
    public static final String PLUGIN_LABEL = "felix.webconsole.label"; //$NON-NLS-1$

    /**
     * The title under which the OSGi Manager plugin is called by
     * the OSGi Manager (value is "felix.webconsole.title").
     * <p>
     * For {@link #SERVICE_NAME Servlet} services not extending the
     * {@link AbstractWebConsolePlugin} this property is required for the
     * service to be used as a plugin. Otherwise the service is just ignored
     * by the Felix Web Console.
     * <p>
     * For {@link #SERVICE_NAME Servlet} services extending from the
     * {@link AbstractWebConsolePlugin} abstract class this property is not
     * technically required. To support lazy service access, e.g. for plugins
     * implemented using the OSGi <i>Service Factory</i> pattern, the use
     * of this service registration property is encouraged.
     *
     * @since 2.0.0
     */
    public static final String PLUGIN_TITLE = "felix.webconsole.title"; //$NON-NLS-1$

    /**
     * The category under which the OSGi Manager plugin is listed in the top
     * navigation by the OSGi Manager (value is "felix.webconsole.category").
     * <p>
     * For {@link #SERVICE_NAME Servlet} services not extending the
     * {@link AbstractWebConsolePlugin} this property is required to declare a
     * specific category. Otherwise the plugin is put into the default category.
     * <p>
     * For {@link #SERVICE_NAME Servlet} services extending from the
     * {@link AbstractWebConsolePlugin} abstract class this property is not
     * technically required. To support lazy service access with categorization,
     * e.g. for plugins implemented using the OSGi <i>Service Factory</i>
     * pattern, the use of this service registration property is strongly
     * encouraged. If the property is missing the
     * {@link AbstractWebConsolePlugin#getCategory()} is called which should be
     * overritten.
     *
     * @since 3.1.3; Web Console Bundle 4.0.2
     */
    public static final String PLUGIN_CATEGORY = "felix.webconsole.category"; //$NON-NLS-1$

    /**
     * The property marking a service as a configuration printer.
     * This can be any service having either a printConfiguration(PrintWriter)
     * or printConfiguration(PrintWriter, String) method - this is according
     * to the ConfigurationPrinter and ModeAwareConfigurationPrinter
     * interfaces.
     *
     * If a service has a {@link #PLUGIN_LABEL}, {@link #PLUGIN_TITLE} and
     * this property, it is treated as a configuration printer service.
     *
     * @since 3.1.2; Web Console Bundle 3.1.4
     */
    public static final String CONFIG_PRINTER_MODES = "felix.webconsole.configprinter.modes"; //$NON-NLS-1$

    /**
     * Name of the optional service registration property indicating that a
     * {@link ConfigurationPrinter} service will provide HTML output when used
     * in {@link ConfigurationPrinter#MODE_WEB web} mode. If this property is
     * set to <code>true</code> the configuration printer is expected to
     * generate HTML output which will not be escaped. Otherwise output in web
     * mode is escaped for plain text use.
     *
     * @since 3.1.2; Web Console Bundle 3.1.4
     */
    public static final String CONFIG_PRINTER_WEB_UNESCAPED = "felix.webconsole.configprinter.web.unescaped"; //$NON-NLS-1$

    /**
     * The name of the service registration properties providing references
     * to addition CSS files that should be loaded when rendering the header
     * for a registered plugin.
     * <p>
     * This property is expected to be a single string value, array of string
     * values or a Collection (or Vector) of string values.
     * <p>
     * This service registration property is only used for plugins registered
     * as {@link #SERVICE_NAME} services which do not extend the
     * {@link AbstractWebConsolePlugin}. Extensions of the
     * {@link AbstractWebConsolePlugin} should overwrite the
     * {@link AbstractWebConsolePlugin#getCssReferences()} method to provide
     * additional CSS resources.
     *
     * @since 2.0.0
     */
    public static final String PLUGIN_CSS_REFERENCES = "felix.webconsole.css"; //$NON-NLS-1$

    /**
     * The name of the request attribute providing the absolute path of the
     * Web Console root (value is "felix.webconsole.appRoot"). This consists of
     * the servlet context path (from <code>HttpServletRequest.getContextPath()</code>)
     * and the Web Console servlet path (from
     * <code>HttpServletRequest.getServletPath()</code>,
     * <code>/system/console</code> by default).
     * <p>
     * The type of this request attribute is <code>String</code>.
     *
     * @since 2.0.0
     */
    public static final String ATTR_APP_ROOT = "felix.webconsole.appRoot"; //$NON-NLS-1$

    /**
     * The name of the request attribute providing the absolute path of the
     * current plugin (value is "felix.webconsole.pluginRoot"). This consists of
     * the servlet context path (from <code>ServletRequest.getContextPath()</code>),
     * the configured path of the web console root (<code>/system/console</code>
     * by default) and the plugin label {@link #PLUGIN_LABEL}.
     * <p>
     * The type of this request attribute is <code>String</code>.
     *
     * @since 1.2.12
     */
    public static final String ATTR_PLUGIN_ROOT = "felix.webconsole.pluginRoot"; //$NON-NLS-1$

    /**
     * The name of the request attribute providing a mapping of labels to page
     * titles of registered console plugins (value is "felix.webconsole.labelMap").
     * This map may be used to render a navigation of the console plugins as the
     * {@link AbstractWebConsolePlugin#renderTopNavigation(javax.servlet.http.HttpServletRequest, java.io.PrintWriter)}
     * method does.
     * <p>
     * The type of this request attribute is <code>Map<String, String></code>.
     *
     * @since 2.0.0
     */
    public static final String ATTR_LABEL_MAP = "felix.webconsole.labelMap"; //$NON-NLS-1$

    /**
     * The name of the request attribute holding the {@link VariableResolver}
     * for the request (value is "felix.webconsole.variable.resolver").
     *
     * @see VariableResolver
     * @see WebConsoleUtil#getVariableResolver(javax.servlet.ServletRequest)
     * @see WebConsoleUtil#setVariableResolver(javax.servlet.ServletRequest, VariableResolver)
     * @since 3.0
     */
    static final String ATTR_CONSOLE_VARIABLE_RESOLVER = "felix.webconsole.variable.resolver"; //$NON-NLS-1$

    /**
     * The name of the request attribute holding the language {@link java.util.Map}
     * for the request (value is "felix.webconsole.langMap").
     *
     * This map contains the web console supported languages, which are automatically detected.
     * The keys of the map are the language codes, like "en", "en_US" .. and so-on.
     * The value for each key is the locale user-friendly name - exactly the same as
     * returned by {@link java.util.Locale#getDisplayLanguage()}.
     *
     * The automatic detection of languages is very simple. It relies on having a
     * 'res/flags/[lang].gif' file in the bundle. So translators should not only provide
     * localized l10n/bundle.properties but also a flag image.
     *
     * The image should be obtained from http://famfamfam.com/lab/icons/flags/ and eventually
     * renamed to the correct locale.
     *
     * @since 3.1.2
     */
    public static final String ATTR_LANG_MAP = "felix.webconsole.langMap"; //$NON-NLS-1$
}
