package eu.dnetlib.common.interfaces.nh;

import java.util.List;

import eu.dnetlib.common.interfaces.profile.IServiceProfile;
import eu.dnetlib.common.nh.BlackboardMessage;
import eu.dnetlib.common.profile.ProfileListener;




/**
 * @author Jochen Schirrwagen (jochen.schirrwagen@uni-bielefeld.de)
 *
 */
public interface IMessageHandler{
	
	public void addProfileListener(ProfileListener profileListener);
	public List<BlackboardMessage> getBlackboardMessages(String aProfile) throws MessageException;
	public List<BlackboardMessage> getBlackboardMessages(IServiceProfile aProfile) throws MessageException;
	public BlackboardMessage getLastBlackboardMessage(String aProfile) throws MessageException;
	public BlackboardMessage getLastBlackboardMessage(IServiceProfile aProfile) throws MessageException;

	/**
	 * @param aProfileId
	 * @param resourceType
	 * @return
	 * @throws MessageException
	 */
	public String lookupProfile(String aProfileId, String resourceType) throws MessageException;
	
	/**
	 * @param xquery
	 * @return
	 * @throws CommunicationException
	 */
	public List<String> listProfiles(String xquery)throws MessageException;
	
	/**
	 * @param aProfileId
	 * @param aResourceProfile
	 * @param aResourceType
	 * @param aUpdateRemote
	 * @throws MessageException
	 */
	public void updateProfile(String aProfileId, String aResourceProfile, String aResourceType, boolean aUpdateRemote) throws MessageException;
	
	public String marshalProfile(IServiceProfile aProfile) throws MessageException;
	public void releaseProfile(String aProfileId) throws MessageException;
	public String subscribe(String topicExpression) throws MessageException;
	
	
	/**
	 * @param aResourceType
	 * @return a list of service profile objects
	 * @throws CommunicationException
	 */
	public List<IServiceProfile> lookupServiceProfiles(String aResourceType) throws MessageException;
	
	public void replyBlackboardMessage(String profileId, BlackboardMessage aBlackboardMessage) throws MessageException;
	public void sendBlackboardMessage(String profileId, BlackboardMessage blackboardMessage) throws MessageException;


}
