+ Restructuring: Now, we have a three (four) layer concept:

Basic User, Advanced User, Administrative User
+ see file SURFLETS-STRUCTURES.TXT for details
+ Adapt example surflets to new structures. Only surflets that use extended
  features should need adaptations.
This commit is contained in:
interp 2003-03-13 11:36:49 +00:00
parent df8ea46a27
commit 88e255d5de
8 changed files with 347 additions and 87 deletions

View File

@ -23,52 +23,143 @@
surflet-response-headers surflet-response-headers
surflet-response-data)) surflet-response-data))
;; SUrflet-requests as expected from the surflet handler
(define-interface surflet-handler/requests-interface
(export make-surflet-request ;FIMXE? unusable for user
surflet-request?
surflet-request-request
surflet-request-input-port
surflet-request-method
surflet-request-uri
surflet-request-url
surflet-request-version
surflet-request-headers
surflet-request-socket))
(define-interface surflets/error-interface
(export send-error ;send error response
(status-code :syntax))) ;from httpd-responses
;; Use for SUrflets ;; Use for SUrflets
(define-interface surflet-handler/surflets-interface (define-interface surflet-handler/primitives-interface
(compound-interface (compound-interface
surflet-handler/responses-interface surflet-handler/responses-interface
surflet-handler/requests-interface
surflets/error-interface
(export send/suspend ;send and suspend (export send/suspend ;send and suspend
send/finish ;send and finish send/finish ;send and finish
send ;just send (no finish, no suspend) send ;just send (no finish, no suspend)
send-error ;send error response
set-session-data!
get-session-data
adjust-timeout! ;adjusts timeout of current session
))) )))
;; Use for adminstration of the Surflet Handler
(define-interface surflet-handler/admin-interface
(export get-loaded-surflets
unload-surflet
options-session-lifetime ;; Send HTML-Strings (for advanced user)
options-cache-surflets? (define-interface surflets/send-html-string-interface
options-surflet-path (export send-html-string/suspend
set-options-session-lifetime! send-html-string/finish
set-options-cache-surflets?! send-html-string))
;; Extensions/Exports to/from Olegs SSAX library
(define-interface surflets/sxml-interface
(export display-low-level-sxml
sxml->string
sxml->string/internal
sxml-attribute?
default-rule
text-rule
attribute-rule))
;; SUrflets' extensions to SXML
(define-interface surflets/surflet-sxml-interface
(export surflet-sxml->low-level-sxml
surflet-sxml-rules
surflet-form-rule
default-rules
plain-html-rule
url-rule))
;; Use for advanced users: make your own conversion rules.
(define-interface surflets/my-sxml-interface
(compound-interface
surflets/send-html-string-interface
surflets/sxml-interface
surflets/surflet-sxml-interface))
(define-interface surflets/continuations-interface
(export get-continuations
delete-continuation!))
;; Access to session-id and continuation-id
(define-interface surflets/ids-interface
(export my-session-id
my-continuation-id
my-ids
instance-session-id))
;; Use for advanced users: access to your sessions and continuations
;; and continuations (currently you get access to all sessions; this
;; should and will be restricted in the future)
(define-interface surflets/my-sessions-interface
(compound-interface
surflets/ids-interface
surflets/continuations-interface
(export get-session
;; That would be too much:
;; get-sessions
delete-session!
get-session-data
set-session-data!
instance-session-id
session-adjust-timeout!
adjust-timeout!
session-alive?
session-surflet-name
options-session-lifetime
options-cache-surflets?)))
(define-interface surflets/sessions-interface
(export get-session
get-sessions get-sessions
delete-session!
get-session-data
set-session-data!
instance-session-id
session-adjust-timeout!
adjust-timeout!
session-alive? session-alive?
session-surflet-name session-surflet-name
;; FIXME: This is too much and should be restricted:
session-memo session-memo
session-continuation-table session-continuation-table
session-continuation-table-lock session-continuation-table-lock
session-continuation-counter session-continuation-counter))
delete-session!
session-adjust-timeout! (define-interface surflet-handler/surflets-interface
adjust-timeout! (export get-loaded-surflets
unload-surflet))
get-continuations (define-interface surflet-handler/options-interface
delete-continuation! (export options-session-lifetime
options-cache-surflets?
options-surflet-path
set-options-session-lifetime!
set-options-cache-surflets?!))
instance-session-id (define-interface surflet-handler/resume-url-interface
(export resume-url?
resume-url?
resume-url-ids resume-url-ids
resume-url-session-id resume-url-session-id
resume-url-continuation-id)) resume-url-continuation-id))
;; Use for adminstration of the Surflet Handler
(define-interface surflet-handler/admin-interface
(compound-interface
surflet-handler/surflets-interface
surflets/sessions-interface
surflets/continuations-interface
surflet-handler/resume-url-interface
surflet-handler/options-interface
))
;; THE interface that SUrflets use. ;; THE interface that SUrflets use.
(define-interface surflet-interface (define-interface surflet-interface
(export main)) ; MAIN gets one parameter, the REQUEST (export main)) ; MAIN gets one parameter, the REQUEST
@ -141,18 +232,7 @@
thread-safe-counter-next! thread-safe-counter-next!
thread-safe-counter?)) thread-safe-counter?))
;; SUrflet-requests as expected from the surflet handler
(define-interface surflet-requests-interface
(export make-surflet-request
surflet-request?
surflet-request-request
surflet-request-input-port
surflet-request-method
surflet-request-uri
surflet-request-url
surflet-request-version
surflet-request-headers
surflet-request-socket))
;; These two are from Martin Gasbichler: ;; These two are from Martin Gasbichler:
(define-interface rt-module-language-interface (define-interface rt-module-language-interface
@ -177,14 +257,7 @@
(export typed-optionals (export typed-optionals
(optionals :syntax))) (optionals :syntax)))
;; Extensions/Exports to/from Olegs SSAX library
(define-interface surflets/sxml-interface
(export display-low-level-sxml
sxml->string
sxml-attribute?
default-rule
text-rule
attribute-rule))
;; Input-fields as Scheme objects ;; Input-fields as Scheme objects
(define-interface surflets/input-fields-interface (define-interface surflets/input-fields-interface
@ -213,22 +286,6 @@
(export *input-field-trigger* (export *input-field-trigger*
input-field-html-tree)) input-field-html-tree))
;; SUrflets' extensions to SXML
(define-interface surflets/surflet-sxml-interface
(export surflet-sxml->low-level-sxml
surflet-sxml-rules
surflet-form-rule
default-rules
plain-html-rule
url-rule))
;; Access to session-id and continuation-id
(define-interface surflets/ids-interface
(export my-session-id
my-continuation-id
my-ids
instance-session-id))
;; Some utilities ;; Some utilities
(define-interface surflets/utilities-interface (define-interface surflets/utilities-interface
(export form-query-list (export form-query-list
@ -263,33 +320,39 @@
extract-bindings extract-bindings
extract-single-binding)) extract-single-binding))
;; HTML-Extensions to send/suspend et al. ;; HTML-Extensions to send/suspend et al. (for basic user)
(define-interface surflets/send-html-interface (define-interface surflets/send-html-interface
(export send-html/suspend (export send-html/suspend
send-html/finish send-html/finish
send-html)) send-html))
;; Helping functions for surflets
;; Helping functions for surflets (for basic user)
(define-interface surflets-interface (define-interface surflets-interface
(compound-interface (compound-interface
surflet-handler/surflets-interface ; surflet-handler/surflets-interface;
surflets/sxml-interface ; surflets/sxml-interface
surflets/surflet-sxml-interface ; surflets/surflet-sxml-interface
surflets/send-html-interface surflets/send-html-interface
surflets/input-fields-interface surflets/input-fields-interface
surflets/addresses-interface surflets/addresses-interface
surflets/returned-via-interface surflets/returned-via-interface
surflets/bindings-interface)) surflets/bindings-interface))
;;; Structures ;;; Structures
;; structures from SUrflet Handler ;; structures from SUrflet Handler
(define-structures (define-structures
((surflet-handler surflet-handler-interface) ((surflet-handler surflet-handler-interface)
(surflet-handler/surflets surflet-handler/surflets-interface) (surflet-handler/surflets surflet-handler/surflets-interface)
(surflet-handler/options surflet-handler/options-interface)
(surflet-handler/resume-url surflet-handler/resume-url-interface)
(surflet-handler/admin surflet-handler/admin-interface) (surflet-handler/admin surflet-handler/admin-interface)
(surflet-handler/responses surflet-handler/responses-interface)) (surflet-handler/primitives surflet-handler/primitives-interface)
(surflet-handler/responses surflet-handler/responses-interface)
(surflets/sessions surflets/sessions-interface)
(surflets/continuations surflets/continuations-interface)
(surflets/error surflets/error-interface))
(open define-record-types ;DEFINE-RECORD-TYPE (open define-record-types ;DEFINE-RECORD-TYPE
handle-fatal ;WITH-FATAL-ERROR-HANDLER* et al. handle-fatal ;WITH-FATAL-ERROR-HANDLER* et al.
handle-fatal-error handle-fatal-error
@ -319,15 +382,19 @@
;; SUrflets library of helping functions ;; SUrflets library of helping functions
(define-structure surflets surflets-interface (define-structure surflets surflets-interface
(open surflet-handler/surflets (open surflets/send-html
surflets/sxml
surflets/surflet-sxml
surflets/send-html
surflets/input-fields surflets/input-fields
surflets/addresses surflets/addresses
surflets/returned-via surflets/returned-via
surflets/bindings)) surflets/bindings))
;; SUrflets library for advanced users: make and use your own
;; conversion rules.
(define-structure surflets/my-sxml surflets/my-sxml-interface
(open surflets/send-html-string
surflets/sxml
surflets/surflet-sxml))
;; Shift-Reset ;; Shift-Reset
(define-structure shift-reset shift-reset-interface (define-structure shift-reset shift-reset-interface
(open scheme (open scheme
@ -372,7 +439,13 @@
(files thread-safe-counter)) (files thread-safe-counter))
;; SUrflet-requests as expected from the SUrflet handler ;; SUrflet-requests as expected from the SUrflet handler
(define-structure surflet-requests surflet-requests-interface ;;; We have two names for the same thing to ease the use of structure
;;; names: requests seem to be part of the surflet-handler, but are
;;; actually seperate files. If you know everything about SUrflets,
;;; you use `surlfet-requests'.
(define-structures
((surflet-handler/requests surflet-handler/requests-interface)
(surflet-requests surflet-handler/requests-interface))
(open scheme (open scheme
define-record-types define-record-types
httpd-requests) httpd-requests)
@ -442,7 +515,7 @@
(define-structure surflets/utilities surflets/utilities-interface (define-structure surflets/utilities surflets/utilities-interface
(open scheme (open scheme
parse-html-forms parse-html-forms
(subset surflet-handler/surflets (send/suspend))) (subset surflet-handler/primitives (send/suspend)))
(files utilities)) (files utilities))
@ -482,10 +555,11 @@
(subset sunet-utilities (get-header))) (subset sunet-utilities (get-header)))
(files bindings)) (files bindings))
(define-structure surflets/send-html surflets/send-html-interface (define-structures
((surflets/send-html surflets/send-html-interface)
(surflets/send-html-string surflets/send-html-string-interface))
(open scheme (open scheme
(subset httpd-responses (status-code)) surflet-handler/primitives
surflet-handler/surflets
surflets/sxml surflets/sxml
surflets/surflet-sxml) surflets/surflet-sxml)
(files send-html)) (files send-html))

View File

@ -0,0 +1,188 @@
We have three basic layers of structures: -*- Outline -*-
* Overview
(a) Basic User surflets, simple-surflet-api
(b) Advanced User surflets/my-sxml, surflets/my-sessions,
surflet-handler/primitives
(c) Administrative User surflet-handler/admin, profiling
The fourth layer:
(d) Various surflets/outdaters, surflets/utilities
Finally, there is a HOWTO added, that describes how you can use your
own rules.
* (a) Basic User
** structures: (1) surflets
provides: . sending of html represented by surflet-sxml
. using special tags in its surflet-sxml:
url, plain-html, surflet-form
. input-fields, input-field-value,...
. get-bindings, extract-bindings, ...
. make-address, make-annotated-address, ...
. returned-via?, case-returned-via, ...
surflets is splitted in several parts, that can
be loaded independently from each other.
** structures: (2) simple-surflet-api
provides: . PLT like generation of simple web pages:
. single-query, form-query, inform-page,
final-page
. make-password, make-number...
* (b) Advanced User
** structures: (1) surflets/my-sxml
provides: . generating and sending of own sxml,
see HOWTO below
. send-html-string/suspend...
. sxml-rules...
. sxml->string
. surflet-sxml-rules...
. surflet-sxml->low-level-sxml
** structures: (2) surflets/my-sessions
provides: . Everything needed to administrate your own
sessions and continuations.
(This represents the access to the sessions of
one surflet. However, you currently have
access to all sessions. This will be
restricted in the future.)
. my-session-id, my-continuation-id,
instance-session-id
. get-session, delete-session!
. get-continuation, delete-continuation!
. session-adjust-timeout!, adjust-timeout!
. session-alive?, session-surflet-name
. access to options: options-session-lifetime,
options-cache-surflets?
** structures: (3) surflet-handler/primitives
provides: . Access to the primitives of the
surflet handler:
. send/suspend, ... that send surflet responses
. send-error (sending Webserver error message)
. make-surflet-response, ... status-code:
surflet responses with own status-code, own
content-type, own headers and own content
(string or list of strings)
. surflet-requests...
* (c) Administrative User
** structures: (1) surflet-handler/admin
provides: . Access to all internal structures of the
handler
. surflets: get-loaded-surflets, unload-surflet
. sessions: get-session, get-sessions,
session-data, instance-session-id,
adjust-timeout..., session-record selectors
. continuations: get-continuations,
delete-continuations!
. resume-urls: resume-url?, resume-url-ids...
. options: options-session-lifetime...
set-options...!
surflet-handler/admin is splitted in several
parts, that can be loaded independently from
each other.
** structures: (2) profiling
provides: . Access to memory usage of the whole scsh session
. profile-space, profile-results,
with-gnuplot-data-file, space-info-pair,
space-info-symbol...
* (d) Various
** structures: (1) surflets/outdaters
provides: . Data structure to prevent call for outdated
links. This is useful if in some places of your
session the user should not go back and recall
another continuation.
. make-outdater, if-outdated, show-outdated
** structures: (2) surflets/utilities
provides: . Various utilities that didn't fit in another
package but were too small for an own one.
. form-query-list: url-query->alist
. rev-append
. make-callback enables you to place a callback
below a link. If the user clicks the link, an
arbitrary function is called.
. generate-unique-name generates name from a
prefix that are highest probable unique with
this prefix. For example this is used to
generate the names of the input fields.
* HOWTO use your own conversion rules:
** (i) Create your own conversion rules:
(trigger [*preorder*] . function)
- TRIGGER is the symbol that trigger the rule
- FUNCTION will get the trigger and the rest of the list, that
triggered the rule as arguments. Thus, if you know, you will
only get (at least x) arguments, FUNCTION must accept (at
least) x+1 arguments. FUNCTION must return a list
containing only characters or strings or, recursively, lists
of this type. (Well, there may be others also, but this is
too advanced.)
- If *PREORDER* misses, the rules will be first applied to all
arguments, before the are passed to function.
*** Examples:
MY-HEAD will take no args and creates my heading:
(define my-head-rule
`(my-head . (lambda (trigger)
(list "<head><title>My Page</title></head"))))
MY-TITLE-HEAD takes one argument, the title:
(define my-title-head-rul
`(my-title-head . (lambda (trigger title)
(list "<head><title>"
title
"</title></head"))))
*** SXML->STRING/INTERNAL
MY-ATTRIBUTED-HEAD takes attributes as well. As we don't want
to reformat this on our own, we use SXML->STRING/INTERNAL,
assuming that MY-RULES contains *all* the rules we use for
this sublist. As we do everything for the rest of the tree
ourselves, we use *preorder*:
(define my-attributed-head
`(my-attributed-head *preorder* .
,(lambda (trigger attributes title)
(sxml->string/internal `(head ,attributes (title ,title))
my-rules))))
** (ii) Create your own rule set.
A rule set is a list of conversion rules.
*** Example:
(define my-rules
(list default-rule
attribute-rule
text-rule
my-head-rule
my-title-head
my-attributed-head))
*** Note:
If you want to use SXML->STRING/INTERNAL with the same
rule set that entered the rule, you have to define them
either on top level with define or with letrec like
(letrec ((my-rules
(cons my-attributed-head-rule default-rules))
(my-attributed-head-rule
`(my-attributed-head *preorder* .
,(lambda (trigger attributes title)
(sxml->string/internal `(head ,attributes (title ,title))
my-rules)))))
my-rules)

View File

@ -2,6 +2,7 @@
(open surflets (open surflets
surflets/utilities ;form-query-list surflets/utilities ;form-query-list
surflet-requests surflet-requests
surflet-handler/primitives
httpd-responses httpd-responses
url url
scheme-with-scsh) scheme-with-scsh)

View File

@ -5,7 +5,7 @@
url ; HTTP-url-SEARCH url ; HTTP-url-SEARCH
srfi-1 ; FILTER srfi-1 ; FILTER
surflet-handler/surflets ; SEND/SUSPEND, SEND/FINISH surflet-handler/surflets ; SEND/SUSPEND, SEND/FINISH
surflet-handler/responses ; MAKE-SURFLET-RESPONSE surflet-handler/primitives ; MAKE-SURFLET-RESPONSE
scheme-with-scsh) scheme-with-scsh)
(begin (begin

View File

@ -3,8 +3,8 @@
handle-fatal-error handle-fatal-error
let-opt let-opt
surflets surflets
surflet-handler/admin surflets/error
httpd-responses surflet-handler/options
) )
(begin (begin

View File

@ -1,17 +1,16 @@
(define-structure surflet surflet-interface (define-structure surflet surflet-interface
(open scheme-with-scsh (open scheme-with-scsh
surflets surflets
surflet-handler/admin surflets/sessions
surflets/error
profiling profiling
handle-fatal-error handle-fatal-error
httpd-responses
(subset srfi-1 (iota)) (subset srfi-1 (iota))
define-record-types define-record-types
locks locks
let-opt let-opt
receiving receiving
primitives (subset primitives (add-finalizer!))
handle-fatal-error
) )
(begin (begin

View File

@ -3,8 +3,8 @@
surflets surflets
surflets/utilities ;make-callback surflets/utilities ;make-callback
surflets/outdaters surflets/outdaters
surflets/error
surflet-handler/admin surflet-handler/admin
httpd-responses
handle-fatal-error handle-fatal-error
let-opt let-opt
srfi-1 ;filter-map srfi-1 ;filter-map

View File

@ -4,10 +4,8 @@
surflets/utilities ;make-callback surflets/utilities ;make-callback
surflets/outdaters surflets/outdaters
surflets/ids surflets/ids
surflets/error
surflet-handler/admin surflet-handler/admin
httpd-responses
surflet-requests
url
handle-fatal-error handle-fatal-error
let-opt let-opt
srfi-1 ;filter-map, last srfi-1 ;filter-map, last