1
2
3
4
5
6
7 package gov.nasa.pds.tools.label.validate;
8
9 import java.util.HashSet;
10 import java.util.Iterator;
11 import java.util.List;
12 import java.util.Set;
13 import java.util.logging.Level;
14 import java.util.logging.Logger;
15
16 import gov.nasa.pds.tools.label.GroupStatement;
17 import gov.nasa.pds.tools.label.Label;
18 import gov.nasa.pds.tools.label.ObjectStatement;
19 import gov.nasa.pds.tools.label.Statement;
20 import gov.nasa.pds.tools.label.AttributeStatement;
21 import gov.nasa.pds.tools.logging.ToolsLogRecord;
22
23 /***
24 * @author pramirez
25 * @version $Revision$
26 *
27 */
28 public class DuplicateIdentifierValidator implements LabelValidator {
29 private static Logger log = Logger.getLogger(DuplicateIdentifierValidator.class.getName());
30
31
32
33
34 public boolean isValid(Label label) {
35 return isValid(label, new DefaultValidationListener());
36 }
37
38
39
40
41 public boolean isValid(Label label, ValidationListener listener) {
42 return isValid(label.getStatements(), listener);
43 }
44
45 private boolean isValid(List statements, ValidationListener listener) {
46 boolean valid = true;
47 Set seenIdentifiers = new HashSet();
48
49 for (Iterator i = statements.iterator(); i.hasNext();) {
50 Statement statement = (Statement) i.next();
51 if (statement instanceof AttributeStatement) {
52 if (seenIdentifiers.contains(statement.getIdentifier())) {
53 valid = false;
54 listener.reportError("Duplicate " + statement.getIdentifier() + "found.");
55 log.log(new ToolsLogRecord(Level.SEVERE, "Duplicate " + statement.getIdentifier() + " found.",
56 statement.getFilename(), statement.getContext(), statement.getLineNumber()));
57 } else {
58 seenIdentifiers.add(statement.getIdentifier());
59 }
60 } else if (statement instanceof ObjectStatement) {
61 ObjectStatement object = (ObjectStatement) statement;
62 boolean pass = isValid(object.getStatements(), listener);
63 if (!pass)
64 valid = pass;
65 } else if (statement instanceof GroupStatement) {
66 GroupStatement group = (GroupStatement) statement;
67 boolean pass = isValid(group.getStatements(), listener);
68 if (!pass)
69 valid = pass;
70 }
71 }
72
73 return valid;
74 }
75
76 }