/*******************************************************************************
* Copyright (c)                                                                *
*           2005   Tristan Allwood,                                            *
*           2005   Daniel Burke,                                               *
*           2005   Marc Hull,                                                  *
*           2005   Ekaterina Itskova,                                          *
*           2005   Steve Zymler                                                *
*                                                                              *
* Permission is hereby granted, free of charge, to any person obtaining a      *
* copy of this software and associated documentation files (the                *
* "Software"), to deal in the Software without restriction, including          *
* without limitation the rights to use, copy, modify, merge, publish,          *
* distribute, sublicense, and/or sell copies of the Software, and to           *
* permit persons to whom the Software is furnished to do so, subject to        *
* the following conditions:                                                    *
*                                                                              *
* The above copyright notice and this permission notice shall be included      *
* in all copies or substantial portions of the Software.                       *
*                                                                              *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS      *
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF                   *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.       *
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY         *
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,         *
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE            *
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                       *
*******************************************************************************/
/*
 * Created on 25-Oct-2004
 *
 */
package uk.ac.ic.doc.kevlar.core.framework;

import java.util.List;

/**
 * @author Daniel Burke and Steve Zymler
 *
 */
public interface IContextListener {
    /**
     * Called after a successful call to IContext.addProgram
     * @param refID the id that was passed to IContext.addProgram
     */
	void programAdded(long refID);
	
	/**
	 * Called after an unsuccessful call to IContext.addProgram
	 * @param refID the id that was passed to IContext.addProgram
	 */
	void programAddFailed(long refID);
	
    /**
     * Called after a successful call to IContext.addPipe
     * @param refID the id that was passed to IContext.addPipe
     */
	void pipeAdded(long refID);
	
	/**
	 * Called after an unsuccessful call to IContext.addPipe
	 * @param refID the id that was passed to IContext.addProgram
	 * @param problemPipes the pipes that failed the type check when the pipe was added
	 * Note: pipe
	 */
	void pipeAddFailed(long refID, List<IPipe> problemPipes);
	
	/**
	 * Called after a call to IContext.removePipe
	 * @param refID the id of the removed pipe
	 */
	void pipeRemoved(long refID);
	
	/**
	 * Called after a call to IContext.removeProgram
	 * @param refID the removed program's id
	 */
	void programRemoved(long refID);
	
	/**
	 * Called after a call to IContext.addArgument or 
	 * IContext.updateArgumentInstance
	 * @param refID the id of the program that has new argument state
	 */
	void programStateChanged(long refID);
	
	/**
	 * Called if a program is removed by the program loader
	 * (Can happen if the Jar file is deleted)
	 * All pipes are guaranteed to fail before this is called
	 * @param refID the id program that had to be removed
	 */
	void programFailed(long refID);
	
	/**
	 * Called when a program's argument changes cause
	 * some pipes to no longer be type-checked
	 * Therefore they are removed from the system
	 * @param refID the id of the pipe that has failed
	 */
	void pipeFailed(long refID);
	
	/**
	 * Called if a program is removed by the program loader
	 * (Called once for each connected pipe)
	 * Also called when a program's argument changes cause
	 * some pipes to have to be removed from the system
	 * due to the nodes dissapearing
	 * @param refID the id of the pipe that has failed
	 */
	void pipeLost(long refID);
}
