Commit 8202dfdc5d9b2c061813a8f0b7fe384dcbbbd842

Authored by Evandro Jr
2 parents f77e542e fc1168b8

Merge branch 'virtuoso_integration' of gitlab.com:participa/noosfero into virtuoso_integration

Conflicts:
	plugins/virtuoso/lib/virtuoso_plugin.rb
	plugins/virtuoso/public/style.css
	plugins/virtuoso/views/virtuoso_plugin_admin/index.html.erb
plugins/virtuoso/controllers/virtuoso_plugin_admin_controller.rb
... ... @@ -18,12 +18,12 @@ class VirtuosoPluginAdminController < AdminController
18 18 end
19 19  
20 20 def force_harvest
21   - VirtuosoPlugin::DspaceHarvest.harverst_all(environment, params[:from_start])
  21 + VirtuosoPlugin::DspaceHarvest.harvest_all(environment, params[:from_start])
22 22 session[:notice] = _('Harvest started')
23 23 redirect_to :action => :index
24 24 end
25 25  
26   - def triple_management
  26 + def triples_management
27 27 triples_management = VirtuosoPlugin::TriplesManagement.new(environment)
28 28 @triples = []
29 29 if request.post?
... ... @@ -48,4 +48,36 @@ class VirtuosoPluginAdminController < AdminController
48 48 redirect_to :action => :triple_management
49 49 end
50 50  
  51 + def add_triple
  52 + if request.post?
  53 +
  54 + triple = VirtuosoPlugin::Triple.new
  55 + triple.graph = params[:triple][:graph]
  56 + triple.subject = params[:triple][:subject]
  57 + triple.predicate = params[:triple][:predicate]
  58 + triple.object = params[:triple][:object]
  59 +
  60 + triples_management = VirtuosoPlugin::TriplesManagement.new(environment)
  61 + triples_management.add_triple(triple)
  62 +
  63 + @triples = []
  64 +
  65 + session[:notice] = _('Triple succesfully added.')
  66 + render :action => :triple_management
  67 + end
  68 + end
  69 +
  70 + def remove_triple
  71 + triple = VirtuosoPlugin::Triple.new
  72 + triple.graph = params[:triple][:graph]
  73 + triple.subject = params[:triple][:subject]
  74 + triple.predicate = params[:triple][:predicate]
  75 + triple.object = params[:triple][:object]
  76 +
  77 + triples_management = VirtuosoPlugin::TriplesManagement.new(environment)
  78 + triples_management.remove_triple(triple)
  79 +
  80 + render json: { :ok => true, :message => _('Triple succesfully removed.') }
  81 + end
  82 +
51 83 end
... ...
plugins/virtuoso/lib/virtuoso_plugin.rb
... ... @@ -19,11 +19,21 @@ class VirtuosoPlugin < Noosfero::Plugin
19 19 end
20 20  
21 21 def virtuoso_client
22   - @virtuoso_client ||= RDF::Virtuoso::Repository.new("#{settings.virtuoso_uri}/sparql", :update_uri => "#{settings.virtuoso_uri}/sparql-auth", :username => settings.virtuoso_username, :password => settings.virtuoso_password, :auth_method => 'digest', :timeout => 30)
  22 + @virtuoso_client ||= virtuoso_client_builder(settings.virtuoso_uri, settings.virtuoso_username, settings.virtuoso_password)
  23 + end
  24 +
  25 + def virtuoso_readonly_client
  26 + @virtuoso_readonly_client ||= virtuoso_client_builder(settings.virtuoso_uri, settings.virtuoso_readonly_username, settings.virtuoso_readonly_password)
23 27 end
24 28  
25 29 def stylesheet?
26 30 true
27 31 end
28 32  
  33 + protected
  34 +
  35 + def virtuoso_client_builder(uri, username, password)
  36 + RDF::Virtuoso::Repository.new("#{uri}/sparql", :update_uri => "#{uri}/sparql-auth", :username => username, :password => password, :auth_method => 'digest', :timeout => 30)
  37 + end
  38 +
29 39 end
... ...
plugins/virtuoso/lib/virtuoso_plugin/triple.rb 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +class VirtuosoPlugin::Triple
  2 +
  3 + attr_accessor :graph, :subject, :predicate, :object
  4 +
  5 + def object=(value)
  6 + @object = format_triple_term(value)
  7 + end
  8 +
  9 + protected
  10 +
  11 + def format_triple_term(term)
  12 + term =~ /^(http|https):\/\// ? "<#{term}>" : "'#{term}'"
  13 + end
  14 +
  15 +end
  16 +
