All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jadex.tools.comanalyzer.graph.MessageNumberIndexFunction Maven / Gradle / Ivy

Go to download

The Jadex tools comanalyzer package contains the ComAnalyzer JCC plugin for observing the communication between Jadex components.

The newest version!
package jadex.tools.comanalyzer.graph;

import jadex.tools.comanalyzer.Message;
import jadex.tools.comanalyzer.graph.GraphCanvas.AgentGroup;
import jadex.tools.comanalyzer.graph.GraphCanvas.MessageGroup;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.util.EdgeIndexFunction;
import edu.uci.ics.jung.graph.util.Pair;


/**
 * A class which creates and maintains indices for the edges so that parallel
 * edges are sorted. In this case the edges are sorted by the sequence number
 * of the message. This only applies for the directed multigraph because
 * in any other case only one message is in the edge (message group).
 */
public class MessageNumberIndexFunction implements EdgeIndexFunction
{
	// -------- attributes --------

	/** The map of edge indices */
	protected Map edge_index = new HashMap();

	// -------- EdgeIndexFunction interface --------

	/**
	 * Returns the index for the specified message group. Calculates the indices
	 * for the current group and for all groups parallel to this group. Only
	 * groups with only one containing message are considered.
	 * 
	 * @param graph The graph.
	 * @param group The message group.
	 * @return The index for the message group.
	 */
	public int getIndex(Graph graph, Object group)
	{
		Integer index = (Integer)edge_index.get(group);
		if(index == null)
		{
			if(((MessageGroup)group).isSingelton())
			{
				Pair ep = graph.getEndpoints(group);
				List comedgeset = new ArrayList();
				comedgeset.addAll(graph.findEdgeSet(ep.getFirst(), ep.getSecond()));

				Collections.sort(comedgeset, new Comparator()
				{
					public int compare(Object o1, Object o2)
					{
						MessageGroup mg1 = (MessageGroup)o1;
						MessageGroup mg2 = (MessageGroup)o2;

						if(mg1.isSingelton() && mg2.isSingelton())
						{
							Message m1 = (Message)mg1.getSingelton();
							Message m2 = (Message)mg2.getSingelton();
							return m1.compareTo(m2);
						}
						else
						{
							return 0;
						}
					}
				});

				int count = 0;
				for(Iterator it = comedgeset.iterator(); it.hasNext();)
				{
					MessageGroup other = (MessageGroup)it.next();
					Message m1 = (Message)((MessageGroup)group).getSingelton();
					Message m2 = (Message)((MessageGroup)other).getSingelton();
					if(!(m1.equals(m2)))
					{
						edge_index.put(other, Integer.valueOf(count));
						count++;
					}
				}
				edge_index.put(group, Integer.valueOf(count));
				index = Integer.valueOf(count);
			} else {
				index = Integer.valueOf(0);
			}
		}
		return index.intValue();
	}

	/**
	 * Resets the indices for this edge group and its parallel groups. Should be
	 * invoked when an edge parallel to the group has been added or removed.
	 * @param group
	 */
	public void reset(Graph graph, Object group)
	{
		Pair endpoints = graph.getEndpoints(group);
		getIndex(graph, (MessageGroup)group, (AgentGroup)endpoints.getFirst());
		getIndex(graph, (MessageGroup)group, (AgentGroup)endpoints.getFirst(), (AgentGroup)endpoints.getSecond());
	}

	/**
	 * Clears all edge indices for all edges in all graphs. Does not recalculate
	 * the indices.
	 */
	public void reset()
	{
		edge_index.clear();
	}

	// -------- helper methods --------

	/**
	 * Returns the index for the message group.
	 * 
	 * @param graph The graph.
	 * @param group The message group.
	 * @param agents1 The first agent group.
	 * @param agents2 The second agent group.
	 * @return The index of the message group.
	 */
	protected int getIndex(Graph graph, MessageGroup group, AgentGroup agents1, AgentGroup agents2)
	{
		Collection commonEdgeSet = new HashSet(graph.getIncidentEdges(agents1));
		int count = 0;
		for(Iterator it = commonEdgeSet.iterator(); it.hasNext();)
		{
			MessageGroup other = (MessageGroup) it.next();
			if(!group.equals(other))
			{
				edge_index.put(other, Integer.valueOf(count));
				count++;
			}
		}
		edge_index.put(group, Integer.valueOf(count));
		return count;
	}

	/**
	 * Returns the index for the message group.
	 * 
	 * @param graph The graph.
	 * @param e The message group.
	 * @param v The agent group.
	 * @return The index of the group.
	 */
	protected int getIndex(Graph graph, MessageGroup e, AgentGroup v)
	{
		Collection commonedgeset = new HashSet();
		for(Iterator it = graph.getIncidentEdges(v).iterator(); it.hasNext();)
		{
			MessageGroup other = (MessageGroup) it.next();
			AgentGroup u = (AgentGroup)graph.getOpposite(v, other);
			if(u.equals(v))
			{
				commonedgeset.add(other);
			}
		}
		int count = 0;
		for(Iterator it = commonedgeset.iterator(); it.hasNext();)
		{
			MessageGroup other = (MessageGroup)it.next();
			if(!e.equals(other))
			{
				edge_index.put(other, Integer.valueOf(count));
				count++;
			}
		}
		edge_index.put(e, Integer.valueOf(count));
		return count;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy