View Javadoc

1   // Copyright 2006-2008, by the California Institute of 
2   // Technology. ALL RIGHTS RESERVED. United States Government 
3   // Sponsorship acknowledged. Any commercial use must be negotiated with 
4   // the Office of Technology Transfer at the California Institute of 
5   // Technology.
6   //
7   // This software may be subject to U.S. export control laws. By 
8   // accepting this software, the user agrees to comply with all 
9   // applicable U.S. export laws and regulations. User has the 
10  // responsibility to obtain export licenses, or other export authority 
11  // as may be required before exporting such information to foreign 
12  // countries or providing access to foreign persons.
13  //
14  // $Id: DuplicateIdentifierValidator.java 3795 2008-12-16 22:12:59Z pramirez $ 
15  //
16  
17  package gov.nasa.pds.tools.label.validate;
18  
19  import java.util.HashSet;
20  import java.util.Iterator;
21  import java.util.List;
22  import java.util.Set;
23  import java.util.logging.Level;
24  import java.util.logging.Logger;
25  
26  import gov.nasa.pds.tools.label.GroupStatement;
27  import gov.nasa.pds.tools.label.Label;
28  import gov.nasa.pds.tools.label.ObjectStatement;
29  import gov.nasa.pds.tools.label.Statement;
30  import gov.nasa.pds.tools.label.AttributeStatement;
31  import gov.nasa.pds.tools.logging.ToolsLogRecord;
32  
33  /***
34   * @author pramirez
35   * @version $Revision: 3795 $
36   * 
37   */
38  public class DuplicateIdentifierValidator implements LabelValidator {
39      private static Logger log = Logger.getLogger(DuplicateIdentifierValidator.class.getName());
40  
41      /* (non-Javadoc)
42       * @see gov.nasa.pds.tools.label.validate.LabelValidator#isValid(gov.nasa.pds.tools.label.Label)
43       */
44      public boolean isValid(Label label) {
45          return isValid(label, new DefaultValidationListener());
46      }
47  
48      /* (non-Javadoc)
49       * @see gov.nasa.pds.tools.label.validate.LabelValidator#isValid(gov.nasa.pds.tools.label.Label, gov.nasa.pds.tools.label.validate.ValidationListener)
50       */
51      public boolean isValid(Label label, ValidationListener listener) {
52          return isValid(label.getStatements(), listener);
53      }
54      
55      private boolean isValid(List statements, ValidationListener listener) {
56          boolean valid = true;
57          Set seenIdentifiers = new HashSet();
58          
59          for (Iterator i = statements.iterator(); i.hasNext();) {
60              Statement statement = (Statement) i.next();
61              if (statement instanceof AttributeStatement) {
62                  if (seenIdentifiers.contains(statement.getFilename() + "#" + statement.getIdentifier())) {
63                      valid = false;
64                      listener.reportError("Duplicate " + statement.getIdentifier() + "found.");
65                      log.log(new ToolsLogRecord(Level.SEVERE, "Duplicate " + statement.getIdentifier() + " found.", 
66                              statement.getFilename(), statement.getContext(), statement.getLineNumber()));
67                  } else {
68                      seenIdentifiers.add(statement.getFilename() + "#" + statement.getIdentifier());
69                  }
70              } else if (statement instanceof ObjectStatement) {
71                  ObjectStatement object = (ObjectStatement) statement;
72                  boolean pass = isValid(object.getStatements(), listener);
73                  if (!pass)
74                      valid = pass;
75              } else if (statement instanceof GroupStatement) {
76                  GroupStatement group = (GroupStatement) statement;
77                  boolean pass = isValid(group.getStatements(), listener);
78                  if (!pass)
79                      valid = pass;
80              }
81          }
82          
83          return valid;
84      }
85  
86  }