... ...
plugins/virtuoso/lib/virtuoso_plugin/triples_management.rb
... ... @@ -29,6 +29,16 @@ class VirtuosoPlugin::TriplesManagement
29 29 plugin.virtuoso_client.query(query)
30 30 end
31 31  
  32 + def add_triple(triple)
  33 + query = "WITH <#{triple.graph}> INSERT { <#{triple.subject}> <#{triple.predicate}> #{triple.object} }"
  34 + plugin.virtuoso_client.query(query)
  35 + end
  36 +
  37 + def remove_triple(triple)
  38 + query = "WITH <#{triple.graph}> DELETE { <#{triple.subject}> <#{triple.predicate}> #{triple.object} }"
  39 + plugin.virtuoso_client.query(query)
  40 + end
  41 +
32 42 protected
33 43  
34 44 def format_triple_term(term)
... ...
plugins/virtuoso/lib/virtuoso_plugin/triples_template.rb
... ... @@ -37,7 +37,7 @@ class VirtuosoPlugin::TriplesTemplate &lt; Article
37 37  
38 38 def template_content
39 39 begin
40   - results = plugin.virtuoso_client.query(query)
  40 + results = plugin.virtuoso_readonly_client.query(query)
41 41 liquid_template = Liquid::Template.parse(template)
42 42 page = liquid_template.render('results' => results)
43 43 transform_html(page)
... ...
plugins/virtuoso/public/style.css
... ... @@ -26,3 +26,7 @@
26 26 padding-top: 15px;
27 27 }
28 28  
  29 +#virtuoso-triples-management #triples-list .triple-actions {
  30 + text-align: right;
  31 +}
  32 +
... ...
plugins/virtuoso/public/triples_management.js 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +function remove_triple(triple_id) {
  2 + graph = jQuery("input#graph_uri").val();
  3 + subject = jQuery("input#triples_triple" + triple_id + "_from_subject").val();
  4 + predicate = jQuery("input#triples_triple" + triple_id + "_from_predicate").val();
  5 + object = jQuery("input#triples_triple" + triple_id + "_from_object").val();
  6 +
  7 + var formData = { triple: { graph: graph, subject: subject, predicate: predicate, object: object } }
  8 +
  9 + jQuery.ajax({
  10 + cache: false,
  11 + type: 'POST',
  12 + url: '/admin/plugin/virtuoso/remove_triple',
  13 + data: formData,
  14 + dataType: 'json',
  15 + success: function(data, status, ajax){
  16 + if ( !data.ok ) {
  17 + display_notice(data.error.message);
  18 + }
  19 + else {
  20 + display_notice(data.message);
  21 + jQuery("li#triple-" + triple_id).fadeOut(700, function() {
  22 + if (jQuery("ul#triples-list > li").length == 1) {
  23 + jQuery("form#form-triples-edit").remove();
  24 + }
  25 + else {
  26 + jQuery("li#triple-" + triple_id).remove();
  27 + }
  28 + });
  29 + }
  30 + },
  31 + error: function(ajax, status, errorThrown) {
  32 + alert('Send request - HTTP '+status+': '+errorThrown);
  33 + }
  34 + });
  35 +
  36 + return false;
  37 +}
... ...
plugins/virtuoso/test/unit/triples_template_test.rb
... ... @@ -10,8 +10,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
10 10  
11 11 should 'evaluate template using query results' do
12 12 article.stubs(:plugin).returns(mock)
13   - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock)
14   - article.plugin.virtuoso_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}])
  13 + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock)
  14 + article.plugin.virtuoso_readonly_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}])
15 15 article.template = "{% for row in results %}{{row.var}}{% endfor %}"
16 16  
17 17 assert_match /Hello World/, article.template_content
... ... @@ -19,8 +19,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
19 19  
20 20 should 'display error message when failed to execute the query' do
21 21 article.stubs(:plugin).returns(mock)
22   - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock)
23   - article.plugin.virtuoso_client.expects(:query).raises(RuntimeError.new)
  22 + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock)
  23 + article.plugin.virtuoso_readonly_client.expects(:query).raises(RuntimeError.new)
