package com.delcyon.capo.xml.cdom; import java.util.function.Predicate; public class OccurancePredicate { public enum TestErrorResult { FULL, NO_MATCH, MATCH } public int count; public Predicate<CElement> predicateChain; public int min = 1; public int max = 1; public CElement definition = null; @SuppressWarnings("unused") private OccurancePredicate(){} public OccurancePredicate(CElement def, Predicate<CElement> predicateChain) { if(def.hasAttribute("minOccurs")) { this.min = Integer.parseInt(def.getAttribute("minOccurs")); } if(def.hasAttribute("maxOccurs")) { if(def.getAttribute("maxOccurs").equals("unbounded")) { this.max = Integer.MAX_VALUE; } else { this.max = Integer.parseInt(def.getAttribute("maxOccurs")); } } this.predicateChain = predicateChain; this.definition = def; } public TestErrorResult increment(CElement node) { if(node == null) { return TestErrorResult.NO_MATCH; } if(predicateChain.test(node)) { if(count+1 <= max ) { count++; return TestErrorResult.MATCH; } else { return TestErrorResult.FULL; } } return TestErrorResult.NO_MATCH; } public boolean isSatisfied() { return count >= min && count <= max; } public boolean isFull() { return count == max; } public CElement getDefinition() { return definition; } }