Changeset 5402 for CMDIValidator
- Timestamp:
- 06/27/14 23:41:03 (10 years ago)
- Location:
- CMDIValidator/trunk
- Files:
-
- 5 edited
- 6 moved
Legend:
- Unmodified
- Added
- Removed
-
CMDIValidator/trunk/cmdi-validator-core/src/main/java/eu/clarin/cmdi/validator/CMDIValidationHandler.java
r5384 r5402 18 18 19 19 20 public interface CMDIValidat orHandler {20 public interface CMDIValidationHandler { 21 21 22 22 public void onJobStarted() … … 28 28 29 29 30 public void onValidation Success(final CMDIValidatorResult result)30 public void onValidationReport(final CMDIValidationReport report) 31 31 throws CMDIValidatorException; 32 32 33 34 public void onValidationFailure(final CMDIValidatorResult result) 35 throws CMDIValidatorException; 36 37 } // interface CMDIValidatorJobHandler 33 } // interface CMDIValidationHandler -
CMDIValidator/trunk/cmdi-validator-core/src/main/java/eu/clarin/cmdi/validator/CMDIValidationHandlerAdapter.java
r5384 r5402 18 18 19 19 20 public class CMDIValidat orHandlerAdapter implements CMDIValidatorHandler {20 public class CMDIValidationHandlerAdapter implements CMDIValidationHandler { 21 21 22 22 @Override … … 32 32 33 33 @Override 34 public void onValidation Success(CMDIValidatorResult result)34 public void onValidationReport(final CMDIValidationReport report) 35 35 throws CMDIValidatorException { 36 36 } 37 37 38 39 @Override 40 public void onValidationFailure(CMDIValidatorResult result) 41 throws CMDIValidatorException { 42 } 43 44 } // class CMDIValidatorJobHandlerAdapter 38 } // class CMDIValidationHandlerAdapter -
CMDIValidator/trunk/cmdi-validator-core/src/main/java/eu/clarin/cmdi/validator/CMDIValidationReport.java
r5395 r5402 21 21 22 22 23 public interface CMDIValidat orResult {23 public interface CMDIValidationReport { 24 24 public enum Severity { 25 25 INFO { … … 83 83 84 84 85 public boolean isSuccess(); 86 87 88 public boolean isWarning(); 89 90 91 public boolean isFailed(); 92 93 85 94 public Severity getHighestSeverity(); 86 95 -
CMDIValidator/trunk/cmdi-validator-core/src/main/java/eu/clarin/cmdi/validator/CMDIValidator.java
r5395 r5402 80 80 import org.xml.sax.SAXParseException; 81 81 82 import eu.clarin.cmdi.validator.CMDIValidatorResult.Severity;83 82 import eu.clarin.cmdi.validator.utils.LRUCache; 84 import eu.clarin.cmdi.validator.utils. SaxonLocationUtils;83 import eu.clarin.cmdi.validator.utils.LocationUtils; 85 84 86 85 … … 126 125 private final List<CMDIValidatorExtension> extensions; 127 126 private final FileEnumerator files; 128 private final CMDIValidat orHandler handler;127 private final CMDIValidationHandler handler; 129 128 private final Map<Thread, ThreadContext> contexts = 130 129 new ConcurrentHashMap<Thread, ThreadContext>(); … … 240 239 241 240 242 public CMDIValidat orHandler getHandler() {241 public CMDIValidationHandler getHandler() { 243 242 return handler; 244 243 } … … 462 461 private final XsltTransformer schematronValidator; 463 462 private final DocumentBuilder builder; 464 private CMDI ValidatorWriteableResult result;463 private CMDIWriteableValidationReport report; 465 464 466 465 … … 617 616 logger.debug("validating file '{}' ({} bytes)", 618 617 file, file.length()); 619 re sult = new CMDIValidatorWriteableResultImpl(file);618 report = new CMDIWriteableValidatonReportImpl(file); 620 619 stream = new TFileInputStream(file); 621 620 … … 638 637 if (extensions != null) { 639 638 for (CMDIValidatorExtension extension : extensions) { 640 extension.validate(document, re sult);639 extension.validate(document, report); 641 640 } 642 641 } … … 656 655 "error closing file '" + file + "'", e); 657 656 } finally { 658 if ((re sult != null) && (handler != null)) {657 if ((report != null) && (handler != null)) { 659 658 try { 660 if (result.isHighestSeverity(Severity.ERROR)) { 661 handler.onValidationFailure(result); 662 } else { 663 handler.onValidationSuccess(result); 664 } 659 handler.onValidationReport(report); 665 660 } finally { 666 re sult = null;661 report = null; 667 662 } 668 663 } … … 712 707 schematronValidator.transform(); 713 708 714 final XdmNode report = destination.getXdmNode();715 if ( report != null) {709 final XdmNode svrlDocument = destination.getXdmNode(); 710 if (svrlDocument != null) { 716 711 XPathCompiler xpathCompiler = null; 717 712 final XQueryEvaluator evaluator = 718 713 analyzeSchematronReport.load(); 719 evaluator.setContextItem( report);714 evaluator.setContextItem(svrlDocument); 720 715 for (final XdmItem item : evaluator) { 721 716 /* lazy initialize XPath compiler */ … … 737 732 xs.setContextItem(document); 738 733 XdmItem n = xs.evaluateSingle(); 739 line = SaxonLocationUtils.getLineNumber(n);740 column = SaxonLocationUtils.getColumnNumber(n);734 line = LocationUtils.getLineNumber(n); 735 column = LocationUtils.getColumnNumber(n); 741 736 } 742 737 if ("I".equals(s)) { 743 re sult.reportInfo(line, column, m);738 report.reportInfo(line, column, m); 744 739 } else if ("W".equals(s)) { 745 re sult.reportWarning(line, column, m);740 report.reportWarning(line, column, m); 746 741 } else { 747 re sult.reportError(line, column, m);742 report.reportError(line, column, m); 748 743 } 749 744 } // for … … 774 769 Throwable cause) { 775 770 logger.debug("reporting warning: [{}:{}]: {}", line, col, message); 776 if (re sult != null) {777 re sult.reportWarning(line, col, message, cause);771 if (report != null) { 772 report.reportWarning(line, col, message, cause); 778 773 } 779 774 } … … 783 778 Throwable cause) { 784 779 logger.debug("reporting error: [{}:{}]: {}", line, col, message); 785 if (re sult != null) {786 re sult.reportError(line, col, message, cause);780 if (report != null) { 781 report.reportError(line, col, message, cause); 787 782 } 788 783 } -
CMDIValidator/trunk/cmdi-validator-core/src/main/java/eu/clarin/cmdi/validator/CMDIValidatorConfig.java
r5395 r5402 26 26 public class CMDIValidatorConfig { 27 27 private final File root; 28 private final CMDIValidat orHandler handler;28 private final CMDIValidationHandler handler; 29 29 private FileFilter fileFilter = null; 30 30 private File schemaCacheDirectory = null; … … 36 36 37 37 private CMDIValidatorConfig(final File root, 38 final CMDIValidat orHandler handler) {38 final CMDIValidationHandler handler) { 39 39 if (root == null) { 40 40 throw new NullPointerException("root = null"); … … 58 58 59 59 60 public CMDIValidat orHandler getHandler() {60 public CMDIValidationHandler getHandler() { 61 61 return handler; 62 62 } … … 96 96 97 97 98 public Builder(final File root, final CMDIValidat orHandler handler) {98 public Builder(final File root, final CMDIValidationHandler handler) { 99 99 if (root == null) { 100 100 throw new NullPointerException("root == null"); -
CMDIValidator/trunk/cmdi-validator-core/src/main/java/eu/clarin/cmdi/validator/CMDIValidatorExtension.java
r5384 r5402 35 35 36 36 37 public abstract void validate(XdmNode document, 38 CMDIValidatorWriteableResult result) throws CMDIValidatorException; 37 public abstract void validate(final XdmNode document, 38 final CMDIWriteableValidationReport report) 39 throws CMDIValidatorException; 39 40 40 41 41 42 protected abstract void doInitialize() throws CMDIValidatorInitException; 42 43 43 } // CMDIValidatorExtension44 } // class CMDIValidatorExtension -
CMDIValidator/trunk/cmdi-validator-core/src/main/java/eu/clarin/cmdi/validator/CMDIWriteableValidationReport.java
r5384 r5402 17 17 package eu.clarin.cmdi.validator; 18 18 19 public interface CMDI ValidatorWriteableResult extends CMDIValidatorResult {19 public interface CMDIWriteableValidationReport extends CMDIValidationReport { 20 20 public void reportInfo(int line, int col, String message); 21 21 -
CMDIValidator/trunk/cmdi-validator-core/src/main/java/eu/clarin/cmdi/validator/CMDIWriteableValidatonReportImpl.java
r5395 r5402 6 6 import java.util.List; 7 7 8 final class CMDI ValidatorWriteableResultImpl implements CMDIValidatorWriteableResult {8 final class CMDIWriteableValidatonReportImpl implements CMDIWriteableValidationReport { 9 9 private final File file; 10 10 private List<Message> messages; … … 12 12 13 13 14 CMDI ValidatorWriteableResultImpl(File file) {14 CMDIWriteableValidatonReportImpl(final File file) { 15 15 this.file = file; 16 16 } … … 20 20 public File getFile() { 21 21 return file; 22 } 23 24 25 @Override 26 public boolean isSuccess() { 27 return isHighestSeverity(Severity.INFO); 28 } 29 30 31 @Override 32 public boolean isWarning() { 33 return isHighestSeverity(Severity.WARNING); 34 } 35 36 37 @Override 38 public boolean isFailed() { 39 return isHighestSeverity(Severity.ERROR); 22 40 } 23 41 … … 150 168 151 169 private static final class MessageImpl implements 152 CMDIValidat orResult.Message {170 CMDIValidationReport.Message { 153 171 private final Severity severity; 154 172 private final int line; -
CMDIValidator/trunk/cmdi-validator-core/src/main/java/eu/clarin/cmdi/validator/extensions/CheckHandlesExtension.java
r5394 r5402 31 31 import eu.clarin.cmdi.validator.CMDIValidatorExtension; 32 32 import eu.clarin.cmdi.validator.CMDIValidatorInitException; 33 import eu.clarin.cmdi.validator.CMDI ValidatorWriteableResult;33 import eu.clarin.cmdi.validator.CMDIWriteableValidationReport; 34 34 import eu.clarin.cmdi.validator.utils.HandleResolver; 35 import eu.clarin.cmdi.validator.utils. SaxonLocationUtils;35 import eu.clarin.cmdi.validator.utils.LocationUtils; 36 36 37 37 public class CheckHandlesExtension extends CMDIValidatorExtension { … … 79 79 80 80 @Override 81 public void validate(XdmNode document, CMDIValidatorWriteableResult result) 81 public void validate(final XdmNode document, 82 final CMDIWriteableValidationReport report) 82 83 throws CMDIValidatorException { 83 84 try { … … 86 87 for (XdmItem item : selector) { 87 88 String handle = null; 88 final int line = SaxonLocationUtils.getLineNumber(item);89 final int column = SaxonLocationUtils.getColumnNumber(item);89 final int line = LocationUtils.getLineNumber(item); 90 final int column = LocationUtils.getColumnNumber(item); 90 91 final String h = item.getStringValue(); 91 92 if (h != null) { … … 95 96 } else { 96 97 if (!handle.equals(h)) { 97 re sult.reportWarning(line, column, "handle '" + h +98 report.reportWarning(line, column, "handle '" + h + 98 99 "' contains leading or tailing spaces " + 99 100 "within <ResourceRef> element"); … … 103 104 104 105 if (handle != null) { 105 checkHandleURISyntax( handle, result, line, column);106 } else { 107 re sult.reportError(line, column,106 checkHandleURISyntax(report, handle, line, column); 107 } else { 108 report.reportError(line, column, 108 109 "invalid handle (<ResourceRef> was empty)"); 109 110 } … … 115 116 116 117 117 private void checkHandleURISyntax( String handle,118 CMDIValidatorWriteableResult result, int line, int column)119 throws CMDIValidatorException {118 private void checkHandleURISyntax( 119 final CMDIWriteableValidationReport report, final String handle, 120 final int line, final int column) throws CMDIValidatorException { 120 121 try { 121 122 final URI uri = new URI(handle); … … 128 129 final URI actionableURI = 129 130 new URI(HDL_PROXY_HTTP, HDL_PROXY_HOST, path, null); 130 checkHandleResolves( actionableURI, result, line, column);131 checkHandleResolves(report, actionableURI, line, column); 131 132 } catch (URISyntaxException e) { 132 133 /* should not happen */ … … 136 137 } else if (URN_SCHEME.equals(uri.getScheme())) { 137 138 if (resolveHandles) { 138 re sult.reportInfo(line, column, "PID '" + handle +139 report.reportInfo(line, column, "PID '" + handle + 139 140 "' skipped, because URN resolving is not supported"); 140 141 } else { 141 re sult.reportInfo(line, column, "PID '" + handle +142 report.reportInfo(line, column, "PID '" + handle + 142 143 "' skipped, because URN sytax checking is not supported"); 143 144 } … … 146 147 if (uri.getHost() != null) { 147 148 if (!HDL_PROXY_HOST.equalsIgnoreCase(uri.getHost())) { 148 re sult.reportError(line, column,149 report.reportError(line, column, 149 150 "The URI of PID '" + handle + 150 151 "' contains an unexpected host part of '" + 151 152 uri.getHost() + "'"); 152 153 } 153 checkHandleResolves( uri, result, line, column);154 } else { 155 re sult.reportError(line, column, "The URI of PID '" +154 checkHandleResolves(report, uri, line, column); 155 } else { 156 report.reportError(line, column, "The URI of PID '" + 156 157 handle + "' is missing the host part"); 157 158 } 158 159 } else { 159 160 if (uri.getScheme() != null) { 160 re sult.reportError(line, column,161 report.reportError(line, column, 161 162 "The URI of PID '" + handle + 162 163 "' contains an unexpected schema part of '" + 163 164 uri.getScheme() + "'"); 164 165 } else { 165 re sult.reportError(line, column, "The URI of PID '" +166 report.reportError(line, column, "The URI of PID '" + 166 167 handle + "' is missing a proper schema part"); 167 168 } 168 169 } 169 170 } catch (URISyntaxException e) { 170 re sult.reportError(line, column, "PID '" + handle +171 report.reportError(line, column, "PID '" + handle + 171 172 "' is not a well-formed URI: " + e.getMessage()); 172 173 } … … 174 175 175 176 176 private void checkHandleResolves( URI uri,177 CMDIValidatorWriteableResult result, int line, int column)178 throws CMDIValidatorException {177 private void checkHandleResolves( 178 final CMDIWriteableValidationReport result, final URI uri, 179 final int line, final int column) throws CMDIValidatorException { 179 180 if (resolver != null) { 180 181 try { -
CMDIValidator/trunk/cmdi-validator-core/src/main/java/eu/clarin/cmdi/validator/utils/LocationUtils.java
r5396 r5402 20 20 import net.sf.saxon.s9api.XdmNode; 21 21 22 public final class SaxonLocationUtils {23 24 private SaxonLocationUtils() {22 public final class LocationUtils { 23 24 private LocationUtils() { 25 25 } 26 26 … … 41 41 } 42 42 43 } // class SaxonLocationUtils43 } // class LocationUtils -
CMDIValidator/trunk/cmdi-validator-tool/src/main/java/eu/clarin/cmdi/validator/tool/CMDIValidatorTool.java
r5391 r5402 23 23 import java.util.Locale; 24 24 import java.util.concurrent.TimeUnit; 25 import java.util.concurrent.atomic.AtomicInteger; 26 import java.util.concurrent.atomic.AtomicLong; 25 27 26 28 import net.java.truevfs.access.TFile; … … 44 46 import eu.clarin.cmdi.validator.CMDIValidatorException; 45 47 import eu.clarin.cmdi.validator.CMDIValidatorInitException; 46 import eu.clarin.cmdi.validator.CMDIValidat orHandlerAdapter;47 import eu.clarin.cmdi.validator.CMDIValidat orResult;48 import eu.clarin.cmdi.validator.CMDIValidat orResult.Message;49 import eu.clarin.cmdi.validator.CMDIValidat orResult.Severity;48 import eu.clarin.cmdi.validator.CMDIValidationHandlerAdapter; 49 import eu.clarin.cmdi.validator.CMDIValidationReport; 50 import eu.clarin.cmdi.validator.CMDIValidationReport.Message; 51 import eu.clarin.cmdi.validator.CMDIValidationReport.Severity; 50 52 import eu.clarin.cmdi.validator.extensions.CheckHandlesExtension; 51 53 import eu.clarin.cmdi.validator.utils.HandleResolver; … … 229 231 230 232 231 final ValidationHandler handler = new ValidationHandler(verbose);233 final Handler handler = new Handler(verbose); 232 234 233 235 final CMDIValidatorConfig.Builder builder = … … 466 468 467 469 468 private static class ValidationHandler extends CMDIValidatorHandlerAdapter {470 private static class Handler extends CMDIValidationHandlerAdapter { 469 471 private final boolean verbose; 470 private long started = System.currentTimeMillis();471 private long finished = -1;472 private int filesTotal = 0;473 private int filesInvalid = 0;474 private long totalBytes = 0;472 private long started = -1; 473 private long finished = -1; 474 private AtomicInteger filesTotal = new AtomicInteger(); 475 private AtomicInteger filesInvalid = new AtomicInteger(); 476 private AtomicLong totalBytes = new AtomicLong(); 475 477 private boolean isCompleted = false; 476 478 private final Object waiter = new Object(); 477 479 478 480 479 private ValidationHandler(boolean verbose) {481 private Handler(boolean verbose) { 480 482 this.verbose = verbose; 481 483 } … … 496 498 497 499 public int getTotalFileCount() { 498 return filesTotal ;500 return filesTotal.get(); 499 501 } 500 502 501 503 502 504 public int getValidFileCount() { 503 return filesTotal - filesInvalid;505 return filesTotal.get() - filesInvalid.get(); 504 506 } 505 507 506 508 public int getInvalidFileCount() { 507 return filesInvalid ;509 return filesInvalid.get(); 508 510 } 509 511 510 512 511 513 public float getFailureRate() { 512 return (filesTotal > 0) 513 ? ((float) filesInvalid / (float) filesTotal) 514 final int total = filesTotal.get(); 515 return (total > 0) 516 ? ((float) filesInvalid.get() / (float) total) 514 517 : 0.0f; 515 518 } … … 517 520 518 521 public long getTotalBytes() { 519 return totalBytes ;522 return totalBytes.get(); 520 523 } 521 524 … … 539 542 public void onJobStarted() throws CMDIValidatorException { 540 543 logger.debug("validation process started"); 544 this.started = System.currentTimeMillis(); 541 545 } 542 546 … … 568 572 569 573 @Override 570 public void onValidation Success(final CMDIValidatorResult result)574 public void onValidationReport(final CMDIValidationReport report) 571 575 throws CMDIValidatorException { 572 final File file = result.getFile(); 573 synchronized (this) { 574 filesTotal++; 575 if (file != null) { 576 totalBytes += file.length(); 577 } 578 } // synchronized (this) { 579 580 if (result.isHighestSeverity(Severity.WARNING)) { 576 filesTotal.incrementAndGet(); 577 578 final File file = report.getFile(); 579 if (file != null) { 580 totalBytes.getAndAdd(file.length()); 581 } 582 583 switch (report.getHighestSeverity()) { 584 case INFO: 585 logger.debug("file '{}' is valid", file); 586 break; 587 case WARNING: 581 588 if (verbose) { 582 589 logger.warn("file '{}' is valid (with warnings):", file); 583 for (Message msg : re sult.getMessages()) {590 for (Message msg : report.getMessages()) { 584 591 if ((msg.getLineNumber() != -1) && 585 592 (msg.getColumnNumber() != -1)) { … … 596 603 } 597 604 } else { 598 Message msg = re sult.getFirstMessage(Severity.WARNING);599 int count = re sult.getMessageCount(Severity.WARNING);605 Message msg = report.getFirstMessage(Severity.WARNING); 606 int count = report.getMessageCount(Severity.WARNING); 600 607 if (count > 1) { 601 608 logger.warn("file '{}' is valid (with warnings): {} ({} more warnings)", … … 606 613 } 607 614 } 608 } else { 609 logger.debug("file '{}' is valid", file); 610 } 611 } 612 613 614 @Override 615 public void onValidationFailure(final CMDIValidatorResult result) { 616 final File file = result.getFile(); 617 synchronized (this) { 618 filesTotal++; 619 filesInvalid++; 620 if (file != null) { 621 totalBytes += file.length(); 622 } 623 } // synchronized (this) 624 625 if (verbose) { 626 logger.error("file '{}' is invalid:", file); 627 for (Message msg : result.getMessages()) { 628 if ((msg.getLineNumber() != -1) && 629 (msg.getColumnNumber() != -1)) { 630 logger.error(" ({}) {} [line={}, column={}]", 631 msg.getSeverity().getShortcut(), 632 msg.getMessage(), 633 msg.getLineNumber(), 634 msg.getColumnNumber()); 615 break; 616 case ERROR: 617 filesInvalid.incrementAndGet(); 618 if (verbose) { 619 logger.error("file '{}' is invalid:", file); 620 for (Message msg : report.getMessages()) { 621 if ((msg.getLineNumber() != -1) && 622 (msg.getColumnNumber() != -1)) { 623 logger.error(" ({}) {} [line={}, column={}]", msg 624 .getSeverity().getShortcut(), msg 625 .getMessage(), msg.getLineNumber(), msg 626 .getColumnNumber()); 627 } else { 628 logger.error(" ({}) {}", msg.getSeverity() 629 .getShortcut(), msg.getMessage()); 630 } 631 } 632 } else { 633 Message msg = report.getFirstMessage(Severity.ERROR); 634 int count = report.getMessageCount(Severity.ERROR); 635 if (count > 1) { 636 logger.error( 637 "file '{}' is invalid: {} ({} more errors)", 638 file, msg.getMessage(), (count - 1)); 635 639 } else { 636 logger.error(" ({}) {}", 637 msg.getSeverity().getShortcut(), 640 logger.error("file '{}' is invalid: {}", file, 638 641 msg.getMessage()); 639 642 } 640 643 } 641 } else { 642 Message msg = result.getFirstMessage(Severity.ERROR); 643 int count = result.getMessageCount(Severity.ERROR); 644 if (count > 1) { 645 logger.error("file '{}' is invalid: {} ({} more errors)", 646 file, msg.getMessage(), (count - 1)); 647 } else { 648 logger.error("file '{}' is invalid: {}", 649 file, msg.getMessage()); 650 } 651 } 652 } 653 } // class JobHandler 644 break; 645 default: 646 throw new CMDIValidatorException("unexpected severity: " + 647 report.getHighestSeverity()); 648 } // switch 649 } 650 } // class Handler 654 651 655 652
Note: See TracChangeset
for help on using the changeset viewer.