24 24 article.template = "{% for row in results %}{{row.var}}{% endfor %}"
25 25  
26 26 assert_equal "Failed to process the template", article.template_content
... ... @@ -28,8 +28,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
28 28  
29 29 should 'transform css into inline stylesheet' do
30 30 article.stubs(:plugin).returns(mock)
31   - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock)
32   - article.plugin.virtuoso_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}])
  31 + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock)
  32 + article.plugin.virtuoso_readonly_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}])
33 33 article.template = "{% for row in results %}<p>{{row.var}}</p>{% endfor %}"
34 34 article.stylesheet = "p {color: red}"
35 35  
... ... @@ -40,8 +40,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
40 40  
41 41 should 'do not allow js injection' do
42 42 article.stubs(:plugin).returns(mock)
43   - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock)
44   - article.plugin.virtuoso_client.expects(:query).returns([{'var' => RDF::Literal.new('<script>alert("hello");</script>')}])
  43 + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock)
  44 + article.plugin.virtuoso_readonly_client.expects(:query).returns([{'var' => RDF::Literal.new('<script>alert("hello");</script>')}])
45 45 article.template = "{% for row in results %}{{row.var}}{% endfor %}"
46 46  
47 47 assert_no_match /<script>/, article.template_content
... ...
plugins/virtuoso/test/unit/virtuoso_plugin_test.rb
... ... @@ -4,13 +4,29 @@ class VirtuosoPluginTest &lt; ActiveSupport::TestCase
4 4  
5 5 def setup
6 6 @environment = Environment.default
7   - @plugin = VirtuosoPlugin.new
  7 + @plugin = VirtuosoPlugin.new(self)
8 8 end
9 9  
10   - attr_reader :plugin
  10 + attr_reader :plugin, :environment
11 11  
12 12 should 'define a new content' do
13 13 assert_equal [VirtuosoPlugin::TriplesTemplate], plugin.content_types
14 14 end
15 15  
  16 + should 'create a client for virtuoso using admin account' do
  17 + plugin.stubs(:settings).returns(mock)
  18 + plugin.settings.expects(:virtuoso_uri)
  19 + plugin.settings.expects(:virtuoso_username)
  20 + plugin.settings.expects(:virtuoso_password)
  21 + plugin.virtuoso_client
  22 + end
  23 +
  24 + should 'create a client for virtuoso using a read-only account' do
  25 + plugin.stubs(:settings).returns(mock)
  26 + plugin.settings.expects(:virtuoso_uri)
  27 + plugin.settings.expects(:virtuoso_readonly_username)
  28 + plugin.settings.expects(:virtuoso_readonly_password)
  29 + plugin.virtuoso_readonly_client
  30 + end
  31 +
16 32 end
... ...
plugins/virtuoso/views/virtuoso_plugin_admin/add_triple.html.erb 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +<div id="virtuoso-triples-management">
  2 + <h1><%= _('Virtuoso settings &raquo; Triples Management &raquo; Add Triple')%></h1>
  3 +
  4 + <%= form_tag('/admin/plugin/virtuoso/add_triple', :method => 'post') do %>
  5 +
  6 + <ul>
  7 + <li>
  8 + <%= labelled_form_field(_('Graph:'), text_field_tag('triple[graph]', '') ) %>
  9 + </li>
  10 + <li>
  11 + <%= labelled_form_field(_('Subject:'), text_field_tag('triple[subject]', '') ) %>
  12 + </li>
  13 + <li>
  14 + <%= labelled_form_field(_('Predicate:'), text_field_tag('triple[predicate]', '') ) %>
  15 + </li>
  16 + <li>
  17 + <%= labelled_form_field(_('Object:'), text_field_tag('triple[object]', '') ) %>
  18 + </li>
  19 + </ul>
  20 +
  21 + <% button_bar do %>
  22 + <%= submit_button(:save, _('Save')) %>
  23 + <% end %>
  24 +
  25 + <% end %>
  26 +
  27 +</div>
