Konzept

Schemata

(Dieser Entwurf wird kontinuierlich verändert. Eine finale Version wird erst mit Version 1.0 veröffentlicht.)

XML Schema

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://librml.org/schema"
    xmlns:libRML="http://librml.org/schema"
    attributeFormDefault="unqualified"
    elementFormDefault="qualified"
    version="0.4.0">
    <xs:element name="libRML" type="libRML:libRMLType" />

    <!-- libRMLType - Container for all -->
    <xs:complexType name="libRMLType">
        <!-- Contains only 1 subelement and a string 'version' -->
        <xs:sequence>
            <xs:element type="libRML:ItemType" name="item" minOccurs="1" maxOccurs="1" />
        </xs:sequence>
        <xs:attribute type="xs:string" name="version" />
    </xs:complexType>

    <!-- itemType - has many actions and some attributes -->
    <xs:complexType name="ItemType">
        <xs:sequence minOccurs="1" maxOccurs="unbounded">
            <xs:element type="libRML:ActionType" name="action" />
        </xs:sequence>
        <xs:attribute type="xs:NMTOKEN" name="id" />
        <xs:attribute type="xs:anyURI" name="tenant" />
        <xs:attribute type="xs:boolean" name="mention" />
        <xs:attribute type="xs:boolean" name="sharealike" />
        <xs:attribute type="xs:boolean" name="commercialuse" />
        <xs:attribute type="xs:boolean" name="copyright" />
        <xs:attribute type="xs:string" name="template" />
        <xs:attribute type="xs:anyURI" name="usageguide" />
    </xs:complexType>

    <!-- ActionType - has many restrictions and some attributes -->
    <xs:complexType name="ActionType">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element type="libRML:RestrictionType" name="restriction" />
        </xs:sequence>
        <xs:attribute name="type" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="displaymetadata" />
                    <xs:enumeration value="read" />
                    <xs:enumeration value="run" />
                    <xs:enumeration value="lend" />
                    <xs:enumeration value="download" />
                    <xs:enumeration value="print" />
                    <xs:enumeration value="reproduce" />
                    <xs:enumeration value="modify" />
                    <xs:enumeration value="reuse" />
                    <xs:enumeration value="distribute" />
                    <xs:enumeration value="publish" />
                    <xs:enumeration value="archive" />
                    <xs:enumeration value="index" />
                    <xs:enumeration value="move" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute type="xs:boolean" name="permission" use="required" />
    </xs:complexType>

    <!-- RestrictionType -->
    <xs:complexType name="RestrictionType">
        <xs:attribute name="type" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:NMTOKEN">
                    <xs:enumeration value="parts" />
                    <xs:enumeration value="group" />
                    <xs:enumeration value="age" />
                    <xs:enumeration value="location" />
                    <xs:enumeration value="date" />
                    <xs:enumeration value="duration" />
                    <xs:enumeration value="count" />
                    <xs:enumeration value="concurrent" />
                    <xs:enumeration value="watermark" />
                    <xs:enumeration value="quality" />
                    <xs:enumeration value="agreement" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute type="xs:date" name="fromdate" />
        <xs:attribute type="xs:date" name="todate" />
        <xs:attribute type="xs:positiveInteger" name="maxresolution" />
        <xs:attribute type="xs:string" name="maxbitrate" />
        <xs:attribute type="xs:positiveInteger" name="count" />
        <xs:attribute type="xs:positiveInteger" name="sessions" />
        <xs:attribute type="xs:Name" name="inside" />
        <xs:attribute name="subnet">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <!-- Regex for IPV4 incl. CDIR -->
                    <xs:pattern value="((1?\d?\d|2[0-4]\d|25[0-5])\.){3}(1?\d?\d|2[0-4]\d|25[0-5])/(3[0-2]|[12]?\d)" />
                    <!-- Regex for IPv6 -->
                    <xs:pattern value="(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){1,6}|:((:[0-9a-fA-F]{1,4}){1,7}|:))/(12[0-8]|1[01][0-9]|[1-9][0-9]|[0-9])"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
        <xs:attribute type="xs:Name" name="outside" />
        <xs:attribute type="xs:string" name="watermarkvalue" />
        <xs:attribute type="xs:positiveInteger" name="duration" />
        <xs:attribute type="xs:positiveInteger" name="minage" />
        <xs:attribute type="xs:positiveInteger" name="maxage" />
        <xs:attribute type="xs:boolean" name="required" />
        <xs:attribute type="xs:positiveInteger" name="parts" />
        <xs:attribute type="xs:NMTOKENS" name="groups" />
    </xs:complexType>
