roadforest 0.1 → 0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/examples/file-management.rb +12 -13
- data/lib/roadforest-client.rb +3 -0
- data/lib/roadforest-common.rb +2 -0
- data/lib/roadforest-server.rb +7 -0
- data/lib/roadforest-testing.rb +1 -0
- data/lib/roadforest/application.rb +9 -7
- data/lib/roadforest/application/dispatcher.rb +39 -63
- data/lib/roadforest/application/parameters.rb +1 -1
- data/lib/roadforest/application/path-provider.rb +2 -2
- data/lib/roadforest/application/route-adapter.rb +130 -18
- data/lib/roadforest/application/services-host.rb +0 -4
- data/lib/roadforest/augment/affordance.rb +78 -0
- data/lib/roadforest/augment/augmentation.rb +97 -0
- data/lib/roadforest/augment/augmenter.rb +54 -0
- data/lib/roadforest/augmentations.rb +1 -0
- data/lib/roadforest/content-handling.rb +1 -0
- data/lib/roadforest/content-handling/common-engines.rb +67 -0
- data/lib/roadforest/content-handling/engine.rb +2 -14
- data/lib/roadforest/content-handling/handler-wrap.rb +29 -31
- data/lib/roadforest/content-handling/media-type.rb +6 -0
- data/lib/roadforest/{rdf.rb → graph.rb} +1 -1
- data/lib/roadforest/{rdf → graph}/access-manager.rb +12 -74
- data/lib/roadforest/{rdf → graph}/document.rb +1 -1
- data/lib/roadforest/{rdf → graph}/etagging.rb +2 -2
- data/lib/roadforest/{rdf → graph}/focus-list.rb +1 -9
- data/lib/roadforest/{rdf → graph}/graph-copier.rb +2 -2
- data/lib/roadforest/{rdf → graph}/graph-focus.rb +5 -7
- data/lib/roadforest/{rdf → graph}/normalization.rb +1 -1
- data/lib/roadforest/{rdf → graph}/post-focus.rb +2 -3
- data/lib/roadforest/graph/vocabulary.rb +96 -0
- data/lib/roadforest/http/graph-transfer.rb +2 -2
- data/lib/roadforest/interface/application.rb +145 -0
- data/lib/roadforest/interface/blob.rb +38 -0
- data/lib/roadforest/interface/rdf.rb +77 -0
- data/lib/roadforest/interfaces.rb +2 -0
- data/lib/roadforest/remote-host.rb +17 -17
- data/lib/roadforest/resource.rb +4 -0
- data/lib/roadforest/resource/{rdf/leaf-item.rb → leaf-item.rb} +1 -1
- data/lib/roadforest/resource/{rdf/list.rb → list.rb} +1 -1
- data/lib/roadforest/resource/{rdf/parent-item.rb → parent-item.rb} +1 -1
- data/lib/roadforest/resource/{rdf/read-only.rb → read-only.rb} +18 -18
- data/lib/roadforest/resource/role/has-children.rb +1 -1
- data/lib/roadforest/resource/role/writable.rb +2 -2
- data/lib/roadforest/server.rb +1 -1
- data/lib/roadforest/source-rigor.rb +9 -0
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence-annealer.rb +2 -2
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence.rb +5 -5
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/any.rb +1 -1
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/none-if-role-absent.rb +1 -1
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/role-if-available.rb +1 -1
- data/lib/roadforest/source-rigor/engine.rb +45 -0
- data/lib/roadforest/{rdf → source-rigor}/graph-store.rb +9 -9
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/http-investigator.rb +2 -2
- data/lib/roadforest/{rdf → source-rigor}/investigation.rb +2 -2
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/investigator.rb +3 -3
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/null-investigator.rb +3 -2
- data/lib/roadforest/{rdf → source-rigor}/parcel.rb +5 -5
- data/lib/roadforest/{rdf → source-rigor}/resource-pattern.rb +6 -6
- data/lib/roadforest/{rdf → source-rigor}/resource-query.rb +2 -2
- data/lib/roadforest/source-rigor/rigorous-access.rb +101 -0
- data/lib/roadforest/templates/affordance-doc.haml +23 -0
- data/lib/roadforest/templates/affordance-property-values.haml +13 -0
- data/lib/roadforest/templates/affordance-subject.haml +9 -0
- data/lib/roadforest/templates/affordance-uri-object.haml +2 -0
- data/lib/roadforest/templates/base/{property_value.haml → property-value.haml} +0 -0
- data/lib/roadforest/templates/base/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/distiller/{property_value.haml → property-value.haml} +0 -0
- data/lib/roadforest/templates/distiller/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/min/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/rdfpost-curie.haml +6 -0
- data/lib/roadforest/test-support/dispatcher-facade.rb +2 -0
- data/lib/roadforest/test-support/matchers.rb +169 -5
- data/lib/roadforest/test-support/remote-host.rb +2 -2
- data/lib/roadforest/type-handlers/handler.rb +74 -0
- data/lib/roadforest/type-handlers/jsonld.rb +34 -0
- data/lib/roadforest/type-handlers/rdf-handler.rb +36 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer.rb +2 -2
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/document-environment.rb +9 -8
- data/lib/roadforest/type-handlers/rdfa-writer/environment-decorator.rb +312 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/object-environment.rb +3 -3
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/property-environment.rb +5 -11
- data/lib/roadforest/type-handlers/rdfa-writer/render-engine.rb +427 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/render-environment.rb +33 -26
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/subject-environment.rb +7 -23
- data/lib/roadforest/type-handlers/rdfa.rb +73 -0
- data/lib/roadforest/type-handlers/rdfpost.rb +301 -0
- data/lib/roadforest/utility/class-registry.rb +23 -5
- data/spec/.ctrlp-root +0 -0
- data/spec/affordance-augmenter.rb +75 -0
- data/spec/affordances-flow.rb +438 -0
- data/spec/authorization.rb +34 -0
- data/spec/client.rb +13 -12
- data/spec/credence-annealer.rb +5 -5
- data/spec/focus-list.rb +8 -8
- data/spec/full-integration.rb +3 -3
- data/spec/graph-copier.rb +4 -4
- data/spec/graph-store.rb +19 -31
- data/spec/keychain.rb +82 -0
- data/spec/rdf-normalization.rb +2 -2
- data/spec/rdf-parcel.rb +3 -3
- data/spec/rdfa-handler.rb +514 -0
- data/spec/rdfpost.rb +96 -0
- data/spec/source-rigor.rb +57 -0
- data/spec/update-focus.rb +11 -10
- metadata +91 -66
- data/lib/roadforest/blob-model.rb +0 -53
- data/lib/roadforest/content-handling/type-handler.rb +0 -76
- data/lib/roadforest/content-handling/type-handlers/jsonld.rb +0 -36
- data/lib/roadforest/content-handling/type-handlers/rdf-handler.rb +0 -38
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-engine.rb +0 -574
- data/lib/roadforest/content-handling/type-handlers/rdfa.rb +0 -175
- data/lib/roadforest/content-handling/type-handlers/rdfpost.rb +0 -297
- data/lib/roadforest/model.rb +0 -209
- data/lib/roadforest/models.rb +0 -2
- data/lib/roadforest/rdf/source-rigor.rb +0 -44
- data/lib/roadforest/rdf/vocabulary.rb +0 -11
- data/lib/roadforest/resource/http/form-parsing.rb +0 -81
- data/lib/roadforest/resource/rdf.rb +0 -4
- data/spec/form-parsing.rb +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require 'roadforest/
|
|
1
|
+
require 'roadforest/source-rigor/graph-store'
|
|
2
2
|
require 'roadforest/remote-host'
|
|
3
3
|
require 'roadforest/test-support/http-client'
|
|
4
4
|
module RoadForest::TestSupport
|
|
@@ -9,7 +9,7 @@ module RoadForest::TestSupport
|
|
|
9
9
|
end
|
|
10
10
|
|
|
11
11
|
def build_graph_store
|
|
12
|
-
RoadForest::
|
|
12
|
+
RoadForest::SourceRigor::GraphStore.new
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def http_client
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module RoadForest
|
|
2
|
+
module TypeHandlers
|
|
3
|
+
class Handler
|
|
4
|
+
def network_to_local(base_uri, network)
|
|
5
|
+
return network
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def local_to_network(base_uri, local)
|
|
9
|
+
return local
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def parse_for(resource)
|
|
13
|
+
source = resource.request_body
|
|
14
|
+
interface = resource.interface
|
|
15
|
+
input_data = network_to_local(interface.my_url, source)
|
|
16
|
+
|
|
17
|
+
update_interface(interface, input_data)
|
|
18
|
+
|
|
19
|
+
renderer = resource.content_engine.choose_renderer(resource.request_accept_header)
|
|
20
|
+
body = renderer.local_to_network(interface.my_url, interface.response_data)
|
|
21
|
+
|
|
22
|
+
build_response(resource)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def render_for(resource)
|
|
26
|
+
interface = resource.interface
|
|
27
|
+
output_data = get_output(interface)
|
|
28
|
+
local_to_network(interface.my_url, output_data)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def add_child_to(resource)
|
|
32
|
+
interface = resource.interface
|
|
33
|
+
source = resource.request_body
|
|
34
|
+
input_data = network_to_local(interface.my_url, source)
|
|
35
|
+
|
|
36
|
+
child_for_interface(resource.interface, input_data)
|
|
37
|
+
|
|
38
|
+
build_response(resource)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def build_response(resource)
|
|
42
|
+
interface = resource.interface
|
|
43
|
+
|
|
44
|
+
renderer = resource.content_engine.choose_renderer(resource.request_accept_header)
|
|
45
|
+
body = renderer.local_to_network(interface.my_url, interface.response_data)
|
|
46
|
+
|
|
47
|
+
resource.response_content_type = renderer.content_type_header
|
|
48
|
+
resource.response_body = body
|
|
49
|
+
if interface.response_location
|
|
50
|
+
resource.redirect_to(interface.response_location)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def child_for_interface(interface, data)
|
|
55
|
+
interface.add_child(data)
|
|
56
|
+
interface.processed
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def update_interface(interface, input_data)
|
|
60
|
+
result = interface.update(input_data)
|
|
61
|
+
interface.response_data = result
|
|
62
|
+
interface.processed
|
|
63
|
+
result
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def get_output(interface)
|
|
67
|
+
result = interface.retrieve
|
|
68
|
+
interface.response_data = result
|
|
69
|
+
interface.processed
|
|
70
|
+
result
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'json/ld'
|
|
2
|
+
require 'roadforest/type-handlers/rdf-handler'
|
|
3
|
+
module RoadForest
|
|
4
|
+
module TypeHandlers
|
|
5
|
+
#application/ld+json
|
|
6
|
+
class JSONLD < RDFHandler
|
|
7
|
+
include Graph::Normalization
|
|
8
|
+
|
|
9
|
+
def local_to_network(base_uri, rdf)
|
|
10
|
+
raise "Invalid base uri: #{base_uri}" if base_uri.nil?
|
|
11
|
+
prefixes = relevant_prefixes_for_graph(rdf)
|
|
12
|
+
prefixes.keys.each do |prefix|
|
|
13
|
+
prefixes[prefix.to_sym] = prefixes[prefix]
|
|
14
|
+
end
|
|
15
|
+
JSON::LD::Writer.buffer(:base_uri => base_uri.to_s,
|
|
16
|
+
:prefixes => prefixes) do |writer|
|
|
17
|
+
rdf.each_statement do |statement|
|
|
18
|
+
writer << statement
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def network_to_local(base_uri, source)
|
|
24
|
+
raise "Invalid base uri: #{base_uri.inspect}" if base_uri.nil?
|
|
25
|
+
graph = ::RDF::Graph.new
|
|
26
|
+
reader = JSON::LD::Reader.new(source.to_s, :base_uri => base_uri.to_s)
|
|
27
|
+
reader.each_statement do |statement|
|
|
28
|
+
graph.insert(statement)
|
|
29
|
+
end
|
|
30
|
+
graph
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require 'roadforest/type-handlers/handler'
|
|
2
|
+
require 'roadforest/graph/normalization'
|
|
3
|
+
module RoadForest
|
|
4
|
+
module TypeHandlers
|
|
5
|
+
class RDFHandler < Handler
|
|
6
|
+
include Graph::Normalization
|
|
7
|
+
|
|
8
|
+
def get_output(interface)
|
|
9
|
+
graph = super
|
|
10
|
+
root_uri = interface.canonical_uri
|
|
11
|
+
|
|
12
|
+
graph.each_statement do |statement|
|
|
13
|
+
original = statement.dup
|
|
14
|
+
if ::RDF::URI === statement.subject and statement.subject.relative?
|
|
15
|
+
statement.subject = normalize_resource(root_uri.join(statement.subject))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
if ::RDF::URI === statement.object and statement.object.relative?
|
|
19
|
+
statement.object = normalize_resource(root_uri.join(statement.object))
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if statement != original
|
|
23
|
+
graph.delete(original)
|
|
24
|
+
graph.insert(statement)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
graph
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def child_for_interface(interface, data)
|
|
31
|
+
interface.add_graph_child(data)
|
|
32
|
+
interface.processed
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -2,7 +2,7 @@ require 'cgi'
|
|
|
2
2
|
require 'roadforest/debug'
|
|
3
3
|
require 'rdf/rdfa'
|
|
4
4
|
|
|
5
|
-
module RoadForest::
|
|
5
|
+
module RoadForest::TypeHandlers
|
|
6
6
|
##
|
|
7
7
|
# An RDFa 1.1 serialiser in Ruby. The RDFa serializer makes use of Haml templates, allowing runtime-replacement with alternate templates. Note, however, that templates should be checked against the W3C test suite to ensure that valid RDFa is emitted.
|
|
8
8
|
#
|
|
@@ -134,7 +134,7 @@ module RoadForest::MediaType
|
|
|
134
134
|
#
|
|
135
135
|
# @return [void]
|
|
136
136
|
def write_epilogue
|
|
137
|
-
require 'roadforest/
|
|
137
|
+
require 'roadforest/type-handlers/rdfa-writer/render-engine'
|
|
138
138
|
@base_uri = RDF::URI(@options[:base_uri]) if @options[:base_uri]
|
|
139
139
|
@lang = @options[:lang]
|
|
140
140
|
@debug = @options[:debug]
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
require 'roadforest/
|
|
2
|
-
|
|
1
|
+
require 'roadforest/type-handlers/rdfa-writer/render-environment'
|
|
2
|
+
|
|
3
|
+
module RoadForest::TypeHandlers
|
|
3
4
|
class RDFaWriter
|
|
4
5
|
class DocumentEnvironment < RenderEnvironment
|
|
5
6
|
attr_accessor :subject_terms, :title, :prefixes, :lang, :base
|
|
6
|
-
def yielded(item)
|
|
7
|
-
@_engine.render(item)
|
|
8
|
-
end
|
|
9
7
|
|
|
10
8
|
def subjects
|
|
11
9
|
enum_for(:each_subject_environment)
|
|
@@ -13,7 +11,7 @@ module RoadForest::MediaType
|
|
|
13
11
|
|
|
14
12
|
def each_subject_environment
|
|
15
13
|
subject_terms.each do |term|
|
|
16
|
-
yield
|
|
14
|
+
yield subject_env(term)
|
|
17
15
|
end
|
|
18
16
|
end
|
|
19
17
|
|
|
@@ -21,14 +19,17 @@ module RoadForest::MediaType
|
|
|
21
19
|
%w{doc}
|
|
22
20
|
end
|
|
23
21
|
|
|
24
|
-
def
|
|
25
|
-
@prefix ||=
|
|
22
|
+
def build_prefix_header(prefixes)
|
|
26
23
|
if prefixes.empty?
|
|
27
24
|
nil
|
|
28
25
|
else
|
|
29
26
|
prefixes.keys.map {|pk| "#{pk}: #{prefixes[pk]}"}.sort.join(" ")
|
|
30
27
|
end.tap{|prefix| add_debug {"\nserialize: prefixes: #{prefixes.inspect} prefix src: #{prefix.inspect}"}}
|
|
31
28
|
end
|
|
29
|
+
|
|
30
|
+
def prefix
|
|
31
|
+
@prefix ||= build_prefix_header(prefixes)
|
|
32
|
+
end
|
|
32
33
|
end
|
|
33
34
|
end
|
|
34
35
|
end
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
require 'roadforest/utility/class-registry'
|
|
2
|
+
require 'roadforest/graph/vocabulary'
|
|
3
|
+
|
|
4
|
+
module RoadForest
|
|
5
|
+
module AffordanceClient
|
|
6
|
+
Af = Graph::Af
|
|
7
|
+
def all_affordances
|
|
8
|
+
@all_affordances ||=
|
|
9
|
+
[
|
|
10
|
+
Af.Affordance,
|
|
11
|
+
Af.Null,
|
|
12
|
+
Af.Safe,
|
|
13
|
+
Af.Idempotent,
|
|
14
|
+
Af.Unsafe,
|
|
15
|
+
Af.Navigate,
|
|
16
|
+
Af.Embed,
|
|
17
|
+
Af.Metadata,
|
|
18
|
+
Af.Update,
|
|
19
|
+
Af.Remove,
|
|
20
|
+
Af.Create,
|
|
21
|
+
Af.Mutate,
|
|
22
|
+
]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def affordance_present(aff)
|
|
26
|
+
::RDF::Query.new do
|
|
27
|
+
pattern [:any, ::RDF.type, aff ]
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def has_affordance(node, type)
|
|
32
|
+
if type.is_a? Symbol
|
|
33
|
+
type = Af[type]
|
|
34
|
+
end
|
|
35
|
+
::RDF::Query.new do
|
|
36
|
+
pattern([:node, ::RDF.type, type, nil])
|
|
37
|
+
pattern([:node, Af.target, node, nil])
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def payload_has_param(node)
|
|
42
|
+
::RDF::Query.new do
|
|
43
|
+
pattern([:node, Af.payload, :context, nil])
|
|
44
|
+
pattern([ :param, ::RDF.type, Af.Parameter, :context ])
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def query_matches(query, graph)
|
|
49
|
+
return (not graph.first(query).nil?)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def affordances_in_graph?(graph)
|
|
53
|
+
all_affordances.each do |aff|
|
|
54
|
+
return true if query_matches(affordance_present(aff), graph)
|
|
55
|
+
end
|
|
56
|
+
return false
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def affordance_node?(node, graph)
|
|
60
|
+
query = ::RDF::Query.new do
|
|
61
|
+
pattern [node, ::RDF.type, :type]
|
|
62
|
+
end
|
|
63
|
+
!!( query.execute(graph).find do |solution|
|
|
64
|
+
all_affordances.include?(solution[:type])
|
|
65
|
+
end)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def affordance_type_in_graph?(node, type, graph)
|
|
69
|
+
#puts "\n#{__FILE__}:#{__LINE__} => \n#{graph.dump(:nquads)}"
|
|
70
|
+
query_matches(has_affordance(node, type).tap{|value|
|
|
71
|
+
#puts "#{__FILE__}:#{__LINE__} => #{[value.patterns,
|
|
72
|
+
#value.execute(graph)].inspect}"
|
|
73
|
+
}, graph).tap{|value|
|
|
74
|
+
#puts "#{__FILE__}:#{__LINE__} => #{value.inspect}"
|
|
75
|
+
}
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def parameterized_navigation_affordance_in_graph?(node, graph)
|
|
79
|
+
return false #to be implemented
|
|
80
|
+
query_matches(has_affordance(node, :Navigate) + payload_has_param(node), graph)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
module TypeHandlers
|
|
85
|
+
class RDFaWriter
|
|
86
|
+
class DecorationSet
|
|
87
|
+
def initialize
|
|
88
|
+
@names = EnvironmentDecorator.all_names
|
|
89
|
+
end
|
|
90
|
+
attr_accessor :names
|
|
91
|
+
|
|
92
|
+
def decoration_for(env)
|
|
93
|
+
names.inject(env) do |env, name|
|
|
94
|
+
EnvironmentDecorator[name].perhaps_decorate(env)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
class EnvironmentDecorator
|
|
100
|
+
extend Utility::ClassRegistry::Registrar
|
|
101
|
+
|
|
102
|
+
class << self
|
|
103
|
+
def registry_purpose
|
|
104
|
+
"render environment decoration"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def decorates(klass)
|
|
108
|
+
register(self.name)
|
|
109
|
+
@decorated_class = klass
|
|
110
|
+
methods = klass.instance_methods
|
|
111
|
+
methods -= self.instance_methods
|
|
112
|
+
methods.each do |method|
|
|
113
|
+
define_method(method) do |*args, &block|
|
|
114
|
+
@_decorated_.__send__(method, *args, &block)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def can_decorate?(env)
|
|
120
|
+
return (env._base_env_.class <= @decorated_class)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def perhaps_decorate(env)
|
|
124
|
+
if can_decorate?(env)
|
|
125
|
+
self.new(env)
|
|
126
|
+
else
|
|
127
|
+
env
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def initialize(env)
|
|
134
|
+
@_decorated_ = env
|
|
135
|
+
setup
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def setup
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def like_a?(klass)
|
|
142
|
+
is_a?(klass) || _decorated_.like_a?(klass)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
attr_reader :_decorated_
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
class RDFPostCurie < RenderEnvironment
|
|
149
|
+
def initialize(engine, kind, uri)
|
|
150
|
+
super(engine)
|
|
151
|
+
@kind, @uri = kind, uri
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
attr_reader :kind, :uri
|
|
155
|
+
|
|
156
|
+
def curie
|
|
157
|
+
@curie ||= get_curie(uri)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def reduced?
|
|
161
|
+
curie != uri
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def prefix
|
|
165
|
+
@prefix ||= curie.split(":").first
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def suffix
|
|
169
|
+
@suffix ||= curie.split(":").last
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def template_kinds
|
|
173
|
+
%w{rdfpost-curie}
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
class AffordanceDecorator < EnvironmentDecorator
|
|
178
|
+
include AffordanceClient
|
|
179
|
+
extend AffordanceClient
|
|
180
|
+
|
|
181
|
+
def graph
|
|
182
|
+
_engine.graph
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def affordance?
|
|
186
|
+
true
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def rdfpost_curie(kind, uri)
|
|
190
|
+
curie = RDFPostCurie.new(_engine, kind, uri)
|
|
191
|
+
|
|
192
|
+
_engine.render(curie)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def template_kinds
|
|
196
|
+
_base_env_.template_kinds.map{|kind| "affordance-" + kind} + _base_env_.template_kinds
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
class DocumentAffordanceDecorator < AffordanceDecorator
|
|
201
|
+
decorates DocumentEnvironment
|
|
202
|
+
|
|
203
|
+
def self.can_decorate?(env)
|
|
204
|
+
return false unless env._base_env_.class <= DocumentEnvironment
|
|
205
|
+
affordances_in_graph?(env._engine.graph)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def subjects
|
|
210
|
+
_decorated_.subjects.reject do |subject_env|
|
|
211
|
+
affordance_node?(subject_env.subject, graph)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def prefixes
|
|
216
|
+
dec_prefixes = _decorated_.prefixes
|
|
217
|
+
|
|
218
|
+
dec_prefixes.keys.find_all do |key|
|
|
219
|
+
dec_prefixes[key] == Af.to_uri
|
|
220
|
+
end.each do |key|
|
|
221
|
+
dec_prefixes.delete(key)
|
|
222
|
+
end
|
|
223
|
+
dec_prefixes
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def prefix
|
|
227
|
+
@prefix ||= build_prefix_header(prefixes)
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
class SubjectAffordanceDecorator < AffordanceDecorator
|
|
232
|
+
decorates SubjectEnvironment
|
|
233
|
+
|
|
234
|
+
def self.can_decorate?(env)
|
|
235
|
+
return false unless env._base_env_.class <= SubjectEnvironment
|
|
236
|
+
return false unless env.parent.like_a? AffordanceDecorator
|
|
237
|
+
|
|
238
|
+
return (
|
|
239
|
+
[:Update, :Remove, :Create].find do |type|
|
|
240
|
+
affordance_type_in_graph?(env.subject, type, env._engine.graph)
|
|
241
|
+
end || parameterized_navigation_affordance_in_graph?(env.subject, env._engine.graph))
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def predicate_nodes
|
|
245
|
+
@predicate_nodes ||=
|
|
246
|
+
begin
|
|
247
|
+
[].tap do |nodes|
|
|
248
|
+
each_predicate do |pred|
|
|
249
|
+
pred.each_object do |object|
|
|
250
|
+
subj = _engine.subject_env(object)
|
|
251
|
+
next if subj.nil?
|
|
252
|
+
subj.rel = get_curie(pred.predicate)
|
|
253
|
+
nodes << subj
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
@predicate_nodes.enum_for(:each)
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def prefixes
|
|
262
|
+
_engine.prefixes
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def attrs
|
|
266
|
+
_decorated_.attrs.merge(
|
|
267
|
+
:method => "POST", :action => subject.join("put")
|
|
268
|
+
)
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
class PropertyAffordanceDecorator < AffordanceDecorator
|
|
273
|
+
decorates PropertyEnvironment
|
|
274
|
+
|
|
275
|
+
def self.can_decorate?(env)
|
|
276
|
+
return false unless (env._base_env_.class <= PropertyEnvironment)
|
|
277
|
+
return false unless (env.parent.like_a? AffordanceDecorator)
|
|
278
|
+
return true
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
class ObjectAffordanceDecorator < AffordanceDecorator
|
|
284
|
+
decorates ObjectEnvironment
|
|
285
|
+
|
|
286
|
+
def self.can_decorate?(env)
|
|
287
|
+
return false unless env._base_env_.class <= ObjectEnvironment
|
|
288
|
+
return false unless env.parent.like_a? AffordanceDecorator
|
|
289
|
+
return true
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def label_attrs
|
|
293
|
+
{}
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
def type_uri
|
|
297
|
+
if object.literal? and object.datatype?
|
|
298
|
+
object.datatype
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def input_attrs(value)
|
|
303
|
+
@_decorated_.attrs.merge(
|
|
304
|
+
:name => "ol",
|
|
305
|
+
:content => value,
|
|
306
|
+
:value => value,
|
|
307
|
+
)
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
end
|