Forum OpenACS Development: Re: Heads-up: New Workflow Package

Posted by Dan Wickstrom on

Below is a sample form which uses comments throughout. The form is used to register a news feed soap service.

ad_form -name register-service -form {

    # primary key for news feed

    # fully qualified url of news instance on remote server
    {news_instance_url:text(text) {label "Remote News Instance URL (e.g."} {html {size 40}}}

    # soap service url on remote server
    {service_url:text(text) {label "Remote Web Service URL"} {html {size 40}}}

    # authentication token
    {token:text(text) {label "Registration Token"} {html {size 40}}}

# create option list for news instances on this server

set options [db_list_of_lists get_options {
        select '--' as url, null::integer as object_id, 1 as orderby
        select site_node__url(n.node_id) as url, n.object_id, 2 as orderby
          from apm_packages p, site_nodes n 
         where p.package_id = n.object_id     
           and p.package_key = 'news'
      order by orderby

# add widget for selecting news instance to be used as the destination 
# for the news feed

ad_form -extend -name register-service -form [list \
    [list package_id:text(select) [list options $options] {label {Select News Destination}}] \
                    ] -validate {

    # make sure the user select a news instance source                    
    {package_id {![string equal $package_id ""]}
     "A Valid News Instance Destination on this Server must be Selected"

    # make sure the news instance url is a fully qualified url
    {news_instance_url {[string match http://* $news_instance_url]}
     "The remote news instance URL must be a fully qualified URL that starts with http://"

    # make sure that the soap service url is fully qualified
    {service_url {[string match http://* $service_url]}
     "The remote Web Service URL must be a fully qualified URL that starts with http://"

} -new_data {

    # convert the news instance url to a fully qualified url
    db_1row get_dest "select 'http://[ad_host][ad_port]' || site_node__url(node_id) as dest_url from site_nodes where object_id = :package_id"

    if ![string equal [string index $news_instance_url end] "/"] {
        append news_instance_url "/"

    # get the service locator
    set nfs [nsjava::new]

    # get the news service client stub and invoke registration on remote server
    set url [nsjava::new { String} $service_url]
    set stub [$nfs {getNewsFeed} $url]

    set result f
    nsjava::try {

        # soap call to register the news feed
        set result [$stub {enableRemoteNewsFeed String String String String} $news_instance_url $dest_url $token [ns_conn peeraddr]]

    } catch {java.rmi.RemoteException e} {

        # if registration fails, we will retry later
        ns_log Notice "registration failed: [$e toString]"

    } finally {

        set person_id [ad_conn user_id]

        # save registration info.  If registration fails, we will retry later.
        db_dml set_feed_frominfo {

            insert into news_feed_from 
            (news_feed_from_id, package_id, service_url, news_instance_url, token, registered_p, person_id) 
            (:news_feed_id, :package_id, :service_url, :news_instance_url, :token, :result, :person_id)

    ad_returnredirect index