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,12 +18,12 @@ class VirtuosoPluginAdminController < AdminController
18 end 18 end
19 19
20 def force_harvest 20 def force_harvest
21 - VirtuosoPlugin::DspaceHarvest.harverst_all(environment, params[:from_start]) 21 + VirtuosoPlugin::DspaceHarvest.harvest_all(environment, params[:from_start])
22 session[:notice] = _('Harvest started') 22 session[:notice] = _('Harvest started')
23 redirect_to :action => :index 23 redirect_to :action => :index
24 end 24 end
25 25
26 - def triple_management 26 + def triples_management
27 triples_management = VirtuosoPlugin::TriplesManagement.new(environment) 27 triples_management = VirtuosoPlugin::TriplesManagement.new(environment)
28 @triples = [] 28 @triples = []
29 if request.post? 29 if request.post?
@@ -48,4 +48,36 @@ class VirtuosoPluginAdminController < AdminController @@ -48,4 +48,36 @@ class VirtuosoPluginAdminController < AdminController
48 redirect_to :action => :triple_management 48 redirect_to :action => :triple_management
49 end 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 end 83 end
plugins/virtuoso/lib/virtuoso_plugin.rb
@@ -19,11 +19,21 @@ class VirtuosoPlugin < Noosfero::Plugin @@ -19,11 +19,21 @@ class VirtuosoPlugin < Noosfero::Plugin
19 end 19 end
20 20
21 def virtuoso_client 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 end 27 end
24 28
25 def stylesheet? 29 def stylesheet?
26 true 30 true
27 end 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 end 39 end
plugins/virtuoso/lib/virtuoso_plugin/triple.rb 0 → 100644
@@ -0,0 +1,16 @@ @@ -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,6 +29,16 @@ class VirtuosoPlugin::TriplesManagement
29 plugin.virtuoso_client.query(query) 29 plugin.virtuoso_client.query(query)
30 end 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 protected 42 protected
33 43
34 def format_triple_term(term) 44 def format_triple_term(term)
plugins/virtuoso/lib/virtuoso_plugin/triples_template.rb
@@ -37,7 +37,7 @@ class VirtuosoPlugin::TriplesTemplate &lt; Article @@ -37,7 +37,7 @@ class VirtuosoPlugin::TriplesTemplate &lt; Article
37 37
38 def template_content 38 def template_content
39 begin 39 begin
40 - results = plugin.virtuoso_client.query(query) 40 + results = plugin.virtuoso_readonly_client.query(query)
41 liquid_template = Liquid::Template.parse(template) 41 liquid_template = Liquid::Template.parse(template)
42 page = liquid_template.render('results' => results) 42 page = liquid_template.render('results' => results)
43 transform_html(page) 43 transform_html(page)
plugins/virtuoso/public/style.css
@@ -26,3 +26,7 @@ @@ -26,3 +26,7 @@
26 padding-top: 15px; 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 @@ @@ -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,8 +10,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
10 10
11 should 'evaluate template using query results' do 11 should 'evaluate template using query results' do
12 article.stubs(:plugin).returns(mock) 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 article.template = "{% for row in results %}{{row.var}}{% endfor %}" 15 article.template = "{% for row in results %}{{row.var}}{% endfor %}"
16 16
17 assert_match /Hello World/, article.template_content 17 assert_match /Hello World/, article.template_content
@@ -19,8 +19,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase @@ -19,8 +19,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
19 19
20 should 'display error message when failed to execute the query' do 20 should 'display error message when failed to execute the query' do
21 article.stubs(:plugin).returns(mock) 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 article.template = "{% for row in results %}{{row.var}}{% endfor %}" 24 article.template = "{% for row in results %}{{row.var}}{% endfor %}"
25 25
26 assert_equal "Failed to process the template", article.template_content 26 assert_equal "Failed to process the template", article.template_content
@@ -28,8 +28,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase @@ -28,8 +28,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
28 28
29 should 'transform css into inline stylesheet' do 29 should 'transform css into inline stylesheet' do
30 article.stubs(:plugin).returns(mock) 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 article.template = "{% for row in results %}<p>{{row.var}}</p>{% endfor %}" 33 article.template = "{% for row in results %}<p>{{row.var}}</p>{% endfor %}"
34 article.stylesheet = "p {color: red}" 34 article.stylesheet = "p {color: red}"
35 35
@@ -40,8 +40,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase @@ -40,8 +40,8 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
40 40
41 should 'do not allow js injection' do 41 should 'do not allow js injection' do
42 article.stubs(:plugin).returns(mock) 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 article.template = "{% for row in results %}{{row.var}}{% endfor %}" 45 article.template = "{% for row in results %}{{row.var}}{% endfor %}"
46 46
47 assert_no_match /<script>/, article.template_content 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,13 +4,29 @@ class VirtuosoPluginTest &lt; ActiveSupport::TestCase
4 4
5 def setup 5 def setup
6 @environment = Environment.default 6 @environment = Environment.default
7 - @plugin = VirtuosoPlugin.new 7 + @plugin = VirtuosoPlugin.new(self)
8 end 8 end
9 9
10 - attr_reader :plugin 10 + attr_reader :plugin, :environment
11 11
12 should 'define a new content' do 12 should 'define a new content' do
13 assert_equal [VirtuosoPlugin::TriplesTemplate], plugin.content_types 13 assert_equal [VirtuosoPlugin::TriplesTemplate], plugin.content_types
14 end 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 end 32 end
plugins/virtuoso/views/virtuoso_plugin_admin/add_triple.html.erb 0 → 100644
@@ -0,0 +1,27 @@ @@ -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,11 +6,13 @@
6 <%= form_for(:settings) do |f| %> 6 <%= form_for(:settings) do |f| %>
7 <strong> 7 <strong>
8 <%= labelled_form_field _('Virtuoso URL:'), f.text_field(:virtuoso_uri) %> 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 </strong> 14 </strong>
12 - <BR>  
13 - 15 + <BR>
14 <div class="dspace-servers-config-box" > 16 <div class="dspace-servers-config-box" >
15 17
16 <strong><%= _('Dspace Servers\' URL:') %></strong> 18 <strong><%= _('Dspace Servers\' URL:') %></strong>
@@ -49,7 +51,7 @@ @@ -49,7 +51,7 @@
49 <hr /> 51 <hr />
50 <div class="triple-management"> 52 <div class="triple-management">
51 <div class="actions"> 53 <div class="actions">
52 - <%= button :edit, _('Triple management'), :action => :triple_management %> 54 + <%= button :edit, _('Triples management'), :action => :triples_management %>
53 <%= button :edit, _('Custom Queries'), :action => :index, :controller => 'virtuoso_plugin_custom_queries' %> 55 <%= button :edit, _('Custom Queries'), :action => :index, :controller => 'virtuoso_plugin_custom_queries' %>
54 </div> 56 </div>
55 -</div>  
56 \ No newline at end of file 57 \ No newline at end of file
  58 +</div>
