/*******************************************************************************
* Copyright (c) 2008 SAP
* see https://research.qkal.sap.corp/mediawiki/index.php/CoMONET
*
* Date: $Date: 2008-07-18 14:17:12 +0200 (Fr, 18 Jul 2008) $
* @version $Revision: 1250 $
* @author: $Author: c5107456 $
*******************************************************************************/
package com.sap.furcas.parsergenerator.tcs.t2m.validation;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import com.sap.furcas.metamodel.FURCAS.TCS.ConcreteSyntax;
import com.sap.furcas.metamodel.FURCAS.TCS.OperatorList;
import com.sap.furcas.metamodel.FURCAS.TCS.Priority;
import com.sap.furcas.parsergenerator.tcs.t2m.grammar.SemanticErrorBucket;
import com.sap.furcas.runtime.common.interfaces.IMetaModelLookup;
/**
* The Class UniquenessValidation.
*/
public class OperatorListValidation implements ISyntaxValidationRule {
/* (non-Javadoc)
* @see com.sap.mi.textual.grammar.impl.tcs.t2m.validation.ISyntaxValidationRule#validate(TCS.ConcreteSyntax)
*/
@Override
public void validate(ConcreteSyntax syntax, IMetaModelLookup<?> metaLookup, SemanticErrorBucket errorBucket) {
// check priorities includes zero, no gaps, no doubles
List<OperatorList> opLists = syntax.getOperatorLists();
Set<String> foundNames = new HashSet<String>();
boolean anonymousListFound = false;
for (Iterator<OperatorList> iterator = opLists.iterator(); iterator.hasNext();) {
OperatorList operatorList = iterator.next();
String name = operatorList.getName();
if (name != null) {
if (foundNames.contains(name)) {
errorBucket.addError("Duplicate operatorList name '" + name + "'", operatorList);
} else {
foundNames.add(name);
}
} else { // name == null
if (anonymousListFound == true) {
errorBucket.addError("Duplicate anonymous operator list", operatorList);
} else {
anonymousListFound = true;
}
}
List<Priority> prios = operatorList.getPriorities();
if (prios != null) {
boolean[] covered = new boolean[prios.size()];
boolean problemFound = false;
for (Iterator<Priority> iterator2 = prios.iterator(); iterator2.hasNext();) {
Priority priority = iterator2.next();
try {
if (covered[priority.getValue()]) {
problemFound = true;
errorBucket.addError("Duplicate priority index " + priority.getValue(), priority);
} else {
covered[priority.getValue()] = true;
}
} catch (ArrayIndexOutOfBoundsException aioobe) {
if (priority.getValue() < 0) {
problemFound = true;
errorBucket.addError("Negative priority index " + priority.getValue(), priority);
} else {
// ignore, better to give error message about missing numbers later
}
}
} // end for priorities
// check for missing numbers, which would happen for indexes "0, 1, 2, 4, 5" missing 3.
if (!problemFound) { // previous errors also cause gaps, ignore gap message if already errors have been found
for (int i = 0; i < covered.length; i++) {
boolean indexCovered = covered[i];
if (!indexCovered) {
errorBucket.addError("Missing priority with index " + i, operatorList);
}
}
}
} // end if prios != null
} // end for operatorLists
}
}