1
2
3
4
5
6
7
8
9
10
11
12
13
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$
31 *
32 */
33 public class FileCharacteristicValidator implements LabelValidator, LabelType, RecordType {
34 private static Logger log = Logger.getLogger(FileCharacteristicValidator.class.getName());
35
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
42
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 }