eu.scape_project.planning.repository.RODAConnector.java Source code

Java tutorial

Introduction

Here is the source code for eu.scape_project.planning.repository.RODAConnector.java

Source

/*******************************************************************************
 * Copyright 2006 - 2012 Vienna University of Technology,
 * Department of Software Technology and Interactive Systems, IFS
 * 
 * Licensed 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 eu.scape_project.planning.repository;

import java.io.IOException;
import java.io.InputStream;
import java.net.Authenticator;
import java.net.InetAddress;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.configuration.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import eu.scape_project.planning.api.RepositoryConnectorApi;
import eu.scape_project.planning.utils.ConfigurationLoader;
import eu.scape_project.planning.utils.RepositoryConnectorException;

/**
 * @author Petar Petrov - <me@petarpetrov.org>
 * 
 */
public class RODAConnector implements RepositoryConnectorApi {

    private static final Logger LOGGER = LoggerFactory.getLogger(RODAConnector.class);

    private static final String RODA_NAME = "RODA";

    public static final String ENDPOINT_KEY = "repository.endpoint";

    public static final String USER_KEY = "repository.user";

    public static final String PASS_KEY = "repository.pass";

    private Map<String, String> config;

    /**
     * Loads the config using the {@link ConfigurationLoader}
     */
    public RODAConnector() {
        this.config = loadConfig();
    }

    public void updateConfig(Map<String, String> config) {
        for (String key : config.keySet()) {
            this.config.put(key, config.get(key));
        }
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String getRepositoryIdentifier() {
        return RODA_NAME + " " + this.config.get(ENDPOINT_KEY);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public InputStream downloadFile(String identifier) throws RepositoryConnectorException {
        return downloadFile(config, identifier);
    }

    private InputStream downloadFile(Map<String, String> config, String identifier)
            throws RepositoryConnectorException {
        String user = config.get(USER_KEY);
        String pass = config.get(PASS_KEY);

        this.isRequredConfigSet(ENDPOINT_KEY,
                "The RODA endpoint is not set. Cannot connect to " + this.getRepositoryIdentifier());
        this.isRequredConfigSet(user,
                "The user config parameter was not set. Cannot connect to " + this.getRepositoryIdentifier());
        this.isRequredConfigSet(pass,
                "The pass config parameter was not set. Cannot connect to " + this.getRepositoryIdentifier());

        Authenticator.setDefault(new RODAAuthenticator(user, pass));

        try {
            URL url = new URL(identifier);
            return url.openConnection().getInputStream();
        } catch (IOException e) {
            throw new RepositoryConnectorException(e);
        }
    }

    /**
     * Loads the config file and exposes it as a Map.
     * 
     * @return the map of properties.
     */
    private Map<String, String> loadConfig() {
        if (this.config != null) {
            return this.config;
        }

        ConfigurationLoader configurationLoader = new ConfigurationLoader();
        Configuration configuration = configurationLoader.load();
        if (configuration == null) {
            LOGGER.warn("An error occurred while reading the properties file.");
            return new HashMap<String, String>();
        }

        Map<String, String> map = new HashMap<String, String>();
        Iterator<String> configIt = configuration.getKeys();
        while (configIt.hasNext()) {
            String key = configIt.next();
            map.put(key, configuration.getString(key));
        }

        return map;
    }

    /**
     * Checks if the required configs are set and throws an error if not.
     * 
     * @param credential
     *            the credential to check.
     * @param error
     *            the error message
     * @throws RepositoryConnectorException
     *             if the required credential is not set.
     */
    private void isRequredConfigSet(String credential, String error) throws RepositoryConnectorException {
        if (credential == null) {
            throw new RepositoryConnectorException(error);
        }
    }

    /**
     * A simple authenticator for the RODA instances, where Basic Http
     * Authentication is in place.
     * 
     * @author Petar Petrov - <me@petarpetrov.org>
     * 
     */
    private class RODAAuthenticator extends Authenticator {

        private String user;

        private String pass;

        public RODAAuthenticator(String user, String pass) {
            this.user = user;
            this.pass = pass;
        }

        // This method is called when a password-protected URL is accessed
        protected PasswordAuthentication getPasswordAuthentication() {
            // Get information about the request
            String hostname = getRequestingHost();
            InetAddress ipaddr = getRequestingSite();
            LOGGER.info("Connection to '{}' [{}] is about to be established", hostname, ipaddr);
            String prompt = getRequestingPrompt();
            LOGGER.info("Authentication required: {}", prompt);

            // Return the information
            return new PasswordAuthentication(this.user, this.pass.toCharArray());
        }
    }

}