... ...
plugins/virtuoso/views/virtuoso_plugin_admin/index.html.erb
... ... @@ -6,11 +6,13 @@
6 6 <%= form_for(:settings) do |f| %>
7 7 <strong>
8 8 <%= labelled_form_field _('Virtuoso URL:'), f.text_field(:virtuoso_uri) %>
9   - <%= labelled_form_field _('Virtuoso Username:'), f.text_field(:virtuoso_username) %>
10   - <%= labelled_form_field _('Virtuoso Password:'), f.password_field(:virtuoso_password) %>
  9 + <%= labelled_form_field _('Virtuoso Admin Username:'), f.text_field(:virtuoso_username) %>
  10 + <%= labelled_form_field _('Virtuoso Admin Password:'), f.password_field(:virtuoso_password) %>
  11 + <%= labelled_form_field _('Virtuoso Read-Only Username:'), f.text_field(:virtuoso_readonly_username) %>
  12 + <%= labelled_form_field _('Virtuoso Read-Only Password:'), f.password_field(:virtuoso_readonly_password) %>
  13 + <%= labelled_form_field _('DSpace URL:'), f.text_field(:dspace_uri) %>
11 14 </strong>
12   - <BR>
13   -
  15 + <BR>
14 16 <div class="dspace-servers-config-box" >
15 17  
16 18 <strong><%= _('Dspace Servers\' URL:') %></strong>
... ... @@ -49,7 +51,7 @@
49 51 <hr />
50 52 <div class="triple-management">
51 53 <div class="actions">
52   - <%= button :edit, _('Triple management'), :action => :triple_management %>
  54 + <%= button :edit, _('Triples management'), :action => :triples_management %>
53 55 <%= button :edit, _('Custom Queries'), :action => :index, :controller => 'virtuoso_plugin_custom_queries' %>
54 56 </div>
55   -</div>
56 57 \ No newline at end of file
  58 +</div>
... ...
plugins/virtuoso/views/virtuoso_plugin_admin/triple_management.html.erb
1 1 <div id="virtuoso-triples-management">
2 2 <h1><%= _('Virtuoso settings &raquo; Triples Management')%></h1>
3 3  
4   - <%= form_tag('/admin/plugin/virtuoso/triple_management', :method => 'post') do %>
5   - <%= labelled_form_field(_('Default Graph IRI:'), text_field_tag(:graph_uri, @graph_uri) ) %>
  4 + <%= form_tag('/admin/plugin/virtuoso/triples_management', :method => 'post') do %>
  5 + <%= labelled_form_field(_('Graph URI:'), text_field_tag(:graph_uri, @graph_uri) ) %>
6 6 <%= labelled_form_field(_('Query SPARQL:'), text_area_tag(:query, @query, :rows => 7)) %>
7 7 <% button_bar do %>
8   - <%= submit_button(:search, _('Search')) %>
  8 + <%= submit_button(:search, _('Search triples')) %>
  9 + <%= button :add, _('Add triple'), :action => :add_triple %>
9 10 <% end %>
10 11 <% end %>
11 12  
12 13 <% unless @triples.empty? %>
13 14  
14   - <%= form_tag('/admin/plugin/virtuoso/triple_update', :method => 'post') do %>
  15 + <%= form_tag('/admin/plugin/virtuoso/triple_update', :method => 'post', :id => 'form-triples-edit') do %>
15 16 <%= hidden_field_tag(:graph_uri, @graph_uri) %>
16 17  
17 18 <ul id="triples-list">
... ... @@ -20,7 +21,7 @@
20 21  
21 22 <% @triples.each { |triple| %>
22 23  
23   - <li>
  24 + <li id="triple-<%=triple_counter%>">
24 25 <ul class="triple">
25 26 <li>
26 27 <%= hidden_field_tag("triples[triple#{triple_counter}[from][subject]]", triple[:s].to_s) %>
... ... @@ -34,6 +35,9 @@
34 35 <%= hidden_field_tag("triples[triple#{triple_counter}[from][object]]", triple[:o].to_s) %>
35 36 <%= labelled_form_field(_('Object:'), text_field_tag("triples[triple#{triple_counter}[to][object]]", triple[:o].to_s) ) %>
36 37 </li>
  38 + <li class="triple-actions">
  39 + <%= button :remove, _('Remove triple'), {}, :href => '#', :onclick => "remove_triple(#{triple_counter}); return false;" %>
  40 + </li>
37 41 </ul>
38 42 </li>
39 43  
... ... @@ -52,3 +56,5 @@
52 56 <% end %>
53 57  
54 58 </div>
  59 +
  60 +<%= javascript_include_tag '/plugins/virtuoso/triples_management.js' %>
... ...