Class OpenWFE::Extras::AtomPubParticipant
In: lib/openwfe/extras/participants/atompub_participants.rb
Parent: Object

This participants posts (as in HTTP POST) a workitem to an AtomPub enabled resource.

    target_uri = "https://openwferu.wordpress.com/wp-app.php/posts"

    params = {}
    params[:username] = 'jmettraux'
    params[:password] = ENV['WORDPRESS_PASSWORD']
    params[:categories] = 'openwferu, test'

    engine.register_participant(
        "app", OpenWFE::Extras::AtomPubParticipant.new target_uri, params)

This base implementation dumps workitem as YAML in the entry content.

See BlogParticipant for a human-oriented blog posting participant.

Methods

Included Modules

OpenWFE::LocalParticipant

Attributes

author_name  [RW] 
author_uri  [RW] 
target_uri  [RW]  The URI to post to

Public Class methods

[Source]

     # File lib/openwfe/extras/participants/atompub_participants.rb, line 89
 89:         def initialize (target_uri, params)
 90: 
 91:             @target_uri = target_uri
 92: 
 93:             @username = params[:username]
 94:             @password = params[:password]
 95: 
 96:             @author_name = \
 97:                 params[:author_name] || self.class.name
 98:             @author_uri = \
 99:                 params[:author_uri] || "http://openwferu.rubyforge.org"
100: 
101: 
102:             @categories = params[:categories] || []
103:             @categories = @categories.split(",") if @categories.is_a?(String)
104:             @categories = Array(@categories)
105:         end

Public Instance methods

The incoming workitem will generate an atom entry that will get posted to the target URI.

This consume() method returns the URI (as a String) where the just uploaded post can be edited.

[Source]

     # File lib/openwfe/extras/participants/atompub_participants.rb, line 114
114:         def consume (workitem)
115: 
116:             entry = Atom::Entry.new
117:             entry.updated! # set updated time to now
118: 
119:             render_author entry, workitem
120:             render_categories entry, workitem
121:             render_content entry, workitem
122: 
123:             h = Atom::HTTP.new
124:             h.user = @username
125:             h.pass = @password
126:             h.always_auth = :basic
127:             
128:             res = Atom::Collection.new(@target_uri, h).post!(entry)
129: 
130:             # initial implementation
131:             # don't catch an error, let the process fail
132: 
133:             #res.read_body
134:             extract_new_link res
135:         end

Protected Instance methods

Extracts the link of the newly created resource (newly posted blog entry), and returns it as a String.

[Source]

     # File lib/openwfe/extras/participants/atompub_participants.rb, line 193
193:             def extract_new_link (response)
194: 
195:                 doc = REXML::Document.new response.read_body
196: 
197:                 #REXML::XPath.first(doc.root, "//link[@rel='edit']")
198:                     #
199:                     # doesn't work :(
200: 
201:                 REXML::XPath.first(doc.root, "//link[2]").attribute('href')
202:                     #
203:                     # will break if the order changes :(
204:             end

This default implementation simply builds a single author out of the :author_name, :author_uri passed as initialization params.

[Source]

     # File lib/openwfe/extras/participants/atompub_participants.rb, line 159
159:             def render_author (entry, workitem)
160: 
161:                 author = Atom::Author.new
162:                 author.name = author_name
163:                 author.uri = author_uri
164: 
165:                 entry.authors << author
166:             end

This base implementations simply adds the categories listed in the :categories initialization parameter. The target_uri is used as the scheme for the categories.

You can override this method to add extra categories or to have completely different categories.

[Source]

     # File lib/openwfe/extras/participants/atompub_participants.rb, line 176
176:             def render_categories (entry, workitem)
177: 
178:                 @categories.each do |s|
179: 
180:                     c = Atom::Category.new
181: 
182:                     c["scheme"] = @target_uri
183:                     c["term"] = s.strip
184: 
185:                     entry.categories << c
186:                 end
187:             end

This base implementation simply uses a YAML dump of the workitem as the post content (with a content type of ‘html’).

[Source]

     # File lib/openwfe/extras/participants/atompub_participants.rb, line 143
143:             def render_content (entry, workitem)
144: 
145:                 entry.title = \
146:                     workitem.participant_name + " " +
147:                     workitem.fei.expression_id + " " +
148:                     workitem.fei.workflow_instance_id
149: 
150:                 entry.content = workitem.to_yaml
151:                 entry.content["type"] = "html"
152:             end

[Validate]