/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.oodt.cas.resource.mux;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.oodt.cas.resource.batchmgr.Batchmgr;
import org.apache.oodt.cas.resource.monitor.Monitor;
import org.apache.oodt.cas.resource.scheduler.Scheduler;
import org.apache.oodt.cas.resource.structs.exceptions.QueueManagerException;

/**
 * This manager keeps track of the mux-able backends for the resource manager.
 * It effectively maps a queue to the backend that this queue feeds.
 *
 * It uses a private BackendSet to keep track of everything.
 *
 * For reference, a backend is a set of the following:
 *    1. Batch manger, responsible for running jobs
 *    2. Scheduler, responsible for scheduling a job to run
 *    3. Monitor, responsible for managing nodes
 *
 * @author starchmd
 */
public class StandardBackendManager implements BackendManager {
    Map<String,BackendSet> queueToBackend = new HashMap<String,BackendSet>();

    /**
     * Add in a backend set to this manager.
     * @param queue - queue that maps to the given monitor, batchmgr, and scheduler
     * @param monitor - monitor used for this set
     * @param batchmgr - batch manager for this set
     * @param scheduler - scheduler for this set
     */
    public void addSet(String queue,Monitor monitor, Batchmgr batchmgr, Scheduler scheduler) {
        queueToBackend.put(queue, new BackendSet(monitor,batchmgr,scheduler));
    }
    /**
     * Return monitor for the given queue.
     * @param queue - queue to check
     * @return montior
     * @throws QueueManagerException when queue does not exist
     */
    public Monitor getMonitor(String queue) throws QueueManagerException {
        BackendSet set = queueToBackend.get(queue);
        if (set == null)
            throw new QueueManagerException("Queue '" + queue + "' does not exist");
        return set.monitor;
    }
    /**
     * Return batch manager for the given queue.
     * @param queue - queue to check
     * @return batchmgr
     * @throws QueueManagerException when queue does not exist
     */
    public Batchmgr getBatchmgr(String queue) throws QueueManagerException {
        BackendSet set = queueToBackend.get(queue);
        if (set == null)
            throw new QueueManagerException("Queue '" + queue + "' does not exist");
        return set.batchmgr;
    }
    /**
     * Return scheduler for the given queue.
     * @param queue - queue to check
     * @return scheduler
     * @throws QueueManagerException when queue does not exist
     */
    public Scheduler getScheduler(String queue) throws QueueManagerException {
        BackendSet set = queueToBackend.get(queue);
        if (set == null)
            throw new QueueManagerException("Queue '" + queue + "' does not exist");
        return set.scheduler;
    }
    /**
     * Return a list of all monitors.
     * @return list of all monitors
     */
    public List<Monitor> getMonitors() {
        List<Monitor> monitors = new LinkedList<Monitor>();
        for (BackendSet set : queueToBackend.values()) {
            monitors.add(set.monitor);
        }
        return monitors;
    }
    /**
     * Class that holds a set of the three backend pieces.
     * Private class, because no accessor/modifiers have been
     * created(public members). Acts like a struct.
     *
     * @author starchmd
     */
    private class BackendSet {
        public Monitor monitor = null;
        public Batchmgr batchmgr = null;
        public Scheduler scheduler = null;

        public BackendSet(Monitor monitor, Batchmgr batchmgr, Scheduler scheduler) {
            this.monitor = monitor;
            this.batchmgr = batchmgr;
            this.scheduler = scheduler;
        }
    }
}
