From d61f36c13dffae361b6ef90a8d00f63b9141f5f0 Mon Sep 17 00:00:00 2001
From: sb <sb>
Date: Mon, 4 Feb 2008 15:54:46 +0000
Subject: [PATCH] Mainly grammatical changes involving the replacement of
 type='serial' with generators

---
 schemas/adl-0.dtd               | 71 ++++++++++++++++++++++++---------
 transforms01/adl2canonical.xslt | 29 +++++++++-----
 2 files changed, 73 insertions(+), 27 deletions(-)

diff --git a/schemas/adl-0.dtd b/schemas/adl-0.dtd
index 0a0f30d..796f603 100755
--- a/schemas/adl-0.dtd
+++ b/schemas/adl-0.dtd
@@ -13,7 +13,7 @@
     <!--  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  -->
     
     <!--
-        $Revision: 1.7 $
+        $Revision: 1.8 $
  	    -->
 
 <!--  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  -->
@@ -82,15 +82,8 @@
 					    char(1)		  java.sql.Types.CHAR
 	text:			  text or		  java.sql.Types.LONGVARCHAR 
 					    memo		    java.sql.Types.CLOB
-              
-  Also, a hack, which may not belong here:
-              
-  serial:     An integer whose value is automatically assigned by the database. Given 
-              that Canonical ADL requires that every key must be specified, we
-              need a way of distinguishing those which are system generated from
-              those which aren't. This may not be the right way to do it!
 -->
-<!ENTITY % SimpleDataTypes "%DefinableDataTypes;|boolean|text|serial" >
+<!ENTITY % SimpleDataTypes "%DefinableDataTypes;|boolean|text" >
 
 <!-- 
 	data types which are more complex than SimpleDataTypes...
@@ -128,6 +121,18 @@
 	"name CDATA #REQUIRED
 	 properties (all|user-distict|listed) #REQUIRED" >
 
