xsAnyURI::isOK()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
c 2
b 1
f 0
dl 0
loc 7
rs 9.4285
cc 3
eloc 4
nc 2
nop 0
1
<?php
2
3
namespace AlgoWeb\xsdTypes;
4
5
use AlgoWeb\xsdTypes\AxillaryClasses\UriValidator;
6
use AlgoWeb\xsdTypes\AxillaryClasses\UrnValidator;
7
use AlgoWeb\xsdTypes\Facets\LengthTrait;
8
9
/**
10
 * The type xsd:anyURI represents a Uniform Resource Identifier (URI) reference.  URIs are used to identify resources,
11
 * and they may be absolute or relative.  Absolute URIs provide the entire context for locating the resources, such
12
 * as http://datypic.com/prod.html.  Relative URIs are specified as the difference from a base URI, such as
13
 * ../prod.html. It is also possible to specify a fragment identifier, using the # character, such as
14
 * ../prod.html#shirt.
15
 *
16
 * The three previous examples happen to be HTTP URLs (Uniform Resource Locators), but URIs also encompass URLs of
17
 * other schemes (e.g., FTP, gopher, telnet), as well as URNs (Uniform Resource Names).  URIs are not required to be
18
 * dereferencable; that is, it is not necessary for there to be a web page at http://datypic.com/prod.html in
19
 * order for this to be a valid URI.
20
 *
21
 * URIs require that some characters be escaped with their hexadecimal Unicode code point preceded by the % character.
22
 * This includes non-ASCII characters and some ASCII characters, namely control characters, spaces, and the following
23
 * characters (unless they are used as deliimiters in the URI): <>#%{}|\^`.  For example, ../édition.html must be
24
 * represented instead as ../%C3%A9dition.html, with the é escaped as %C3%A9.  However, the anyURI type will accept
25
 * these characters either escaped or unescaped.  With the exception of the characters % and #, it will assume that
26
 * unescaped characters are intended to be escaped when used in an actual URI, although the schema processor will do
27
 * nothing to alter them.  It is valid for an anyURI value to contain a space, but this practice is strongly
28
 * discouraged. Spaces should instead be escaped using %20.
29
 *
30
 * The schema processor is not required to parse the contents of an xsd:anyURI value to determine whether it is valid
31
 * according to any particular URI scheme.  Since the bare minimum rules for valid URI references are fairly generic,
32
 * the schema processor will accept most character strings, including an empty value.  The only values that are not
33
 * accepted are ones that make inappropriate use of reserved characters, such as ones that contain multiple #
34
 * characters or have % characters that are not followed by two hexadecimal digits.
35
 *
36
 * Note that when relative URI references such as "../prod" are used as values of xsd:anyURI, no attempt is made to
37
 * determine or keep track of the base URI to which they may be applied.  For more information on URIs, see RFC 2396,
38
 * Uniform Resource Identifiers (URI): Generic Syntax.
39
 *
40
 * @package AlgoWeb\xsdTypes
41
 */
42
class xsAnyURI extends xsAnySimpleType
43
{
44
    use LengthTrait;
45
46
    /**
47
     * Construct.
48
     *
49
     * @param string $value
50
     */
51
    public function __construct($value)
52
    {
53
        parent::__construct($value);
54
        $this->setWhiteSpaceFacet('collapse');
55
    }
56
57
    protected function isOK()
58
    {
59
        $this->checkLength($this->value);
60
        if (!UrnValidator::validate($this->value) && !UriValidator::validate($this->value)) {
61
            throw new \InvalidArgumentException('the value supplied to ' . get_class($this) . ' Must be a URI or URN');
62
        }
63
    }
64
}
65