/*
 * @author Ranides Atterwim <ranides@gmail.com>
 * @copyright Ranides Atterwim
 * @license WTFPL
 * @url http://ranides.net/projects/assira
 */
package net.ranides.assira.config;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Map;

/**
 * Klasa obsługująca dostęp do plików z konfiguracją w formacie JSON. 
 * @author ranides
 */
public class JSONConfiguration extends AbstractConfiguration {
    
    private static final ObjectMapper mapper;
        
    static {
        mapper = new ObjectMapper();
        mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
    }

    /**
     * Tworzy nową konfigurację powiązaną z zasobem wskazywanym przez ścieżkę.
     * Wskazany zasób musi prowadzić do treści w formacie JSON.
     * @param path
     */
    public JSONConfiguration(String path) {
        super(path);
    }

    @Override
    public Configuration load() throws ConfigException {
        try {
            if("file".equals(protocol)) {
                values = mapper.readValue(new File(location), new TypeReference<Map<String,Object>>(){});
                return this;
            }
            if("url".equals(protocol)) {
                values = mapper.readValue(new URL(location), new TypeReference<Map<String,Object>>(){});
                return this;
            }
        } catch(IOException cause) {
            throw new ConfigException(cause);
        }
        return this;
    }

    @Override
    public Configuration save() throws ConfigException {
        try {
            if("file".equals(protocol)) {
                mapper.writeValue(new File(location), values);
                return this;
            }
        } catch(IOException cause) {
            throw new ConfigException(cause);
        }
        throw new ConfigException("You can save configuration to files only.");
    }
    
}