+<!-- Actions for generators (mainly for keyfields - see entity 'generator', below
+  assigned:           In manually-maintained code, you contract to assign a value 
+                      to this property before it is persisted.
+  guid:               The system will supply a unique GUid value to this field 
+                      before it is persisted.
+  mannual:            You contract to supply a generatos class in manually maintained
+                      code.
+  native:             The database will supply a unique value to this field when it
+                      is persisted; the value will be an integer. RECOMMENDED!
+-->
+<!ENTITY % GeneratorActions "assigned|guid|manual|native">
+
 <!--  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  -->
 <!--  Elements																	                                -->
 <!--  ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::  -->
@@ -276,7 +281,7 @@
               committed to persistent store, the value which it holds before
               it has been committed
 -->
-<!ELEMENT property ( documentation?, permission*, option*, prompt*, help*, ifmissing*)>
+<!ELEMENT property ( documentation?, generator?, permission*, option*, prompt*, help*, ifmissing*)>
 
 <!ATTLIST property 
 	name 		    CDATA 					#REQUIRED
@@ -394,15 +399,45 @@ property[@type='entity']. TODO: Not complete, not yet strictly convinced it's th
 -->
 <!ELEMENT many-to-one (documentation?)>
 <!ATTLIST many-to-one 
-	name 		    CDATA 					#REQUIRED
+	name 		    CDATA 					        #REQUIRED
 	distinct 	  (none|all|user|system) 	#IMPLIED
-	entity 		  CDATA 					#IMPLIED
-  farkey      CDATA           #IMPLIED
- 	required 	  %Boolean; 			#IMPLIED
-  concrete    %Boolean;       #IMPLIED
-  cascade     (%CascadeActions;)  #IMPLIED
-  column      CDATA           #IMPLIED
-  unsaved-value CDATA         #IMPLIED>
+	entity 		  CDATA 					        #IMPLIED
+  farkey      CDATA                   #IMPLIED
+ 	required 	  %Boolean; 			        #IMPLIED
+  concrete    %Boolean;               #IMPLIED
+  cascade     (%CascadeActions;)      #IMPLIED
+  column      CDATA                   #IMPLIED
+  unsaved-value CDATA                 #IMPLIED>
+
+<!-- 
+  marks a property which is auto-generated by some part of the system. 
+  This is based on the Hibernate construct, except that the Hibernate 
+  implementation folds both its internal generators and custom generators 
+  onto the same attribute. This separates them onto two attributes so we 
+  can police values for Hibernate's 'builtin' generators.
+  
+  action:       one of the supported Hibernate builtin generators, or 
+                'manual'. 'native' is strongly recommended in most instances
+  class:        if action is 'manual', the name of a manually maintained 
+                class conforming to the Hibernate IdentifierGenerator 
+                interface, or its equivalent in other languages
+-->
+<!ELEMENT generator (documentation?, param*)>
+<!ATTLIST generator
+      action  (%GeneratorActions;)    #REQUIRED
+      class   CDATA                   #IMPLIED>
+
+<!--
+  A parameter passed to the generator. Again, based on the Hibernate 
+  implementation.
+  
+  name:   the name of this parameter
+-->
+<!ELEMENT param (CDATA)>
+<!ATTLIST param
+  name        CDATA           #REQUIRED>
+
+
 
 <!-- 
 	one of an explicit list of optional values a property may have 
diff --git a/transforms01/adl2canonical.xslt b/transforms01/adl2canonical.xslt
index 97193fe..63e580a 100755
--- a/transforms01/adl2canonical.xslt
+++ b/transforms01/adl2canonical.xslt
@@ -16,8 +16,8 @@
       are generated.
     
     $Author: sb $
-    $Revision: 1.2 $
-    $Date: 2008-02-01 18:25:38 $
+    $Revision: 1.3 $
+    $Date: 2008-02-04 15:54:46 $
   -->
 
 <xsl:stylesheet version="1.0"
@@ -47,7 +47,7 @@
         *	THIS FILE IS AUTOMATICALLY GENERATED AND SHOULD NOT
         *	BE MANUALLY EDITED.
         *
-        *	Generated using adl2canonical.xsl revision <xsl:value-of select="substring('$Revision: 1.2 $', 12)"/>
+        *	Generated using adl2canonical.xsl revision <xsl:value-of select="substring('$Revision: 1.3 $', 12)"/>
         *
         ***************************************************************************
       </xsl:comment>
@@ -69,7 +69,7 @@
   Since we've got the key tag, I think this should be disallowed -->
   <xsl:template match="adl:entity[@natural-key]">
     <xsl:message terminate="no">
-      [In entity '<xsl:value-of select="@name"/>']: '@natural-key' is deprecated - use the 'key' sub element instead</xsl:message>
+      ADL WARNING: [In entity '<xsl:value-of select="@name"/>']: '@natural-key' is deprecated - use the 'key' sub element instead</xsl:message>
     <entity>
       <xsl:variable name="nkey" select="@natural-key"/>
       <xsl:apply-templates select="@*"/>
@@ -120,7 +120,7 @@
         <!-- check that it is unique, and abort hard if not... -->
         <xsl:if test="descendant::adl:property[@name=$key]">
           <xsl:message terminate="yes">
-            Entity '<xsl:value-of select="@name"/>' has a property '<xsl:value-of select="$key"/>' which conflicts 
+            ADL ERROR: Entity '<xsl:value-of select="@name"/>' has a property '<xsl:value-of select="$key"/>' which conflicts 
             with your chosen key naming convention <xsl:value-of select="$abstract-key-name-convention"/>. Either:
             (i) Make property '<xsl:value-of select="$key"/>' an explicit key by putting it in the &lt;key&gt; tag;
             (ii) Name property '<xsl:value-of select="$key"/>' something else; or
@@ -129,10 +129,11 @@
         </xsl:if>
         
         <!-- generate one property, the abstract primary key -->
-        <property type="serial" distinct="system">
+        <property type="integer" distinct="system">
           <xsl:attribute name="name">
             <xsl:value-of select="normalize-space( $key)"/>
           </xsl:attribute>
+          <generator action="native"/>
         </property>
       </key>
       <xsl:apply-templates select="adl:property | adl:one-to-many | adl:many-to-many | adl:many-to-one"/>
@@ -270,22 +271,32 @@
     </xsl:for-each>
   </xsl:template>
 
+  <xsl:template match="adl:typedef[ @type = 'string' and not( @size)]">
+    <xsl:message terminate="yes">
+      ADL ERROR: Type definitions of type 'string' must have a valid value for 'size'
+        Offending typedef: <xsl:value-of select="@name"/>
+    </xsl:message>
+  </xsl:template>
+
   <!-- Language constraints -->
-  <xsl:template match="property[ @type = 'string' and not( number( @size))]">
+  <xsl:template match="adl:property[ @type = 'string' and not( @size)]">
     <xsl:message terminate="yes">
       ADL ERROR: Properties of type 'string' must have a valid value for 'size'
+        Offending property: <xsl:value-of select="@name"/> of entity <xsl:value-of select="ancestor::adl:entity/@name"/>
     </xsl:message>
   </xsl:template>
 
-  <xsl:template match="property[ @type = 'entity' and not( @entity)]">
+  <xsl:template match="adl:property[ @type = 'entity' and not( @entity)]">
     <xsl:message terminate="yes">
       ADL ERROR: Properties of type 'entity' must have a valid value for 'entity'
+        Offending property: <xsl:value-of select="@name"/> of entity <xsl:value-of select="ancestor::adl:entity/@name"/>
     </xsl:message>
   </xsl:template>
 
-  <xsl:template match="property[ @type = 'defined' and not( @typedef)]">
+  <xsl:template match="adl:property[ @type = 'defined' and not( @typedef)]">
     <xsl:message terminate="yes">
       ADL ERROR: Properties of type 'defined' must have a valid value for 'typedef'
+        Offending property: <xsl:value-of select="@name"/> of entity <xsl:value-of select="ancestor::adl:entity/@name"/>
     </xsl:message>
   </xsl:template>