/*
 * JBoss, Home of Professional Open Source
 * Copyright 2010, Red Hat, Inc., and individual contributors
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * 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 org.jboss.cdi.tck.impl;

import javax.enterprise.context.spi.Context;

import org.jboss.cdi.tck.api.Configuration;
import org.jboss.cdi.tck.spi.Beans;
import org.jboss.cdi.tck.spi.Contexts;
import org.jboss.cdi.tck.spi.EL;

/**
 * CDI TCK configuration implementation.
 *
 * @author Pete Muir
 * @author Martin Kouba
 */
public class ConfigurationImpl implements Configuration {

    private Beans beans;
    private Contexts<? extends Context> contexts;
    private EL el;

    private String libraryDirectory;

    private String testDataSource;
    private String testJmsConnectionFactory;
    private String testJmsQueue;
    private String testJmsTopic;
    private int testTimeoutFactor;

    protected ConfigurationImpl() {
    }

    public Beans getBeans() {
        return beans;
    }

    public void setBeans(Beans beans) {
        this.beans = beans;
    }

    @SuppressWarnings("unchecked")
    public <T extends Context> Contexts<T> getContexts() {
        return (Contexts<T>) contexts;
    }

    public <T extends Context> void setContexts(Contexts<T> contexts) {
        this.contexts = contexts;
    }

    public EL getEl() {
        return el;
    }

    public void setEl(EL el) {
        this.el = el;
    }

    public String getLibraryDirectory() {
        return libraryDirectory;
    }

    public void setLibraryDirectory(String libraryDirectory) {
        this.libraryDirectory = libraryDirectory;
    }

    public String getTestDataSource() {
        return testDataSource;
    }

    public void setTestDataSource(String testDataSource) {
        this.testDataSource = testDataSource;
    }

    @Override
    public String getTestJmsConnectionFactory() {
        return testJmsConnectionFactory;
    }

    @Override
    public void setTestJmsConnectionFactory(String testJmsConnectionFactory) {
        this.testJmsConnectionFactory = testJmsConnectionFactory;
    }

    @Override
    public String getTestJmsQueue() {
        return testJmsQueue;
    }

    @Override
    public void setTestJmsQueue(String testJmsQueue) {
        this.testJmsQueue = testJmsQueue;
    }

    @Override
    public String getTestJmsTopic() {
        return testJmsTopic;
    }

    @Override
    public void setTestJmsTopic(String testJmsTopic) {
        this.testJmsTopic = testJmsTopic;
    }

    @Override
    public int getTestTimeoutFactor() {
        return testTimeoutFactor;
    }

    @Override
    public void setTestTimeoutFactor(int timeoutFactor) {
        if(timeoutFactor <= 0) {
            throw new IllegalArgumentException("Test timeout factor must be greater than zero");
        }
        this.testTimeoutFactor = timeoutFactor;
    }

    @Override
    public String toString() {
        StringBuilder configuration = new StringBuilder();
        configuration.append("JSR 365 TCK Configuration\n");
        configuration.append("-----------------\n");
        configuration.append("\tBeans: ").append(getBeans()).append("\n");
        configuration.append("\tContexts: ").append(getContexts()).append("\n");
        configuration.append("\tEL: ").append(getEl()).append("\n");
        configuration.append("\tLibrary dir: ").append(getLibraryDirectory()).append("\n");
        configuration.append("\tTest DS: ").append(getTestDataSource()).append("\n");
        configuration.append("\tTest JMS connection factory: ").append(getTestJmsConnectionFactory()).append("\n");
        configuration.append("\tTest JMS queue: ").append(getTestJmsQueue()).append("\n");
        configuration.append("\tTest JMS topic: ").append(getTestJmsTopic()).append("\n");
        configuration.append("\tTest timeout factor: ").append(getTestTimeoutFactor()).append("\n");
        configuration.append("\n");
        return configuration.toString();
    }

}
