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


import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.commons.io.IOUtils;


/**
 * The <code>DefaultBrandingPlugin</code> class is the default implementation
 * of the {@link BrandingPlugin} interface. The singleton instance of this
 * class is used as branding plugin if no BrandingPlugin service is registered
 * in the system.
 * <p>
 * This default implementation provides Apache Felix based default branding
 * as follows:
 * <table summary="Web Console Branding Properties">
 * <tr><th>Name</th><th>Property Name</th><th>Default Value</th></tr>
 * <tr>
 *  <td>Brand Name</td>
 *  <td>webconsole.brand.name</td>
 *  <td>Apache Felix Web Console</td>
 * </tr>
 * <tr>
 *  <td>Product Name</td>
 *  <td>webconsole.product.name</td>
 *  <td>Apache Felix</td>
 * </tr>
 * <tr>
 *  <td>Product URL</td>
 *  <td>webconsole.product.url</td>
 *  <td>http://felix.apache.org</td>
 * </tr>
 * <tr>
 *  <td>Product Image</td>
 *  <td>webconsole.product.image</td>
 *  <td>/res/imgs/logo.png</td>
 * </tr>
 * <tr>
 *  <td>Vendor Name</td>
 *  <td>webconsole.vendor.name</td>
 *  <td>The Apache Software Foundation</td>
 * </tr>
 * <tr>
 *  <td>Vendor URL</td>
 *  <td>webconsole.vendor.url</td>
 *  <td>http://www.apache.org</td>
 * </tr>
 * <tr>
 *  <td>Vendor Image</td>
 *  <td>webconsole.vendor.image</td>
 *  <td>/res/imgs/logo.png</td>
 * </tr>
 * <tr>
 *  <td>Favourite Icon</td>
 *  <td>webconsole.favicon</td>
 *  <td>/res/imgs/favicon.ico</td>
 * </tr>
 * <tr>
 *  <td>Main Stylesheet</td>
 *  <td>webconsole.stylesheet</td>
 *  <td>/res/ui/admin.css</td>
 * </tr>
 * </table>
 * <p>
 * If a properties file <code>META-INF/webconsole.properties</code> is available
 * through the class loader of this class, the properties overwrite the default
 * settings according to the property names listed above. The easiest way to
 * add such a properties file is to provide a fragment bundle with the file.
 */
public class DefaultBrandingPlugin implements BrandingPlugin
{

    /**
     * The name of the bundle entry providing branding properties for this
     * default branding plugin (value is "/META-INF/webconsole.properties").
     */
    private static final String BRANDING_PROPERTIES = "/META-INF/webconsole.properties"; //$NON-NLS-1$

    private static DefaultBrandingPlugin instance;

    private final String brandName;

    private final String productName;

    private final String productURL;

    private final String productImage;

    private final String vendorName;

    private final String vendorURL;

    private final String vendorImage;

    private final String favIcon;

    private final String mainStyleSheet;


    private DefaultBrandingPlugin()
    {
        Properties props = new Properties();

        // try to load the branding properties
        InputStream ins = getClass().getResourceAsStream( BRANDING_PROPERTIES );
        if ( ins != null )
        {
            try
            {
                props.load( ins );
            }
            catch ( IOException ignore )
            { /* ignore - will use defaults */
            }
            finally
            {
                IOUtils.closeQuietly( ins );
            }
        }

        // set the fields from the properties now
        brandName = props.getProperty( "webconsole.brand.name", "Apache Felix Web Console" ); //$NON-NLS-1$
        productName = props.getProperty( "webconsole.product.name", "Apache Felix" ); //$NON-NLS-1$
        productURL = props.getProperty( "webconsole.product.url", "http://felix.apache.org" ); //$NON-NLS-1$
        productImage = props.getProperty( "webconsole.product.image", "/res/imgs/logo.png" ); //$NON-NLS-1$
        vendorName = props.getProperty( "webconsole.vendor.name", "The Apache Software Foundation" ); //$NON-NLS-1$
        vendorURL = props.getProperty( "webconsole.vendor.url", "http://www.apache.org" ); //$NON-NLS-1$
        vendorImage = props.getProperty( "webconsole.vendor.image", "/res/imgs/logo.png" ); //$NON-NLS-1$
        favIcon = props.getProperty( "webconsole.favicon", "/res/imgs/favicon.ico" ); //$NON-NLS-1$
        mainStyleSheet = props.getProperty( "webconsole.stylesheet", "/res/ui/webconsole.css" ); //$NON-NLS-1$
    }


    /**
     * Retrieves the shared instance
     * 
     * @return the singleton instance of the object
     */
    public static DefaultBrandingPlugin getInstance()
    {
        if ( instance == null )
        {
            instance = new DefaultBrandingPlugin();
        }
        return instance;
    }


    /**
     * @see org.apache.felix.webconsole.BrandingPlugin#getBrandName()
     */
    public String getBrandName()
    {
        return brandName;
    }


    /**
     * @see org.apache.felix.webconsole.BrandingPlugin#getProductName()
     */
    public String getProductName()
    {
        return productName;
    }


    /**
     * @see org.apache.felix.webconsole.BrandingPlugin#getProductURL()
     */
    public String getProductURL()
    {
        return productURL;
    }


    /**
     * @see org.apache.felix.webconsole.BrandingPlugin#getProductImage()
     */
    public String getProductImage()
    {
        return productImage;
    }


    /**
     * @see org.apache.felix.webconsole.BrandingPlugin#getVendorName()
     */
    public String getVendorName()
    {
        return vendorName;
    }


    /**
     * @see org.apache.felix.webconsole.BrandingPlugin#getVendorURL()
     */
    public String getVendorURL()
    {
        return vendorURL;
    }


    /**
     * @see org.apache.felix.webconsole.BrandingPlugin#getVendorImage()
     */
    public String getVendorImage()
    {
        return vendorImage;
    }


    /**
     * @see org.apache.felix.webconsole.BrandingPlugin#getFavIcon()
     */
    public String getFavIcon()
    {
        return favIcon;
    }


    /**
     * @see org.apache.felix.webconsole.BrandingPlugin#getMainStyleSheet()
     */
    public String getMainStyleSheet()
    {
        return mainStyleSheet;
    }
}
