/**
 * This file is part of CloudML [ http://cloudml.org ]
 *
 * Copyright (C) 2012 - SINTEF ICT
 * Contact: Franck Chauvel <franck.chauvel@sintef.no>
 *
 * Module: root
 *
 * CloudML is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 3 of
 * the License, or (at your option) any later version.
 *
 * CloudML is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General
 * Public License along with CloudML. If not, see
 * <http://www.gnu.org/licenses/>.
 */
/*
 */
package org.cloudml.core.credentials;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.cloudml.core.Provider;

public class FileCredentials implements Credentials {

    public static final String DEFAULT_PATH = "credentials.properties";
    
    private static final String NONE = null;
    private String path;
    private String login;
    private String password;
    
    
    public FileCredentials() {
        this(DEFAULT_PATH);
    }

    public FileCredentials(String pathToCredentials) {
        path = pathToCredentials;
    }
    
    public String getPathToCredentials() {
        return path;
    }

    @Override
    public String getLogin() {
        initializeIfNeeded();
        return login;
    }

    @Override
    public String getPassword() {
        initializeIfNeeded();
        return password;
    }

    private boolean notYetInitialized() {
        return (login == NONE || password == NONE);
    }

    private void initializeCredentials() {
        FileInputStream in = null;
        try {
            Properties props = new Properties();
            in = new FileInputStream(this.path);
            props.load(in);

            login = props.getProperty("login");
            password = props.getProperty("passwd");

        } catch (IOException ex) {
            Logger.getLogger(Provider.class.getName()).log(Level.SEVERE, "Missing credentials", new Object[]{});
        }
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                Logger.getLogger(Provider.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private void initializeIfNeeded() {
        if (notYetInitialized()) {
            initializeCredentials();
        }
    }
}
