View Javadoc

1   //Copyright (c) 2005, California Institute of Technology.
2   //ALL RIGHTS RESERVED. U.S. Government sponsorship acknowledged.
3   //
4   // $Id$ 
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      /* (non-Javadoc)
32       * @see gov.nasa.pds.tools.label.validate.LabelValidator#isValid(gov.nasa.pds.tools.label.Label)
33       */
34      public boolean isValid(Label label) {
35          return isValid(label, new DefaultValidationListener());
36      }
37  
38      /* (non-Javadoc)
39       * @see gov.nasa.pds.tools.label.validate.LabelValidator#isValid(gov.nasa.pds.tools.label.Label, gov.nasa.pds.tools.label.validate.ValidationListener)
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  }