SlidingProcessor.java
package eu.javaexperience.text.processor;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import eu.javaexperience.interfaces.simple.getBy.GetBy1;
import eu.javaexperience.reflect.Mirror;
public class SlidingProcessor
{
public static class SlidingProcessorExaminer
{
public String name;
public GetBy1<String, String> examiner;
public SlidingProcessorExaminer(String name, GetBy1<String, String> examiner)
{
this.name = name;
this.examiner = examiner;
}
public void tryExamineAndPlace(SlidingProcessor sp, String unit)
{
String s = examiner.getBy(unit);
if(null != s)
{
sp.current.put(name, s);
}
}
}
protected Map<String, String> current = new HashMap<>();
protected Map<String, SlidingProcessorExaminer> examiners = new HashMap<>();
public SlidingProcessor(SlidingProcessorExaminer... examiners)
{
for(SlidingProcessorExaminer e:examiners)
{
if(this.examiners.containsKey(e.name))
{
throw new RuntimeException("duplicated name: "+e.name);
}
this.examiners.put(e.name, e);
}
}
public Map<String, String> getCurrentValues()
{
return current;
}
public void reset()
{
current.clear();
}
public boolean isAllFieldReady()
{
for(Entry<String, SlidingProcessorExaminer> kv:examiners.entrySet())
{
if(!current.containsKey(kv.getKey()))
{
return false;
}
}
return true;
}
public void feed(String a)
{
for(Entry<String, SlidingProcessorExaminer> kv:examiners.entrySet())
{
kv.getValue().tryExamineAndPlace(this, a);
}
}
public void fillFields(Object result)
{
Mirror.tryFillMapIntoObjectCast((Map)current, result);
}
}