plugins/virtuoso/views/virtuoso_plugin_admin/triple_management.html.erb
1 <div id="virtuoso-triples-management"> 1 <div id="virtuoso-triples-management">
2 <h1><%= _('Virtuoso settings &raquo; Triples Management')%></h1> 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 <%= labelled_form_field(_('Query SPARQL:'), text_area_tag(:query, @query, :rows => 7)) %> 6 <%= labelled_form_field(_('Query SPARQL:'), text_area_tag(:query, @query, :rows => 7)) %>
7 <% button_bar do %> 7 <% button_bar do %>
8 - <%= submit_button(:search, _('Search')) %> 8 + <%= submit_button(:search, _('Search triples')) %>
  9 + <%= button :add, _('Add triple'), :action => :add_triple %>
9 <% end %> 10 <% end %>
10 <% end %> 11 <% end %>
11 12
12 <% unless @triples.empty? %> 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 <%= hidden_field_tag(:graph_uri, @graph_uri) %> 16 <%= hidden_field_tag(:graph_uri, @graph_uri) %>
16 17
17 <ul id="triples-list"> 18 <ul id="triples-list">
@@ -20,7 +21,7 @@ @@ -20,7 +21,7 @@
20 21
21 <% @triples.each { |triple| %> 22 <% @triples.each { |triple| %>
22 23
23 - <li> 24 + <li id="triple-<%=triple_counter%>">
24 <ul class="triple"> 25 <ul class="triple">
25 <li> 26 <li>
26 <%= hidden_field_tag("triples[triple#{triple_counter}[from][subject]]", triple[:s].to_s) %> 27 <%= hidden_field_tag("triples[triple#{triple_counter}[from][subject]]", triple[:s].to_s) %>
@@ -34,6 +35,9 @@ @@ -34,6 +35,9 @@
34 <%= hidden_field_tag("triples[triple#{triple_counter}[from][object]]", triple[:o].to_s) %> 35 <%= hidden_field_tag("triples[triple#{triple_counter}[from][object]]", triple[:o].to_s) %>
35 <%= labelled_form_field(_('Object:'), text_field_tag("triples[triple#{triple_counter}[to][object]]", triple[:o].to_s) ) %> 36 <%= labelled_form_field(_('Object:'), text_field_tag("triples[triple#{triple_counter}[to][object]]", triple[:o].to_s) ) %>
36 </li> 37 </li>
  38 + <li class="triple-actions">
  39 + <%= button :remove, _('Remove triple'), {}, :href => '#', :onclick => "remove_triple(#{triple_counter}); return false;" %>
  40 + </li>
37 </ul> 41 </ul>
38 </li> 42 </li>
39 43
@@ -52,3 +56,5 @@ @@ -52,3 +56,5 @@
52 <% end %> 56 <% end %>
53 57
54 </div> 58 </div>
  59 +
  60 +<%= javascript_include_tag '/plugins/virtuoso/triples_management.js' %>