//
//  ========================================================================
//  Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//

package org.eclipse.jetty.deploy;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.eclipse.jetty.util.annotation.ManagedAttribute;
import org.eclipse.jetty.util.annotation.ManagedObject;
import org.eclipse.jetty.util.annotation.ManagedOperation;
import org.eclipse.jetty.util.annotation.Name;
import org.eclipse.jetty.util.resource.Resource;

/**
 * FileConfigurationManager
 * 
 * Supplies properties defined in a file.
 */
@ManagedObject("Configure deployed webapps via properties")
public class PropertiesConfigurationManager implements ConfigurationManager
{
    private String _properties;
    private final Map<String,String> _map = new HashMap<String,String>();

    public PropertiesConfigurationManager(String properties)
    {
    }
    
    public PropertiesConfigurationManager()
    {
    }

    @ManagedAttribute("A file or URL of properties")
    public void setFile(String resource) throws MalformedURLException, IOException
    {
        _properties=resource;
        _map.clear();
        loadProperties(_properties);
    }

    public String getFile()
    {
        return _properties;
    }
    
    @ManagedOperation("Set a property")
    public void put(@Name("name")String name, @Name("value")String value)
    {
        _map.put(name,value);
    }
    
    /**
     * @see org.eclipse.jetty.deploy.ConfigurationManager#getProperties()
     */
    @Override
    public Map<String, String> getProperties()
    {
        return new HashMap<>(_map);
    }

    private void loadProperties(String resource) throws FileNotFoundException, IOException
    {   
        Resource file=Resource.newResource(resource);
        if (file!=null && file.exists())
        {
            Properties properties = new Properties();
            properties.load(file.getInputStream());
            for (Map.Entry<Object, Object> entry : properties.entrySet())
                _map.put(entry.getKey().toString(),String.valueOf(entry.getValue()));
        }
    }
}
