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 public class AboutNotURIRule implements Rule {
39
40 public static final String NODES_WITH_INVALID_ABOUT = "nodes-with-invalid-about";
41
42 @Override
43 public String getHRName() {
44 return "about-not-uri-rule";
45 }
46
47 @SuppressWarnings("unchecked")
48 @Override
49 public boolean applyOn(DOMDocument document, @SuppressWarnings("rawtypes") RuleContext context,
50 ValidationReportBuilder validationReportBuilder) {
51 final List<Node> nodesWithAbout = document.getNodesWithAttribute("about");
52 final List<Node> nodesWithInvalidAbout = new ArrayList<>();
53 for (Node nodeWithAbout : nodesWithAbout) {
54 if (!aboutIsValid(nodeWithAbout)) {
55 validationReportBuilder.reportIssue(ValidationReport.IssueLevel.ERROR,
56 "Invalid about value for node, expected valid URL.", nodeWithAbout);
57 nodesWithInvalidAbout.add(nodeWithAbout);
58 }
59 }
60 if (nodesWithInvalidAbout.isEmpty()) {
61 return false;
62 }
63 context.putData(NODES_WITH_INVALID_ABOUT, nodesWithInvalidAbout);
64 return true;
65 }
66
67 private boolean aboutIsValid(Node n) {
68 final String aboutContent = n.getAttributes().getNamedItem("about").getTextContent();
69 if (isURL(aboutContent)) {
70 return true;
71 }
72 final char firstChar = aboutContent.charAt(0);
73 return firstChar == '#' || firstChar == '/';
74 }
75
76 private boolean isURL(String candidateIRIStr) {
77 try {
78 new URL(candidateIRIStr);
79 } catch (MalformedURLException murle) {
80 return false;
81 }
82 return true;
83 }
84
85 }