...
Code Block | ||||
---|---|---|---|---|
| ||||
package mypackage; import java.util.HashSet; import java.util.Set; import com.neeve.adm.AdmField; import com.neeve.adm.AdmModel; import com.neeve.adm.AdmModelImport; import com.neeve.adm.AdmSourceCodeErrorAggregator; import com.neeve.tools.AdmCodeGenerator; import com.neeve.tools.AdmCodeGenerator.CodeGenerateEvent; public class CodegenListener implements AdmCodeGenerator.CodegenListener { @Override public void codeGenerateEvent(CodeGenerateEvent e) { switch (e.getEventType()) { case START: System.err.println("CodegenListener START"); break; case SKIP: System.err.println("CodegenListener SKIP"); break; case MODEL_PARSED: System.err.println("CodegenListener MODEL_PARSED " + e.getModel().getFullName()); validateFieldNamesUniquevalidateFieldIdsUnique(e.getModel(), e.getErrorAggregator(), new HashSet<String>HashSet<Short>(), new HashSet<String>()); // e.getErrorAggregator().add("Test external error", AdmSourceCodeErrorAggregator.Severity.ERROR, e.getModel().getCodeSource()); break; case END: System.err.println("CodegenListener END " + e.getModel().getFullName()); // e.getErrorAggregator().add("Test external error", AdmSourceCodeErrorAggregator.Severity.ERROR, e.getModel().getCodeSource()); break; } } private void validateFieldNamesUniquevalidateFieldIdsUnique(AdmModel model, AdmSourceCodeErrorAggregator aggregator, Set<String>Set<Short> fields, Set<String> modelsProcessed) { // iterate imports and run validation for them if not already run. We will run bottom -> top validation so we assume that imported models have correct // field namesids and the importing model doesn't if it defines the same nameid as in one of the imports. for (AdmModelImport modelImport : model.getModelImports()) { if (!modelsProcessed.contains(modelImport.getModel().getFullName())) { validateFieldNamesUniquevalidateFieldIdsUnique(modelImport.getModel(), aggregator, fields, modelsProcessed); modelsProcessed.add(modelImport.getModel().getFullName()); } } // now we check fields of current model for (AdmField field : model.getFields()) { if (fields.contains(field.getNamegetId())) { // aggregator collects errors and they will be displayed at the end of code generation. aggregator.add("Duplicate field nameid", AdmSourceCodeErrorAggregator.Severity.ERROR, field.getCodeSource(), null); // note that classes derived from AdmModelElement // usually have source code (error line) information retrieved through getCodeSource() // pointing back to place in XML where their XML representation is. } else { fields.add(field.getNamegetId()); } } } } |