BulkOperation.java

package eu.javaexperience.rpc.bulk;

import java.util.Collection;
import java.util.HashSet;

import eu.javaexperience.collection.CollectionTools;

public abstract class BulkOperation<K, M>
{
	protected final HashSet<K> supported;
	
	public BulkOperation(K... supported)
	{
		this.supported = new HashSet<K>();
	}
	
	public static class RequestedFields<K, M>
	{
		protected BulkOperation<K, M> owner;
		
		public RequestedFields(BulkOperation<K, M> owner)
		{
			this.owner = owner;
		}
		
		protected HashSet<K> req = new HashSet<K>();
		
		public BulkOperation<K, M> getOwner()
		{
			return owner;
		}
		
		public boolean needReport(K supported)
		{
			return this.req.contains(supported);
		}
	}
	
	public RequestedFields<K, M> readRequestedFields(K... req)
	{
		RequestedFields<K, M> ret = new RequestedFields<>(this);
		
		for(K r:req)
		{
			if(isFieldSupported(r))
			{
				ret.req.add(r);
			}
		}
		
		return ret;
	}
	
	public boolean isFieldSupported(K r)
	{
		return supported.contains(r);
	}
	
	public void fillSupportedResults(Collection<K> dst)
	{
		CollectionTools.copyInto(supported, dst);
	}
	
	public abstract M createResult();
	
	public abstract BulkResult<K, M> invoke
	(
		K[] results,
		Object[] params
	);
}