/*
 * Copyright 2014 LinkedIn Corp.
 * 
 * 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 azkaban.jobtype;

import java.util.HashMap;
import java.util.Map;

import azkaban.jobExecutor.Job;
import azkaban.utils.Props;

/**
 * Container for job type plugins
 * 
 * This contains the jobClass objects, the properties for loading plugins, and the
 * properties given by default to the plugin.
 * 
 * This class is not thread safe, so adding to this class should only be populated 
 * and controlled by the JobTypeManager
 */
public class JobTypePluginSet {
	private Map<String, Class<? extends Job>> jobToClass;
	private Map<String, Props> pluginJobPropsMap;
	private Map<String, Props> pluginLoadPropsMap;
	
	private Props commonJobProps;
	private Props commonLoadProps;
	
	/**
	 * Base constructor
	 */
	public JobTypePluginSet() {
		jobToClass = new HashMap<String, Class<? extends Job>>();
		pluginJobPropsMap = new HashMap<String, Props>();
		pluginLoadPropsMap = new HashMap<String, Props>();
	}
	
	/**
	 * Copy constructor
	 * @param clone
	 */
	public JobTypePluginSet(JobTypePluginSet clone) {
		jobToClass = new HashMap<String, Class<? extends Job>>(clone.jobToClass);
		pluginJobPropsMap = new HashMap<String, Props>(clone.pluginJobPropsMap);
		pluginLoadPropsMap = new HashMap<String, Props>(clone.pluginLoadPropsMap);
		commonJobProps = clone.commonJobProps;
		commonLoadProps = clone.commonLoadProps;
	}
	
	/**
	 * Sets the common properties shared in every jobtype
	 * @param commonJobProps
	 */
	public void setCommonPluginJobProps(Props commonJobProps) {
		this.commonJobProps = commonJobProps;
	}
	
	/**
	 * Sets the common properties used to load every plugin
	 * @param commonLoadProps
	 */
	public void setCommonPluginLoadProps(Props commonLoadProps) {
		this.commonLoadProps = commonLoadProps;
	}
	
	/**
	 * Gets common properties for every jobtype
	 * @return
	 */
	public Props getCommonPluginJobProps() {
		return commonJobProps;
	}
	
	/**
	 * Gets the common properties used to load a plugin
	 * @return
	 */
	public Props getCommonPluginLoadProps() {
		return commonLoadProps;
	}
	
	/**
	 * Get the properties for a jobtype used to setup and load a plugin
	 * 
	 * @param jobTypeName
	 * @return
	 */
	public Props getPluginLoaderProps(String jobTypeName) {
		return pluginLoadPropsMap.get(jobTypeName);
	}
	
	/**
	 * Get the properties that will be given to the plugin as default job
	 * properties.
	 * 
	 * @param jobTypeName
	 * @return
	 */
	public Props getPluginJobProps(String jobTypeName) {
		return pluginJobPropsMap.get(jobTypeName);
	}
	
	/**
	 * Gets the plugin job runner class
	 * 
	 * @param jobTypeName
	 * @return
	 */
	public Class<? extends Job> getPluginClass(String jobTypeName) {
		return jobToClass.get(jobTypeName);
	}
	
	/**
	 * Adds plugin jobtype class
	 */
	public void addPluginClass(String jobTypeName, Class<? extends Job> jobTypeClass) {
		jobToClass.put(jobTypeName, jobTypeClass);
	}
	
	/**
	 * Adds plugin job properties used as default runtime properties
	 */
	public void addPluginJobProps(String jobTypeName, Props props) {
		pluginJobPropsMap.put(jobTypeName, props);
	}
	
	/**
	 * Adds plugin load properties used to load the plugin
	 */
	public void addPluginLoadProps(String jobTypeName, Props props) {
		pluginLoadPropsMap.put(jobTypeName, props);
	}
}