</xs:schema>

JSON Schema

{
  "$defs": {
    "actions_type": {
      "items": {
        "additionalProperties": false,
        "properties": {
          "permission": {
            "type": "boolean"
          },
          "restrictions": {
            "$ref": "#/$defs/restrictions_type"
          },
          "type": {
            "enum": [
              "displaymetadata",
              "read",
              "run",
              "lend",
              "download",
              "print",
              "reproduce",
              "modify",
              "reuse",
              "distribute",
              "publish",
              "archive",
              "index",
              "move"
            ],
            "type": "string"
          }
        },
        "required": [
          "permission",
          "type"
        ],
        "type": "object"
      },
      "minItems": 0,
      "type": "array"
    },
    "restrictions_type": {
      "items": {
        "additionalProperties": false,
        "properties": {
          "count": {
            "minimum": 1,
            "type": "integer"
          },
          "duration": {
            "minimum": 1,
            "type": "integer"
          },
          "fromdate": {
            "format": "date",
            "type": "string"
          },
          "groups": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "inside": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "maxage": {
            "minimum": 1,
            "type": "integer"
          },
          "maxbitrate": {
            "minimum": 1,
            "type": "integer"
          },
          "maxresolution": {
            "minimum": 1,
            "type": "integer"
          },
          "minage": {
            "minimum": 1,
            "type": "integer"
          },
          "outside": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "parts": {
            "minimum": 1,
            "type": "integer"
          },
          "permission": {
            "type": "boolean"
          },
          "property": {
            "type": "boolean"
          },
          "sessions": {
            "minimum": 1,
            "type": "integer"
          },
          "subnet": {
            "oneOf": [
              {
                "pattern": "^((1?\\d?\\d|2[0-4]\\d|25[0-5])\\.){3}(1?\\d?\\d|2[0-4]\\d|25[0-5])/(3[0-2]|[12]?\\d)$",
                "type": "string"
              },
              {
                "pattern": "^(([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}|([0-9A-Fa-f]{1,4}:){1,7}:|([0-9A-Fa-f]{1,4}:){1,6}:[0-9A-Fa-f]{1,4}|([0-9A-Fa-f]{1,4}:){1,5}(:[0-9A-Fa-f]{1,4}){1,2}|([0-9A-Fa-f]{1,4}:){1,4}(:[0-9A-Fa-f]{1,4}){1,3}|([0-9A-Fa-f]{1,4}:){1,3}(:[0-9A-Fa-f]{1,4}){1,4}|([0-9A-Fa-f]{1,4}:){1,2}(:[0-9A-Fa-f]{1,4}){1,5}|[0-9A-Fa-f]{1,4}:((:[0-9A-Fa-f]{1,4}){1,6})|:((:[0-9A-Fa-f]{1,4}){1,7}|:))(/(12[0-8]|1[01][0-9]|[1-9]?[0-9]))$",
                "type": "string"
              }
            ]
          },
          "todate": {
            "format": "date",
            "type": "string"
          },
          "type": {
            "enum": [
              "parts",
              "group",
              "age",
              "location",
              "date",
              "duration",
              "count",
              "concurrent",
              "watermark",
              "quality",
              "agreement"
            ],
            "type": "string"
          },
          "watermarkvalue": {
            "format": "uri",
            "type": "string"
          }
        },
        "required": [
          "type"
        ],
        "type": "object"
      },
      "minItems": 0,
      "type": "array"
    }
  },
  "$id": "https://librml.org/schema/librml.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema#",
  "additionalProperties": false,
  "description": "LibRML schema version 0.4.0",
  "properties": {
    "actions": {
      "$ref": "#/$defs/actions_type"
    },
    "commercialuse": {
      "type": "boolean"
    },
    "copyright": {
      "type": "boolean"
    },
    "id": {
      "type": "string"
    },
    "mention": {
      "type": "boolean"
    },
    "sharealike": {
      "type": "boolean"
    },
    "template": {
      "type": "string"
    },
    "tenant": {
      "format": "uri",
      "type": "string"
    },
    "usageguide": {
      "format": "uri",
      "type": "string"
    }
  },
  "type": "object"
}