1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.any23.validator.rule;
19
20 import org.apache.any23.validator.DOMDocument;
21 import org.apache.any23.validator.Rule;
22 import org.apache.any23.validator.RuleContext;
23 import org.apache.any23.validator.ValidationReport;
24 import org.apache.any23.validator.ValidationReportBuilder;
25 import org.w3c.dom.Node;
26
27 import java.net.MalformedURLException;
28 import java.net.URL;
29 import java.util.ArrayList;
30 import java.util.List;
31
32
33
34
35
36
37
38
39 public class AboutNotURIRule implements Rule {
40
41 public static final String NODES_WITH_INVALID_ABOUT = "nodes-with-invalid-about";
42
43 public String getHRName() {
44 return "about-not-uri-rule";
45 }
46
47 public boolean applyOn(
48 DOMDocument document,
49 RuleContext context,
50 ValidationReportBuilder validationReportBuilder
51 ) {
52 final List<Node> nodesWithAbout = document.getNodesWithAttribute("about");
53 final List<Node> nodesWithInvalidAbout = new ArrayList<Node>();
54 for(Node nodeWithAbout : nodesWithAbout) {
55 if ( ! aboutIsValid(nodeWithAbout) ) {
56 validationReportBuilder.reportIssue(
57 ValidationReport.IssueLevel.error,
58 "Invalid about value for node, expected valid URL.",
59 nodeWithAbout
60 );
61 nodesWithInvalidAbout.add(nodeWithAbout);
62 }
63 }
64 if(nodesWithInvalidAbout.isEmpty()) {
65 return false;
66 }
67 context.putData(NODES_WITH_INVALID_ABOUT, nodesWithInvalidAbout);
68 return true;
69 }
70
71 private boolean aboutIsValid(Node n) {
72 final String aboutContent = n.getAttributes().getNamedItem("about").getTextContent();
73 if( isURL(aboutContent) ) {
74 return true;
75 }
76 final char firstChar = aboutContent.charAt(0);
77 return firstChar == '#' || firstChar == '/';
78 }
79
80 private boolean isURL(String candidateURIStr) {
81 try {
82 new URL(candidateURIStr);
83 } catch (MalformedURLException murle) {
84 return false;
85 }
86 return true;
87 }
88
89 }