View Javadoc

1   // Copyright 2006-2007, by the California Institute of Technology.
2   // ALL RIGHTS RESERVED. United States Government Sponsorship acknowledged.
3   // Any commercial use must be negotiated with the Office of Technology Transfer
4   // at the California Institute of Technology.
5   //
6   // This software is subject to U. S. export control laws and regulations
7   // (22 C.F.R. 120-130 and 15 C.F.R. 730-774). To the extent that the software
8   // is subject to U.S. export control laws and regulations, the recipient has
9   // the responsibility to obtain export licenses or other export authority as
10  // may be required before exporting such information to foreign countries or
11  // providing access to foreign nationals.
12  //
13  // $Id: FileCharacteristicValidator.java 3461 2008-08-07 17:43:26Z pramirez $ 
14  //
15  
16  package gov.nasa.pds.tools.label.validate;
17  
18  import java.util.Iterator;
19  import java.util.logging.Level;
20  import java.util.logging.Logger;
21  
22  import gov.nasa.pds.tools.label.Label;
23  import gov.nasa.pds.tools.label.LabelType;
24  import gov.nasa.pds.tools.label.ObjectStatement;
25  import gov.nasa.pds.tools.logging.ToolsLogRecord;
26  
27  /***
28   * This class validates that all file characteristics are found in a label;
29   * @author pramirez
30   * @version $Revision: 3461 $
31   * 
32   */
33  public class FileCharacteristicValidator implements LabelValidator, LabelType, RecordType {
34      private static Logger log = Logger.getLogger(FileCharacteristicValidator.class.getName());
35      //This is the set of predefined required file characteristic elements
36      private final static String RECORD_TYPE = "RECORD_TYPE";
37      private final static String RECORD_BYTES = "RECORD_BYTES";
38      private final static String FILE_RECORDS = "FILE_RECORDS";
39      private final static String LABEL_RECORDS = "LABEL_RECORDS";
40  
41      /* (non-Javadoc)
42       * @see gov.nasa.pds.tools.label.validate.LabelValidator#isValid(gov.nasa.pds.tools.label.Label, gov.nasa.pds.tools.label.validate.ValidationListener)
43       */
44      public boolean isValid(Label label, ValidationListener listener) {
45          if (label.getLabelType() == LabelType.UNDEFINED) {
46              listener.reportWarning("File characteristics will not be checked as the type of label is UNDEFINED.");
47              log.log(new ToolsLogRecord(Level.WARNING, "File characteristics will not be checked as the type of label is UNDEFINED.", label.getFilename()));
48              return true;
49          }
50          else if (label.getLabelType() == COMBINED_DETACHED)
51              return checkCombinedDetached(label, listener);
52          else if (label.getLabelType() == ATTACHED || label.getLabelType() == DETACHED){
53              if (label.getAttribute(RECORD_TYPE) == null) {
54                  listener.reportError("Label does not contain the required RECORD_TYPE element.");
55                  log.log(new ToolsLogRecord(Level.SEVERE, "Label does not contain the required RECORD_TYPE element.", label.getFilename()));
56                  return false;
57              }
58              
59              String recordType = label.getAttribute(RECORD_TYPE).getValue().toString();
60              if (!FIXED_LENGTH.equals(recordType) && !VARIABLE_LENGTH.equals(recordType) && 
61                      !STREAM.equals(recordType) && !RecordType.UNDEFINED.equals(recordType)) {
62                  listener.reportWarning("Could not determine RECORD_TYPE file characteristics will not be checked");
63                  log.log(new ToolsLogRecord(Level.WARNING, "Could not determine RECORD_TYPE file characteristics will not be checked", label.getFilename()));
64                  return false;
65              }
66              
67              if (RecordType.UNDEFINED.equals(recordType)) {
68                  return true;
69              }
70              
71              if (label.getLabelType() == ATTACHED)
72                  return checkAttached(label, listener);
73              else if (label.getLabelType() == DETACHED)
74                  return checkDetached(label, listener);
75          } else {
76              listener.reportWarning("Could not check file characteristics as the type of label could not be determined.");
77              log.log(new ToolsLogRecord(Level.WARNING, "Could not check file characteristics as the type of label could not be determined.", label.getFilename()));
78          }
79          
80          return false;
81      }
82  
83      private boolean checkAttached(Label label, ValidationListener listener) {
84          boolean pass = true;
85          String recordType = label.getAttribute(RECORD_TYPE).getValue().toString();
86          if (FIXED_LENGTH.equals(recordType) || VARIABLE_LENGTH.equals(recordType)) {
87              if (label.getAttribute(RECORD_BYTES) == null) {
88                  listener.reportError("Label does not contain required element " + RECORD_BYTES);
89                  log.log(new ToolsLogRecord(Level.SEVERE, "Label does not contain required element " + RECORD_BYTES, label.getFilename()));
90                  pass = false;
91              }
92              if (label.getAttribute(FILE_RECORDS) == null) {
93                  listener.reportError("Label does not contain required element " + FILE_RECORDS);
94                  log.log(new ToolsLogRecord(Level.SEVERE, "Label does not contain required element " + FILE_RECORDS, label.getFilename()));
95                  pass = false;
96              }
97              if (label.getAttribute(LABEL_RECORDS) == null) {
98                  listener.reportError("Label does not contain required element " + LABEL_RECORDS);
99                  log.log(new ToolsLogRecord(Level.SEVERE, "Label does not contain required element " + LABEL_RECORDS, label.getFilename()));
100                 pass = false;
101             }
102         } 
103         
104         return pass;
105     }
106     
107     private boolean checkDetached(Label label, ValidationListener listener) {
108         boolean pass = true;
109         String recordType = label.getAttribute(RECORD_TYPE).getValue().toString();
110         if (FIXED_LENGTH.equals(recordType) || VARIABLE_LENGTH.equals(recordType)) {
111             if (label.getAttribute(RECORD_BYTES) == null) {
112                 listener.reportError("Label does not contain required element " + RECORD_BYTES);
113                 log.log(new ToolsLogRecord(Level.SEVERE, "Label does not contain required element " + RECORD_BYTES, label.getFilename()));
114                 pass = false;
115             }
116             if (label.getAttribute(FILE_RECORDS) == null) {
117                 listener.reportError("Label does not contain required element " + FILE_RECORDS);
118                 log.log(new ToolsLogRecord(Level.SEVERE, "Label does not contain required element " + FILE_RECORDS, label.getFilename()));
119                 pass = false;
120             }
121         } 
122         return pass;
123     }
124     
125     private boolean checkCombinedDetached(Label label, ValidationListener listener) {
126         boolean pass = true;
127         
128         for (Iterator i = label.getObjects("FILE").iterator(); i.hasNext();) {
129             ObjectStatement fileObject = (ObjectStatement) i.next();
130             pass = checkFileObject(fileObject, listener);
131         }
132         
133         return pass;
134     }
135     
136     private boolean checkFileObject(ObjectStatement object, ValidationListener listener) {
137         boolean pass = true;
138         
139         if (object.getAttribute(RECORD_TYPE) == null) {
140             listener.reportError("File object does not contain the required RECORD_TYPE element.");
141             log.log(new ToolsLogRecord(Level.SEVERE, "File object does not contain the required RECORD_TYPE element.", 
142                     object.getFilename(), object.getContext(), object.getLineNumber()));
143             return false;
144         }
145         
146         String recordType = object.getAttribute(RECORD_TYPE).getValue().toString();
147         if (!FIXED_LENGTH.equals(recordType) && !VARIABLE_LENGTH.equals(recordType) && 
148                 !STREAM.equals(recordType) && !RecordType.UNDEFINED.equals(recordType)) {
149             listener.reportWarning("Could not determine RECORD_TYPE file characteristics will not be checked");
150             log.log(new ToolsLogRecord(Level.WARNING, "Could not determine RECORD_TYPE file characteristics will not be checked", 
151                     object.getFilename(), object.getContext(), object.getLineNumber()));
152             return false;
153         }
154         
155         if (FIXED_LENGTH.equals(recordType) || VARIABLE_LENGTH.equals(recordType)) {
156             if (object.getAttribute(RECORD_BYTES) == null) {
157                 listener.reportError("File object does not contain required element " + RECORD_BYTES);
158                 log.log(new ToolsLogRecord(Level.SEVERE, "File object does not contain required element " + RECORD_BYTES, 
159                         object.getFilename(), object.getContext(), object.getLineNumber()));
160                 pass = false;
161             }
162             if (object.getAttribute(FILE_RECORDS) == null) {
163                 listener.reportError("File object does not contain required element " + FILE_RECORDS);
164                 log.log(new ToolsLogRecord(Level.SEVERE, "File object does not contain required element " + FILE_RECORDS, 
165                         object.getFilename(), object.getContext(), object.getLineNumber()));
166                 pass = false;
167             }
168         } 
169         return pass;
170     }
171 
172     /*** (non-Javadoc)
173      * @see gov.nasa.pds.tools.label.validate.LabelValidator#isValid(gov.nasa.pds.tools.label.Label)
174      */
175     public boolean isValid(Label label) {
176         return isValid(label, new DefaultValidationListener());
177     }
178 }