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

jadex.rules.rulesystem.rete.extractors.JavaArrayExtractor Maven / Gradle / Ivy

package jadex.rules.rulesystem.rete.extractors;

import java.lang.reflect.Array;

import jadex.rules.rulesystem.rete.Tuple;
import jadex.rules.state.IOAVState;
import jadex.rules.state.OAVAttributeType;

/**
 *  An extractor for getting elements from arrays.
 */
public class JavaArrayExtractor implements IValueExtractor
{
	//-------- attributes --------
	
	/** The object extractor. */
	protected IValueExtractor	objex;
	
	/** The index value extractor. */
	protected IValueExtractor	index;
	
	//-------- constructors --------
	
	/**
	 *  Create a new array extractor.
	 *  @param objex	The object extractor.
	 *  @param index	The index extractor.
	 */
	public JavaArrayExtractor(IValueExtractor objex, IValueExtractor index)
	{
		this.objex	= objex;
		this.index	= index;
	}
	
	//-------- IValueExtractor interface --------
	
	/**
	 *  Get the value of an attribute from an object or tuple.
	 *  @param left The left input tuple. 
	 *  @param right The right input object.
	 *  @param prefix The prefix input object (last value from previous extractor in a chain).
	 *  @param state The working memory.
	 */
	public Object getValue(Tuple left, Object right, Object prefix, IOAVState state)
	{
		Object	array	= objex.getValue(left, right, prefix, state);
		int	i	= ((Number)index.getValue(left, right, prefix, state)).intValue();
		return Array.get(array, i);
	}

	/**
	 *  Test if a constraint evaluator is affected from a 
	 *  change of a certain attribute.
	 *  @param tupleindex The tuple index (-1 for object).
	 *  @param attr The attribute.
	 *  @return True, if affected.
	 */
	public boolean isAffected(int tupleindex, OAVAttributeType attr)
	{
		return objex.isAffected(tupleindex, attr) || index.isAffected(tupleindex, attr);
	}

	/**
	 *  Get the set of relevant attribute types.
	 *  @return The relevant attribute types.
	 */
	public AttributeSet	getRelevantAttributes()
	{
		AttributeSet ret = new AttributeSet();
		AttributeSet objrel	= objex.getRelevantAttributes();
		AttributeSet indrel	= index.getRelevantAttributes();
		
		ret.addAll(objrel);
		ret.addAll(indrel);
		
		return ret;
		
//		if(!objrel.isEmpty() && !indrel.isEmpty())
//		{
//			ret	= new HashSet();
//			ret.addAll(objrel);
//			ret.addAll(indrel);
//		}
//		else if(objrel.isEmpty())
//		{
//			ret	= indrel;
//		}
//		else
//		{
//			ret	= objrel;
//		}
//		return ret;
	}

	/**
	 *  Get the set of indirect attribute types.
	 *  I.e. attributes of objects, which are not part of an object conditions
	 *  (e.g. for chained extractors) 
	 *  @return The relevant attribute types.
	 */
	public AttributeSet	getIndirectAttributes()
	{
		// Todo... also in method extractor!?
		return AttributeSet.EMPTY_ATTRIBUTESET;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy