/** * Returns true if the constraint can be added as a child node to the current constraint (the * length of the constraint will not exceed a certain limit). In that case, also update the length * of the current constraint. */ protected boolean checkAndUpdateLength(Constraint constraint) { if (this.length + constraint.length <= WebEntitiesConfig.CONSTRAINT_MAX_LENGTH) { this.length += constraint.length; return true; } else { MyLogger.log( MyLevel.USER_EXCEPTION, "In Constraint.java: Constraint has reached its maximum length of " + WebEntitiesConfig.CONSTRAINT_MAX_LENGTH); return false; } }
/** * Returns true if there is a configuration of AtomicConstraints that makes this constraint * evaluates to TRUE. */ public boolean exists() { // Collect atomic constraints ArrayList<AtomicConstraint> atomicConstraintsList = new ArrayList<AtomicConstraint>(); collectAtomicConstraints(atomicConstraintsList); AtomicConstraint[] atomicConstraints = atomicConstraintsList.toArray(new AtomicConstraint[] {}); if (atomicConstraints.length >= WebEntitiesConfig.CONSTRAINT_MAX_ATOMIC_NUM) { MyLogger.log( MyLevel.USER_EXCEPTION, "In Constraint.java: Constraint has too many atomic predicates (" + atomicConstraints.length + ")."); return false; } // Initialize the logicTable boolean[] logicTable = new boolean[atomicConstraints.length]; for (int i = 0; i < logicTable.length; i++) logicTable[i] = true; boolean stop = (logicTable.length == 0); while (!stop) { // Set the atomic constraints based on logicTable HashMap<AtomicConstraint, Boolean> booleanTable = new HashMap<AtomicConstraint, Boolean>(); for (int i = 0; i < logicTable.length; i++) booleanTable.put(atomicConstraints[i], logicTable[i]); // Evaluate this constraint boolean result = evaluate(booleanTable); if (result) return true; // Alter the logicTable stop = true; for (int i = 0; i < logicTable.length; i++) { if (logicTable[i]) { logicTable[i] = false; for (int j = 0; j < i; j++) logicTable[j] = true; stop = false; break; } } } return false; }