001 /** 002 * Copyright 2005-2012 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.krad.datadictionary.validator; 017 018 import org.apache.commons.logging.Log; 019 import org.kuali.rice.krad.uif.component.Component; 020 import org.springframework.beans.factory.support.KualiDefaultListableBeanFactory; 021 import org.springframework.core.io.ResourceLoader; 022 023 import java.io.BufferedWriter; 024 import java.io.FileWriter; 025 import java.io.IOException; 026 import java.io.PrintStream; 027 028 /** 029 * A combination view controller for the Rice Dictionary Validator that handles both the setup/execution of the 030 * validation and the output of the results. 031 * 032 * @author Kuali Rice Team (rice.collab@kuali.org) 033 */ 034 public class ValidationController { 035 protected static final String endl = System.getProperty("line.separator"); 036 037 protected boolean displayWarnings; 038 protected boolean displayErrors; 039 protected boolean displayXmlPages; 040 protected boolean displayErrorMessages; 041 protected boolean displayWarningMessages; 042 043 /** 044 * Constructor creating a new Rice Dictionary Validator with limited information during output 045 * 046 * @param displayErrors - True if the Validator should show the number of error during output 047 * @param displayWarnings - True if the Validator should show the number of warnings during output 048 * @param displayErrorMessages - True if the Validator should show the messages for the error reports 049 * @param displayWarningMessages - True if the Validator should show messages involving warnings 050 * @param displayXmlPages - True if the Validator should show the list of xml pages for the error reports 051 */ 052 public ValidationController(boolean displayErrors, boolean displayWarnings, boolean displayErrorMessages, 053 boolean displayWarningMessages, boolean displayXmlPages) { 054 //LOG.debug("Creating new Rice Dictionary Validator with limited output"); 055 this.displayErrors = displayErrors; 056 this.displayWarnings = displayWarnings; 057 this.displayErrorMessages = displayErrorMessages; 058 this.displayWarningMessages = displayWarningMessages; 059 this.displayXmlPages = displayXmlPages; 060 } 061 062 /** 063 * Constructor creating a new Rice Dictionary Validator 064 */ 065 public ValidationController() { 066 //LOG.debug("Creating new Rice Dictionary Validator"); 067 displayErrors = true; 068 displayWarnings = true; 069 displayErrorMessages = true; 070 displayWarningMessages = true; 071 displayXmlPages = true; 072 } 073 074 /** 075 * Validates a collection of Spring Beans with no output 076 * 077 * @param xmlFiles - The collection of xml files used to load the provided beans 078 * @param beans - Collection of preloaded beans 079 * @param failOnWarning - Whether detecting a warning should cause the validation to fail 080 * @return Returns true if the beans past validation 081 */ 082 public boolean validate(String[] xmlFiles, ResourceLoader loader, KualiDefaultListableBeanFactory beans, 083 boolean failOnWarning) { 084 // LOG.debug("Validating without output"); 085 Validator validator = new Validator(); 086 087 boolean passed = validator.validate(xmlFiles, loader, beans, failOnWarning); 088 089 return passed; 090 } 091 092 /** 093 * Validates a collection of Spring Beans with output going to a file 094 * 095 * @param xmlFiles - The collection of xml files used to load the provided beans 096 * @param loader - The source that was used to load the beans 097 * @param beans - Collection of preloaded beans 098 * @param outputFile - The file location to save the output to 099 * @param failOnWarning - Whether detecting a warning should cause the validation to fail 100 * @return Returns true if the beans past validation 101 */ 102 public boolean validate(String[] xmlFiles, ResourceLoader loader, KualiDefaultListableBeanFactory beans, 103 String outputFile, boolean failOnWarning) { 104 Validator validator = new Validator(); 105 // LOG.debug("Validating with file output to "+outputFile); 106 107 boolean passed = validator.validate(xmlFiles, loader, beans, failOnWarning); 108 109 writeToFile(outputFile, validator, passed); 110 111 return passed; 112 } 113 114 /** 115 * Validates a collection of Spring Beans with output going to a print stream 116 * 117 * @param xmlFiles - The collection of xml files used to load the provided beans 118 * @param loader - The source that was used to load the beans 119 * @param beans - Collection of preloaded beans 120 * @param stream - The PrintStream the output is sent to 121 * @param failOnWarning - Whether detecting a warning should cause the validation to fail 122 * @return Returns true if the beans past validation 123 */ 124 public boolean validate(String[] xmlFiles, ResourceLoader loader, KualiDefaultListableBeanFactory beans, 125 PrintStream stream, boolean failOnWarning) { 126 Validator validator = new Validator(); 127 // LOG.debug("Validating with Print Stream output"); 128 129 boolean passed = validator.validate(xmlFiles, loader, beans, failOnWarning); 130 131 writeToStream(stream, validator, passed); 132 133 return passed; 134 } 135 136 /** 137 * Validates a collection of Spring Beans with output going to Log4j 138 * 139 * @param xmlFiles - The collection of xml files used to load the provided beans 140 * @param loader - The source that was used to load the beans 141 * @param beans - Collection of preloaded beans 142 * @param log - The Log4j logger the output is sent to 143 * @param failOnWarning - Whether detecting a warning should cause the validation to fail 144 * @return Returns true if the beans past validation 145 */ 146 public boolean validate(String[] xmlFiles, ResourceLoader loader, KualiDefaultListableBeanFactory beans, Log log, 147 boolean failOnWarning) { 148 Validator validator = new Validator(); 149 //LOG.debug("Validating with Log4j output"); 150 151 boolean passed = validator.validate(xmlFiles, loader, beans, failOnWarning); 152 153 writeToLog(log, validator, passed); 154 155 return passed; 156 } 157 158 /** 159 * Validates a collection of Spring Beans with no output 160 * 161 * @param xmlFiles - The collection of xml files used to load the beans 162 * @param failOnWarning - Whether detecting a warning should cause the validation to fail 163 * @return Returns true if the beans past validation 164 */ 165 public boolean validate(String[] xmlFiles, boolean failOnWarning) { 166 // LOG.debug("Validating without output"); 167 Validator validator = new Validator(); 168 169 boolean passed = validator.validate(xmlFiles, failOnWarning); 170 171 return passed; 172 } 173 174 /** 175 * Validates a collection of Spring Beans with output going to a file 176 * 177 * @param xmlFiles - The collection of xml files used to load the beans 178 * @param outputFile - The file location to save the output to 179 * @param failOnWarning - Whether detecting a warning should cause the validation to fail 180 * @return Returns true if the beans past validation 181 */ 182 public boolean validate(String[] xmlFiles, String outputFile, boolean failOnWarning) { 183 Validator validator = new Validator(); 184 //LOG.debug("Validating with file output to "+outputFile); 185 186 boolean passed = validator.validate(xmlFiles, failOnWarning); 187 188 writeToFile(outputFile, validator, passed); 189 190 return passed; 191 } 192 193 /** 194 * Validates a collection of Spring Beans with output going to a print stream 195 * 196 * @param xmlFiles - The collection of xml files used to load the beans 197 * @param stream - The PrintStream the output is sent to 198 * @param failOnWarning - Whether detecting a warning should cause the validation to fail 199 * @return Returns true if the beans past validation 200 */ 201 public boolean validate(String[] xmlFiles, PrintStream stream, boolean failOnWarning) { 202 Validator validator = new Validator(); 203 //LOG.debug("Validating with Print Stream output"); 204 205 boolean passed = validator.validate(xmlFiles, failOnWarning); 206 207 writeToStream(stream, validator, passed); 208 209 return passed; 210 } 211 212 /** 213 * Validates a collection of Spring Beans with output going to Log4j 214 * 215 * @param xmlFiles - The collection of xml files used to load the provided beans 216 * @param log - The Log4j logger the output is sent to 217 * @param failOnWarning - Whether detecting a warning should cause the validation to fail 218 * @return Returns true if the beans past validation 219 */ 220 public boolean validate(String[] xmlFiles, Log log, boolean failOnWarning) { 221 Validator validator = new Validator(); 222 //LOG.debug("Validating with Log4j output"); 223 224 boolean passed = validator.validate(xmlFiles, failOnWarning); 225 226 writeToLog(log, validator, passed); 227 228 return passed; 229 } 230 231 /** 232 * Validates a Component with output going to Log4j 233 * 234 * @param object - The component to be validated 235 * @param log - The Log4j logger the output is sent to 236 * @param failOnWarning - Whether detecting a warning should cause the validation to fail 237 * @return Returns true if the beans past validation 238 */ 239 public boolean validate(Component object, Log log, boolean failOnWarning) { 240 Validator validator = new Validator(); 241 //LOG.debug("Validating with Log4j output"); 242 243 boolean passed = validator.validate(object, failOnWarning); 244 245 writeToLog(log, validator, passed); 246 247 return passed; 248 } 249 250 /** 251 * Writes the results of the validation to an output file 252 * 253 * @param path - The path to the file to write results to 254 * @param validator - The filled validator 255 * @param passed - Whether the validation passed or not 256 */ 257 protected void writeToFile(String path, Validator validator, boolean passed) { 258 try { 259 BufferedWriter fout = new BufferedWriter(new FileWriter(path)); 260 261 fout.write("Validation Results" + endl); 262 fout.write("Passed: " + passed + endl); 263 if (displayErrors) { 264 fout.write("Number of Errors: " + validator.getNumberOfErrors() + endl); 265 } 266 if (displayWarnings) { 267 fout.write("Number of Warnings: " + validator.getNumberOfWarnings() + endl); 268 } 269 270 if (displayErrorMessages) { 271 for (int i = 0; i < validator.getErrorReportSize(); i++) { 272 if (displayWarningMessages) { 273 fout.write(endl); 274 fout.write(validator.getErrorReport(i).errorMessage()); 275 } else if (validator.getErrorReport(i).getErrorStatus() == ErrorReport.ERROR) { 276 fout.write(endl); 277 fout.write(validator.getErrorReport(i).errorMessage()); 278 } 279 280 if (displayXmlPages) { 281 fout.write(validator.getErrorReport(i).errorPageList()); 282 } 283 } 284 } 285 286 fout.close(); 287 } catch (IOException e) { 288 //LOG.warn("Exception when writing file", e); 289 } 290 } 291 292 /** 293 * Writes the results of the validation to an output file 294 * 295 * @param stream - The PrintStream the output is sent to 296 * @param validator - The filled validator 297 * @param passed - Whether the validation passed or not 298 */ 299 protected void writeToStream(PrintStream stream, Validator validator, boolean passed) { 300 stream.println("Validation Results"); 301 stream.println("Passed: " + passed); 302 if (displayErrors) { 303 stream.println("Number of Errors: " + validator.getNumberOfErrors()); 304 } 305 if (displayWarnings) { 306 stream.println("Number of Warnings: " + validator.getNumberOfWarnings()); 307 } 308 309 if (displayErrorMessages) { 310 for (int i = 0; i < validator.getErrorReportSize(); i++) { 311 stream.println(); 312 if (displayWarningMessages) { 313 stream.println(validator.getErrorReport(i).errorMessage()); 314 } else if (validator.getErrorReport(i).getErrorStatus() == ErrorReport.ERROR) { 315 stream.println(validator.getErrorReport(i).errorMessage()); 316 } 317 318 if (displayXmlPages) { 319 stream.println(validator.getErrorReport(i).errorPageList()); 320 } 321 } 322 } 323 } 324 325 /** 326 * Writes the results of the validation to an output file 327 * 328 * @param log - The Log4j logger the output is sent to 329 * @param validator - The filled validator 330 * @param passed - Whether the validation passed or not 331 */ 332 protected void writeToLog(Log log, Validator validator, boolean passed) { 333 log.info("Passed: " + passed); 334 if (displayErrors) { 335 log.info("Number of Errors: " + validator.getNumberOfErrors()); 336 } 337 if (displayWarnings) { 338 log.info("Number of Warnings: " + validator.getNumberOfWarnings()); 339 } 340 341 if (displayErrorMessages) { 342 for (int i = 0; i < validator.getErrorReportSize(); i++) { 343 if (validator.getErrorReport(i).getErrorStatus() == ErrorReport.ERROR) { 344 if (displayXmlPages) { 345 log.error(validator.getErrorReport(i).errorMessage() + validator.getErrorReport(i) 346 .errorPageList()); 347 } else { 348 log.error(validator.getErrorReport(i).errorMessage()); 349 } 350 351 } else { 352 if (displayWarningMessages) { 353 if (displayXmlPages) { 354 log.warn(validator.getErrorReport(i).errorMessage() + validator.getErrorReport(i) 355 .errorPageList()); 356 } else { 357 log.warn(validator.getErrorReport(i).errorMessage()); 358 } 359 } 360 } 361 362 } 363 } 364 } 365 366 /** 367 * Sets the displayWarnings 368 * 369 * @param display - Display or not 370 */ 371 public void setDisplayWarnings(boolean display) { 372 displayWarnings = display; 373 } 374 375 /** 376 * Sets the displayErrors 377 * 378 * @param display - Display or not 379 */ 380 public void setDisplayErrors(boolean display) { 381 displayErrors = display; 382 } 383 384 /** 385 * Sets the displayXmlPages 386 * 387 * @param display - Display or not 388 */ 389 public void setDisplayXmlPages(boolean display) { 390 displayXmlPages = display; 391 } 392 393 /** 394 * Sets the displayErrorMessages 395 * 396 * @param display - Display or not 397 */ 398 public void setDisplayErrorMessages(boolean display) { 399 displayErrorMessages = display; 400 } 401 402 /** 403 * Sets the displayWarningMessages 404 * 405 * @param display - Display or not 406 */ 407 public void setDisplayWarningMessages(boolean display) { 408 displayWarningMessages = display; 409 } 410 411 /** 412 * Gets the displayWarnings, whether the number of warnings should be displayed 413 * 414 * @return displayWarnings 415 */ 416 public boolean isDisplayWarnings() { 417 return displayWarnings; 418 } 419 420 /** 421 * Gets the displayErrors, whether the number of errors should be displayed 422 * 423 * @return displayErros 424 */ 425 public boolean isDisplayErrors() { 426 return displayErrors; 427 } 428 429 /** 430 * Gets the displayXmlPages, whether the xml pages involved should be displayed 431 * 432 * @return displayXmlPages 433 */ 434 public boolean isDisplayXmlPages() { 435 return displayXmlPages; 436 } 437 438 /** 439 * Gets the displayErrorMessages, whether the error messages should be displayed 440 * 441 * @return displayErrorMessages 442 */ 443 public boolean isDisplayErrorMessages() { 444 return displayErrorMessages; 445 } 446 447 /** 448 * Gets the displayWarningMessages, whether the warning messages should be displayed 449 * 450 * @return displayWarningMessages 451 */ 452 public boolean isDisplayWarningMessages() { 453 return displayWarningMessages; 454 } 455 }