[Gd-chatter] r11186 - trunk/libraries/xsd-generator
hannes at gwydiondylan.org
hannes at gwydiondylan.org
Sun Feb 18 05:23:48 CET 2007
Author: hannes
Date: Sun Feb 18 05:23:47 2007
New Revision: 11186
Added:
trunk/libraries/xsd-generator/
trunk/libraries/xsd-generator/library.dylan (contents, props changed)
trunk/libraries/xsd-generator/module.dylan (contents, props changed)
trunk/libraries/xsd-generator/xsd-generator.dylan (contents, props changed)
trunk/libraries/xsd-generator/xsd-generator.hdp (contents, props changed)
Log:
Job: minor
initial macro to generate classes, xml decoder and encoder from xsd (which got transformed by xslt)
Added: trunk/libraries/xsd-generator/library.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/xsd-generator/library.dylan Sun Feb 18 05:23:47 2007
@@ -0,0 +1,13 @@
+Module: dylan-user
+Synopsis: Parse xsd to dylan classes
+Author: Hannes Mehnert, Bastian Mueller
+Copyright: (C) 2007,. All rights reserved.
+
+define library xsd-generator
+ use functional-dylan;
+ use io;
+ use xml-parser;
+
+ // Add any more module exports here.
+ export xsd-generator;
+end library xsd-generator;
Added: trunk/libraries/xsd-generator/module.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/xsd-generator/module.dylan Sun Feb 18 05:23:47 2007
@@ -0,0 +1,18 @@
+Module: dylan-user
+Synopsis: Parse xsd to dylan classes
+Author: Hannes Mehnert, Bastian Mueller
+Copyright: (C) 2007,. All rights reserved.
+
+define module xsd-generator
+ use functional-dylan;
+ use threads;
+ use format;
+ use format-out;
+ use standard-io;
+ use streams;
+ use xml-parser;
+ use simple-xml;
+
+ // Add binding exports here.
+
+end module xsd-generator;
Added: trunk/libraries/xsd-generator/xsd-generator.dylan
==============================================================================
--- (empty file)
+++ trunk/libraries/xsd-generator/xsd-generator.dylan Sun Feb 18 05:23:47 2007
@@ -0,0 +1,209 @@
+Module: xsd-generator
+Synopsis: Parse xsd to dylan classes
+Author: Hannes Mehnert, Bastian Mueller
+Copyright: (C) 2007,. All rights reserved.
+
+define method main () => ()
+ // Your program starts here...
+end method main;
+
+define abstract class <xml-stanza> (<object>)
+end;
+
+define method encode-xml (object :: <xml-stanza>) => (res :: <element>)
+ make(<element>,
+ name: class-xml-name(object),
+ children: xml-elements(object),
+ attributes: xml-attributes(object));
+end;
+
+define method encode-xml (object :: <string>) => (res :: <xml>)
+ with-xml() text(object) end;
+end;
+
+
+//optional, required!
+//check
+define macro attribute-list
+ { attribute-list(?:name; ?rules:*) }
+ => { define method xml-attributes (object :: ?name) => (res :: <collection>)
+ let names-and-getters = list(?rules);
+ let res = make(<stretchy-vector>);
+ for (name-and-getter in names-and-getters)
+ if (slot-initialized?(object, name-and-getter.tail))
+ add!(res, make(<attribute>,
+ name: name-and-getter.head,
+ value: as(<string>, name-and-getter.tail(object))));
+ end;
+ end;
+ res;
+ end }
+
+ rules:
+ { } => { }
+ { attribute ?:name ?rest:*; ... } => { pair(?"name", ?name), ... }
+ { ?rest:*; ... } => { ... }
+end;
+
+//one-of
+//min-occurences
+//sequence -> min-occur = 1!
+define macro element-list
+ { element-list(?:name; ?rules:*) }
+ => { define method xml-elements (object :: ?name) => (res :: <collection>)
+ let getters = list(?rules);
+ let res = make(<stretchy-vector>);
+ for (name-and-getter in getters)
+ if (slot-initialized?(object, name-and-getter.tail))
+ let obj = name-and-getter.tail(object);
+ local method do-add (f :: <object>)
+ if (instance?(f, <string>))
+ add!(res, make(<element>,
+ name: name-and-getter.head,
+ children: list(make(<char-string>, text: f))));
+ else
+ add!(res, encode-xml(f))
+ end;
+ end;
+ if (instance?(obj, <stretchy-vector>))
+ do(do-add, obj)
+ else
+ do-add(obj);
+ end;
+ end;
+ end;
+ res;
+ end; }
+
+ rules:
+ { } => { }
+ { element ?:name ?rest:*; ... } => { pair(?"name", ?name), ... }
+ { sequence-of{?sequence-rules:*}; ... } => { ?sequence-rules, ... }
+ { ?rest:*; ... } => { ... }
+
+ sequence-rules:
+ { } => { }
+ { one-of{?seq-rules:*}, ?rest:*; ... } => { ?seq-rules, ... }
+ { element ?:name ?rest:*; ... } => { pair(?"name", ?name ## "s"), ... }
+
+ seq-rules:
+ { } => { }
+ { element ?:name ?rest:*; ... } => { pair(?"name", ?name ## "s"), ... }
+end;
+
+define abstract class <wrapped-stanza> (<object>)
+end;
+define macro stanza-definer
+ { define ?attributes:name wrapped stanza ?:name ()
+ name ?xml-name:expression;
+ namespace ?namespace:expression;
+ ?body:*
+ end }
+ => {
+ define abstract class ?name (<wrapped-stanza>)
+ constant class slot class-xml-name :: <string> = ?xml-name;
+ end;
+ }
+
+ { define ?attributes:name stanza ?:name ()
+ name ?xml-name:expression;
+ namespace ?namespace:expression;
+ ?rules:*
+ end }
+ => {
+ define-class(?xml-name; ?name; ?rules);
+ attribute-list(?name; ?rules);
+ element-list(?name; ?rules);
+ define-setters(?name; ?rules)
+ }
+end;
+
+//max-occurs
+//check
+//one-of
+define macro define-real-setter
+ { define-real-setter(?object:name) } => { }
+ { define-real-setter(?object:name; element ?:name ?rest:*; ?rest2:*) }
+ => { define method "add-" ## ?name (obj :: ?object, value :: <object>)
+ ?name ## "s"(obj) := add!(?name ## "s"(obj), value)
+ end;
+ define-real-setter(?object; ?rest2)
+ }
+ { define-real-setter(?object:name; one-of { ?rest:* }, ?res:*; ?rest2:*) }
+ => { define-real-setter(?object; ?rest); define-real-setter(?object; ?rest2) }
+end;
+
+define macro define-setters
+ { define-setters(?:name; sequence-of{?rest:*} ; ?rules:*) }
+ => { define-real-setter(?name; ?rest);
+ define-setters(?name; ?rules) }
+ { define-setters(?:name; ?rest:*; ?rules:*) }
+ => { define-setters(?name; ?rules) }
+ { define-setters(?:name) } => { }
+end;
+
+define macro define-class
+ { define-class(?xml-name:expression; ?:name; ?rules:*) }
+ => { define class ?name (<xml-stanza>)
+ constant class slot class-xml-name :: <string> = ?xml-name;
+ ?rules
+ end; }
+
+ rules:
+ { } => { }
+ { ?rule:*; ... } => { ?rule ; ... }
+
+ rule:
+ { sequence-of{?sequence-rules:*} } => { ?sequence-rules }
+ { one-of{?rules:*}, ?rest:* } => { ?rules }
+ { element ?:name :: wrapped(?type:expression, ?real-type:expression) ?rest:* } => { slot ?name :: ?real-type }
+ { element ?:name :: ?type:expression, ?rest:* } => { slot ?name :: ?type }
+ { attribute ?:name :: ?type:expression = ?default:expression, ?rest:* } => { slot ?name :: ?type = ?default }
+ { attribute ?:name :: ?type:expression, ?rest:* } => { slot ?name :: ?type }
+ { content :: ?type:expression } => { slot %content :: ?type }
+
+ sequence-rules:
+ { } => { }
+ { ?sequence-rule:*; ... } => { ?sequence-rule ; ... }
+
+ sequence-rule:
+ { one-of{?sequence-rules:*} ?rest:* } => { ?sequence-rules }
+ { element ?:name ?rest:* } => { slot ?name ## "s" :: <stretchy-vector> = make(<stretchy-vector>) }
+
+end;
+/*
+make(<client-message>, body: "foo", subject: "bar", from: "fnord");
+<message><body>foo</body><thread>23</thread></message>
+<message><foo/><bar/><foobar/><foo/></message>
+
+element.seq1-one1-subject
+<messsage><subject>foo</subject><subject>fnord</subject><subject>barf</subject></message>
+*/
+define constant <nmtoken> = <string>;
+define qualified stanza client-message ()
+ name "message";
+ namespace "jabber:client";
+ sequence-of {
+ one-of {
+ element subject :: wrapped(<client-subject>, <string>);
+ element body :: wrapped(<client-body>, <string>);
+ element thread :: wrapped(<client-thread>, <string>);
+ }, min-occurrences: 0, max-occurrences: unbounded;
+ element error :: wrapped(<client-error>, <string>);
+ };
+ repeated element foobar :: <string>, min-occurs: 23;
+ attribute from :: <string> = "dddd";
+ attribute id :: <nmtoken> = "2342";
+ attribute to :: <string> = "foo at bar.ocm";
+ attribute type :: one-of(#"chat", #"error", #"groupchat", #"headline", #"normal") = #"normal";
+ attribute xml-lang :: <string>;
+end;
+
+
+
+
+begin
+ let msg = make(client-message);
+ add-subject(msg, "foo");
+
+end;
Added: trunk/libraries/xsd-generator/xsd-generator.hdp
==============================================================================
--- (empty file)
+++ trunk/libraries/xsd-generator/xsd-generator.hdp Sun Feb 18 05:23:47 2007
@@ -0,0 +1,14 @@
+Format-Version: 2
+Library: xsd-generator
+Synopsis: Parse xsd to dylan classes
+Author: Hannes Mehnert, Bastian Mueller
+Copyright: (C) 2007,. All rights reserved.
+Major-Version: 1
+Minor-Version: 0
+Files: library
+ module
+ xsd-generator
+Start-Function: main
+Compilation-Mode: loose
+Target-Type: executable
+
More information about the chatter
mailing list