david: doc/kolab-formats/validation kolab-storage.rng, NONE, 1.1 kolablint, NONE, 1.1 runtests.sh, NONE, 1.1

cvs at intevation.de cvs at intevation.de
Tue Jun 15 23:11:31 CEST 2004


Author: david

Update of /kolabrepository/doc/kolab-formats/validation
In directory doto:/tmp/cvs-serv28132

Added Files:
	kolab-storage.rng kolablint runtests.sh 
Log Message:
Complete RelaxNG schema for the kolab storage format (pending a few answers on the list).
kolablint script to check an xml file against the schema (see inside the script for dependencies)
Small testsuite.


--- NEW FILE: kolab-storage.rng ---
<?xml version="1.0" encoding="UTF-8"?>
<!--
    Kolab Storage Specification 1.0
    Draft 1, 15 Jun 2004
    Relax-NG Schema

    $Id: kolab-storage.rng,v 1.1 2004/06/15 21:11:29 david Exp $

    © 2004 Klaralvdalens-Datakonsult AB
-->

<grammar
    xmlns="http://relaxng.org/ns/structure/1.0"
    xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"

    datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
>
  <start>
    <choice>
      <ref name="event"/>
      <ref name="journal"/>
      <ref name="task"/>
      <ref name="note"/>
      <ref name="contact"/>
    </choice>
  </start>
  <define name="event">
    <element name="event">
      <interleave>
	<ref name="common-in-all-types"/>
	<ref name="common-in-tasks-and-events"/>
	<ref name="event-fields"/>
      </interleave>
    </element>
  </define>
  <define name="journal">
    <element name="journal">
      <interleave>
	<ref name="common-in-all-types"/>
	<ref name="journal-fields"/>
      </interleave>
    </element>
  </define>
  <define name="task">
    <element name="task">
      <interleave>
	<ref name="common-in-all-types"/>
	<ref name="common-in-tasks-and-events"/>
	<ref name="task-fields"/>
      </interleave>
    </element>
  </define>
  <define name="note">
    <element name="note">
      <interleave>
	<ref name="common-in-all-types"/>
	<ref name="note-fields"/>
      </interleave>
    </element>
  </define>
  <define name="contact">
    <element name="contact">
      <interleave>
	<ref name="common-in-all-types"/>
	<ref name="contact-fields"/>
      </interleave>
    </element>
  </define>
  <define name="common-in-all-types">
    <interleave>
      <optional>
	<attribute name="version">
	  <ref name="string"/>
	</attribute>
      </optional>
      <optional>
	<element name="uid">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="body">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="categories">
	  <ref name="string"/>
	</element>
      </optional>
      <element name="creation-date">
	<ref name="dateTime"/>
      </element>
      <element name="last-modification-date">
	<ref name="dateTime"/>
      </element>
      <optional>
	<element name="sensitivity" a:defaultValue="public">
	  <choice>
	    <value>private</value>
	    <value>confidential</value>
	    <value>public</value>
	  </choice>
	</element>
      </optional>
    </interleave>
  </define>
  <define name="common-in-tasks-and-events">
    <interleave>
      <optional>
	<element name="summary">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="location">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="organizer">
	  <ref name="name-and-email"/>
	</element>
      </optional>
      <optional>
	<element name="start-date">
	  <ref name="dateOrDateTime"/>
	</element>
      </optional>
      <optional>
	<element name="alarm">
	  <ref name="number"/>
	</element>
      </optional>
      <optional>
          <ref name="recurrence"/>
      </optional>
      <zeroOrMore>
	<ref name="attendee"/>
      </zeroOrMore>
    </interleave>
  </define>

  <define name="recurrence">
    <choice>
      <element name="recurrence">
	<attribute name="cycle">
	  <a:documentation>every X days</a:documentation>
	  <value>daily</value>
	</attribute>
	<ref name="recurrence-common"/>
      </element>
      <element name="recurrence">
	<attribute name="cycle">
	  <a:documentation>every X weeks, on given week day(s)</a:documentation>
	  <value>weekly</value>
	</attribute>
	<interleave>
	  <ref name="recurrence-common"/>
	  <a:documentation>oneOrMore: more precisely 1 to 7</a:documentation>
	  <oneOrMore>
	    <ref name="recurrence-day"/>
	  </oneOrMore>
	</interleave>
      </element>
      <element name="recurrence">
	<interleave>
	  <attribute name="cycle">
	    <a:documentation>every X months, on a given date, e.g. 12</a:documentation>
	    <value>monthly</value>
	  </attribute>
	  <attribute name="type">
	    <value>daynumber</value>
	  </attribute>
	</interleave>
	<interleave>
	  <ref name="recurrence-common"/>
	  <ref name="recurrence-date"/>
	</interleave>
      </element>
      <element name="recurrence">
	<interleave>
	  <attribute name="cycle">
	    <a:documentation>every X months, e.g. third monday</a:documentation>
	    <value>monthly</value>
	  </attribute>
	  <attribute name="type">
	    <value>weekday</value>
	  </attribute>
	</interleave>
	<interleave>
	  <ref name="recurrence-common"/>
	  <ref name="recurrence-day"/>
	  <ref name="recurrence-daynumber"/>
	</interleave>
      </element>
      <element name="recurrence">
	<interleave>
	  <attribute name="cycle">
	    <a:documentation>every X years, on given month day</a:documentation>
	    <value>yearly</value>
	  </attribute>
	  <attribute name="type">
	    <value>monthday</value>
	  </attribute>
	</interleave>
	<interleave>
	  <ref name="recurrence-common"/>
	  <ref name="recurrence-date"/>
	  <ref name="recurrence-month"/>
	</interleave>
      </element>
      <element name="recurrence">
	<interleave>
	  <attribute name="cycle">
	    <a:documentation>every X years, on given year day</a:documentation>
	    <value>yearly</value>
	  </attribute>
	  <attribute name="type">
	    <value>yearday</value>
	  </attribute>
	</interleave>
	<interleave>
	  <ref name="recurrence-common"/>
	  <ref name="recurrence-daynumber"/>
	</interleave>
      </element>
    </choice>
  </define>

  <define name="recurrence-common">
    <interleave>
      <optional>
	<element name="interval" a:defaultValue="1">
	  <ref name="number"/>
	</element>
      </optional>
      <ref name="range"/>
      <zeroOrMore>
	<element name="exception">
	  <ref name="date"/>
	</element>
      </zeroOrMore>
    </interleave>
  </define>

  <define name="recurrence-day">
    <element name="day">
      <choice>
	<value>monday</value>
	<value>tuesday</value>
	<value>wednesday</value>
	<value>thursday</value>
	<value>friday</value>
	<value>saturday</value>
	<value>sunday</value>
      </choice>
    </element>
  </define>

  <define name="recurrence-date">
    <element name="date">
      <ref name="number"/>
    </element>
  </define>

  <define name="recurrence-daynumber">
    <element name="daynumber">
      <ref name="number"/>
    </element>
  </define>

  <define name="recurrence-month">
    <element name="month">
      <ref name="number"/>
    </element>
  </define>

  <define name="range">
    <choice>
      <element name="range">
	<attribute name="type">
	  <a:documentation>never ending recurrence</a:documentation>
	  <value>none</value>
	</attribute>
      </element>
      <element name="range">
	<attribute name="type">
	  <a:documentation>recurrence happens a given number of times</a:documentation>
	  <value>number</value>
	</attribute>
	<ref name="number"/>
      </element>
      <element name="range">
	<attribute name="type">
	  <a:documentation>recurrence happens until given date</a:documentation>
	  <value>date</value>
	</attribute>
	<ref name="date"/>
      </element>
    </choice>
  </define>

  <define name="attendee">
    <element name="attendee">
      <interleave>
	<optional>
	  <element name="display-name">
	    <ref name="string"/>
	  </element>
	</optional>
	<optional>
	  <element name="email">
	    <ref name="string"/>
	  </element>
	</optional>
	<optional>
	  <element name="status" a:defaultValue="none">
	    <choice>
	      <value>none</value>
	      <value>tentative</value>
	      <value>accepted</value>
	      <value>declined</value>
	    </choice>
	  </element>
	</optional>
	<optional>
	  <element name="request-response" a:defaultValue="true">
	    <ref name="boolean"/>
	  </element>
	</optional>
	<optional>
	  <element name="invitation-sent" a:defaultValue="false">
	    <ref name="boolean"/>
	  </element>
	</optional>
	<optional>
	  <element name="role" a:defaultValue="required">
	    <choice>
	      <value>required</value>
	      <value>optional</value>
	      <value>resource</value>
	    </choice>
	  </element>
	</optional>
      </interleave>
    </element>
  </define>

  <define name="note-fields">
    <interleave>
      <optional>
	<element name="summary">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="background-color" a:defaultValue="#000000">
	  <ref name="color"/>
	</element>
      </optional>
      <optional>
	<element name="foreground-color" a:defaultValue="#ffff00">
	  <ref name="color"/>
	</element>
      </optional>
    </interleave>
  </define>

  <define name="contact-fields">
    <interleave>
      <optional>
	<element name="name">
	  <interleave>
	    <optional>
	      <element name="given-name">
		<ref name="string"/>
	      </element>
	    </optional>
	    <optional>
	      <element name="middle-names">
		<ref name="string"/>
	      </element>
	    </optional>
	    <optional>
	      <element name="last-name">
		<ref name="string"/>
	      </element>
	    </optional>
	    <optional>
	      <element name="full-name">
		<ref name="string"/>
	      </element>
	    </optional>
	    <optional>
	      <element name="initials">
		<ref name="string"/>
	      </element>
	    </optional>
	    <optional>
	      <element name="prefix">
		<ref name="string"/>
	      </element>
	    </optional>
	    <optional>
	      <element name="suffix">
		<ref name="string"/>
	      </element>
	    </optional>
	  </interleave>
	</element>
      </optional>
      <optional>
	<element name="role">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="free-busy-url">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="organization">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="web-page">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="im-address">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="department">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="office-location">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="profession">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="job-title">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="manager-name">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="assistant">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="nick-name">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="spouse-name">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="birthday">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="anniversary">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="picture">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="children">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="gender">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="language">
	  <ref name="string"/>
	</element>
      </optional>
      <zeroOrMore>
	<ref name="phone"/>
      </zeroOrMore>
      <zeroOrMore>
	<ref name="email"/>
      </zeroOrMore>
      <zeroOrMore>
	<element name="address">
	  <ref name="address-fields"/>
	</element>
      </zeroOrMore>
      <optional>
	<element name="preferred-address">
	  <ref name="address-fields"/>
	</element>
      </optional>
    </interleave>
  </define>

  <define name="phone">
    <element name="phone">
      <interleave>
	<element name="type">
	  <choice>
	    <value>business1</value>
	    <value>business2</value>
	    <value>businessfax</value>
	    <value>callback</value>
	    <value>car</value>
	    <value>company</value>
	    <value>home1</value>
	    <value>home2</value>
	    <value>homefax</value>
	    <value>isdn</value>
	    <value>mobile</value>
	    <value>pager</value>
	    <value>primary</value>
	    <value>radio</value>
	    <value>telex</value>
	    <value>ttytdd</value>
	    <value>assistant</value>
	    <value>other</value>
	  </choice>
	</element>
	<element name="number">
	  <ref name="string"/>
	</element>
      </interleave>
    </element>
  </define>

  <define name="email">
    <element name="email">
      <ref name="name-and-email"/>
    </element>
  </define>

  <define name="address-fields">
    <interleave>
      <optional>
	<element name="type" a:defaultValue="home">
	  <choice>
	    <value>home</value>
	    <value>business</value>
	    <value>other</value>
	  </choice>
	</element>
      </optional>
      <optional>
	<element name="street">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="city">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="state">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="zip">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="country">
	  <ref name="string"/>
	</element>
      </optional>
    </interleave>
  </define>

  <define name="journal-fields">
    <interleave>
      <optional>
	<element name="summary">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="start-date">
	  <ref name="dateTime"/>
	</element>
      </optional>
      <optional>
	<element name="end-date">
	  <ref name="dateTime"/>
	</element>
      </optional>
      <zeroOrMore>
	<element name="contact">
	  <ref name="name-and-email"/>
	</element>
      </zeroOrMore>
    </interleave>
  </define>

  <define name="name-and-email">
    <interleave>
      <optional>
	<element name="display-name">
	  <ref name="string"/>
	</element>
      </optional>
      <optional>
	<element name="email">
	  <ref name="string"/>
	</element>
      </optional>
    </interleave>
  </define>

  <define name="event-fields">
    <interleave>
      <optional>
	<element name="show-time-as" a:defaultValue="busy">
	  <choice>
	    <value>free</value>
	    <value>tentative</value>
	    <value>busy</value>
	    <value>outofoffice</value>
	  </choice>
	</element>
      </optional>
      <optional>
	<element name="color-label">
	  <ref name="string"/><!-- TODO -->
	</element>
      </optional>
      <optional>
	<element name="end-date">
	  <ref name="dateOrDateTime"/>
	</element>
      </optional>
    </interleave>
  </define>

  <define name="task-fields">
    <interleave>
      <optional>
	<element name="priority" a:defaultValue="3">
	  <data type="integer">
	    <param name="minInclusive">1</param>
	    <param name="maxInclusive">5</param>
	  </data>
	</element>
      </optional>
      <optional>
	<element name="completed" a:defaultValue="0">
	  <data type="integer">
	    <param name="minInclusive">0</param>
	    <param name="maxInclusive">100</param>
	  </data>
	</element>
      </optional>
      <optional>
	<element name="status" a:defaultValue="not-started">
	  <choice>
	    <value>not-started</value>
	    <value>in-progress</value>
	    <value>completed</value>
	    <value>waiting-on-someone-else</value>
	    <value>deferred</value>
	  </choice>
	</element>
      </optional>
      <optional>
	<element name="due-date">
	  <ref name="dateOrDateTime"/>
	</element>
      </optional>
      <optional>
	<element name="parent">
	  <ref name="string"/>
	</element>
      </optional>
    </interleave>
  </define>

  <!-- The data types -->
  <define name="string">
    <data type="string"/>
  </define>
  <define name="number">
    <data type="integer"/>
  </define>
  <define name="date">
    <data type="date"/>
  </define>
  <define name="boolean">
    <data type="boolean"/>
  </define>
  <define name="dateTime">
    <data type="dateTime"/>
  </define>
  <define name="color">
    <data type="string">
      <param name="pattern">#[0-9a-fA-F]{6}</param>
    </data>
  </define>
  <define name="dateOrDateTime">
    <choice>
      <data type="date"/>
      <data type="dateTime"/>
    </choice>
  </define>
</grammar>

<!-- This is for emacs to help indenting.
Local variables:
mode: xml
sgml-indent-data:t
End:
-->

--- NEW FILE: kolablint ---
#!/bin/sh
# This script validates an xml file against the kolab-storage RelaxNG schema.
#
# Requirements:
# * jing is a java tool for checking XML files against a RelaxNG schema.
#   You can get it from http://www.thaiopensource.com/relaxng/jing.html.
#   Then make a symlink called "jing.jar" in the current directory.
#
# * Unless you're using the gcj-compiled version of jing, you need a Java Runtime Environment.
#   Jing recommends using JRE 1.4, which can be downloaded from from java.sun.com
#   Ensure that the right 'java' executable is in your PATH.
#
# David Faure <faure at kde.org>. GPL v2.
#
java -jar jing.jar -i kolab-storage.rng $*

--- NEW FILE: runtests.sh ---
#!/bin/sh
for i in tests/*.xml; do
	echo "Checking $i..."
	./kolablint $i
done
echo "Done."





More information about the commits mailing list