001: /* Copyright 2005 The JA-SIG Collaborative. All rights reserved.
002: * See license distributed with this file and
003: * available online at http://www.uportal.org/license.html
004: */
005:
006: package org.jasig.portal.tools.checks;
007:
008: import java.util.ArrayList;
009: import java.util.Collections;
010: import java.util.Iterator;
011: import java.util.List;
012:
013: import org.apache.commons.logging.Log;
014: import org.apache.commons.logging.LogFactory;
015:
016: /**
017: * Safely executes a configured List of checks.
018: * @version $Revision: 35833 $ $Date: 2005-05-19 18:51:40 -0700 (Thu, 19 May 2005) $
019: * @since uPortal 2.5
020: */
021: public class BasicCheckRunner implements ICheckRunner {
022:
023: protected Log log = LogFactory.getLog(getClass());
024:
025: private List checks = Collections.EMPTY_LIST;
026:
027: public List doChecks() {
028: // List of CheckAndResult instances
029: List checksAndResults = new ArrayList(this .checks.size());
030:
031: for (Iterator iter = this .checks.iterator(); iter.hasNext();) {
032: Object listEntry = iter.next();
033: if (listEntry instanceof ICheck) {
034:
035: ICheck check = (ICheck) listEntry;
036: CheckAndResult result = executeCheck(check);
037: checksAndResults.add(result);
038:
039: } else {
040: // entry in list of checks was not actually an instance of ICheck.
041: // log this annoyance.
042:
043: String classWas = listEntry.getClass().getName();
044: CheckResult entryNotAnICheck = CheckResult
045: .createFailure(
046: "Entry in list of checks did not implement ICheck. "
047: + "It was an instance of ["
048: + classWas + "]",
049: "Fix the list of checks to include only instances of ICheck.");
050:
051: CheckAndResult notAnEntryCheckAndResult = new CheckAndResult(
052: "Check whether entries in the list of checks we're going to execute implement the required ICheck interface.",
053: entryNotAnICheck);
054: checksAndResults.add(notAnEntryCheckAndResult);
055:
056: }
057:
058: }
059:
060: return checksAndResults;
061: }
062:
063: /**
064: * Helper method to safely execute a given check.
065: * @param check
066: * @return
067: */
068: private CheckAndResult executeCheck(ICheck check) {
069:
070: // default the check description in case the check fails to provide one
071: String checkDescription = "Check failed to provide a description.";
072:
073: try {
074: checkDescription = check.getDescription();
075: CheckResult result = check.doCheck();
076: return new CheckAndResult(checkDescription, result);
077: } catch (Throwable t) {
078: // why catch throwable? Because no matter what goes wrong, we
079: // don't want any check to be able to break this CheckRunner.
080:
081: // we especially log here to get this stack trace in the log
082: log.error("Check failed by throwing.", t);
083:
084: String message = "Check failed by throwing exception. " + t;
085:
086: String remediation = "Since the check failed by throwing an exception, we cannot advise any particular solution.";
087:
088: CheckResult result = CheckResult.createFailure(message,
089: remediation);
090:
091: return new CheckAndResult(checkDescription, result);
092:
093: }
094:
095: }
096:
097: /**
098: * @return Returns the checks.
099: */
100: public List getChecks() {
101: return this .checks;
102: }
103:
104: /**
105: * Set the List of checks to be executed by this CheckRunner instance.
106: * @param checks a non-null list of ICheck instances.
107: */
108: public void setChecks(List checks) {
109: if (checks == null) {
110: throw new IllegalArgumentException(
111: "Cannot set checks to null.");
112: }
113:
114: this.checks = checks;
115: }
116: }
|