From 2aa0a88584935382cd1f62e9cae21c1154d2d2dc Mon Sep 17 00:00:00 2001
From: Morgan <morgan.ridel@insa-rouen.fr>
Date: Mon, 16 Apr 2018 13:41:17 +0200
Subject: [PATCH] Ajout travail Morgan Ridel

---
 .../QuestionReponsesGeneralesFactory.java     |   4 +-
 .../webSemantique/QuestionReponsesLivres.java | 112 ++++++++++++++++++
 .../QuestionReponsesLivresFactory.java        |  30 +++++
 3 files changed, 145 insertions(+), 1 deletion(-)
 create mode 100644 src/fr/insarouen/asi/document/quizz/webSemantique/QuestionReponsesLivres.java
 create mode 100644 src/fr/insarouen/asi/document/quizz/webSemantique/QuestionReponsesLivresFactory.java

diff --git a/src/fr/insarouen/asi/document/quizz/QuestionReponsesGeneralesFactory.java b/src/fr/insarouen/asi/document/quizz/QuestionReponsesGeneralesFactory.java
index a672052..0131712 100644
--- a/src/fr/insarouen/asi/document/quizz/QuestionReponsesGeneralesFactory.java
+++ b/src/fr/insarouen/asi/document/quizz/QuestionReponsesGeneralesFactory.java
@@ -3,6 +3,7 @@ package fr.insarouen.asi.document.quizz;
 import fr.insarouen.asi.document.quizz.webSemantique.QuestionReponsesCapitalesFactory;
 import fr.insarouen.asi.document.quizz.webSemantique.QuestionReponsesTournoisTennisFactory;
 import fr.insarouen.asi.document.quizz.webSemantique.QuestionReponsesAuteursFactory;
+import fr.insarouen.asi.document.quizz.webSemantique.QuestionReponsesLivresFactory;
 
 public class QuestionReponsesGeneralesFactory implements QuestionReponsesFactory {
     QuestionReponsesFactory[] lesFactories;
@@ -11,7 +12,8 @@ public class QuestionReponsesGeneralesFactory implements QuestionReponsesFactory
 	lesFactories = new QuestionReponsesFactory[]{new QuestionReponsesAdditionFactory(), 
                              new QuestionReponsesCapitalesFactory(),
                              new QuestionReponsesTournoisTennisFactory(),
-                             new QuestionReponsesAuteursFactory()};
+                             new QuestionReponsesAuteursFactory(),
+							 new QuestionReponsesLivresFactory()};
     }
 
     public QuestionReponses getQuestionReponses() {
diff --git a/src/fr/insarouen/asi/document/quizz/webSemantique/QuestionReponsesLivres.java b/src/fr/insarouen/asi/document/quizz/webSemantique/QuestionReponsesLivres.java
new file mode 100644
index 0000000..26e5558
--- /dev/null
+++ b/src/fr/insarouen/asi/document/quizz/webSemantique/QuestionReponsesLivres.java
@@ -0,0 +1,112 @@
+package fr.insarouen.asi.document.quizz.webSemantique;
+
+import fr.insarouen.asi.document.quizz.QuestionReponses;
+import fr.insarouen.asi.document.quizz.Aleatoire;
+import java.net.URL;
+import java.net.MalformedURLException;
+import com.hp.hpl.jena.query.QuerySolution;
+import com.hp.hpl.jena.rdf.model.RDFNode;
+import java.util.ArrayList;
+import java.util.List;
+
+public  class QuestionReponsesLivres extends QuestionReponsesFrDbpedia  {
+
+  String uriAuteur;
+
+
+  private static String getURILivre(String uriAuteur) {
+    String res = "";
+    RDFNode rdfName;
+    String request = "SELECT distinct ?livre WHERE {\n";
+    request = request + "?livre rdf:type <http://dbpedia.org/ontology/Book> .\n";
+    request = request + "?livre <http://dbpedia.org/ontology/author> <"+ uriAuteur +"> .\n";
+    request = request + "}\n";
+    request = request + "ORDER BY RAND()\n";
+    request = request + "LIMIT 1";
+    for (QuerySolution solution : Outils.SPARQLQuerySolutions(getEntreeSparql(), getPrefixSparql(), request)) {
+      rdfName = solution.get("livre");
+      res = rdfName.toString();
+    }
+    return res;
+  }
+
+  private static List<String> getURIAutresLivres(String uriAuteur) {
+    List<String> res = new ArrayList<String>();
+    RDFNode rdfName;
+    String request = "select distinct ?livre  where{\n";
+    request = request + "?livre <http://dbpedia.org/ontology/author> ?auteur.\n";
+    request = request + "?livre rdf:type <http://dbpedia.org/ontology/Book>.\n";
+    request = request + "filter (?auteur != <"+uriAuteur+"> && isiri(?livre))}\nORDER BY RAND()\nLIMIT 20";
+
+    for (QuerySolution solution : Outils.SPARQLQuerySolutions(getEntreeSparql(), getPrefixSparql(), request)) {
+      rdfName = solution.get("?livre");
+      res.add(rdfName.toString());
+    }
+    return res;
+  }
+
+  private static List<String> choisirLivres(List<String> ls, int nb) {
+    int pos;
+    List<String> res = new ArrayList<String>();
+    for(int i=0;i<nb;i++) {
+      pos = Aleatoire.entierAleatoire(0, ls.size());
+      res.add(ls.remove(pos));
+    }
+    return res;
+  }
+
+  private static String getNomLivre(String uri) {
+    String res = "";
+    RDFNode rdfName;
+    String request = "select ?nom where{<"+uri+">  rdfs:label ?nom.";
+    request = request+"filter(langmatches(lang(?nom), 'fr'))}";
+    for (QuerySolution solution : Outils.SPARQLQuerySolutions(getEntreeSparql(), getPrefixSparql(), request)) {
+      rdfName = solution.get("nom");
+      res = langStringToString(rdfName.toString());
+    }
+    return res;
+  }
+
+  private static String getNomAuteur(String uri) {
+    String res = "";
+    RDFNode rdfName;
+
+    // String request = "select ?nom where{<"+uri+">  <http://fr.dbpedia.org/property/nom> ?nom.";
+    String request = "select ?nom where{<"+uri+">  rdfs:label ?nom.";
+    request = request+"filter(langmatches(lang(?nom), 'fr'))}";
+    for (QuerySolution solution : Outils.SPARQLQuerySolutions(getEntreeSparql(), getPrefixSparql(), request)) {
+      rdfName = solution.get("nom");
+      res = langStringToString(rdfName.toString());
+    }
+    return res;
+  }
+
+  private static List<String> getNomLivres(List<String> uris) {
+    List<String> res = new ArrayList<String>();
+    for(String uri : uris)
+    res.add(getNomLivre(uri));
+    return res;
+  }
+
+  private static String[] getQuestions(String _uriAuteur) {
+    String[] res = new String[4];
+    List<String> autres = getURIAutresLivres(_uriAuteur);
+    autres = choisirLivres(autres,3);
+    res[0] = getNomLivre(getURILivre(_uriAuteur));
+    for(int i=0;i<autres.size();i++)
+    res[1+i] = getNomLivre(autres.get(i));
+    return res;
+  }
+
+  public QuestionReponsesLivres(String _uriAuteur) {
+    super(getQuestions(_uriAuteur),0);
+    uriAuteur = _uriAuteur;
+  }
+
+  public String getDomaine() {
+    return "Littérature";
+  }
+  public String getQuestion() {
+    return "Quel est le livre écrit par "+getNomAuteur(uriAuteur)+" ?";
+  }
+}
diff --git a/src/fr/insarouen/asi/document/quizz/webSemantique/QuestionReponsesLivresFactory.java b/src/fr/insarouen/asi/document/quizz/webSemantique/QuestionReponsesLivresFactory.java
new file mode 100644
index 0000000..52e2ce2
--- /dev/null
+++ b/src/fr/insarouen/asi/document/quizz/webSemantique/QuestionReponsesLivresFactory.java
@@ -0,0 +1,30 @@
+package fr.insarouen.asi.document.quizz.webSemantique;
+
+import fr.insarouen.asi.document.quizz.QuestionReponses;
+import fr.insarouen.asi.document.quizz.QuestionReponsesFactory;
+import java.util.Random;
+import java.util.List;
+import java.util.ArrayList;
+import com.hp.hpl.jena.query.QuerySolution;
+import com.hp.hpl.jena.rdf.model.RDFNode;
+
+public class QuestionReponsesLivresFactory implements QuestionReponsesFactory {
+
+  // static private Random generateur = new Random();
+
+  private String getURIAuteur() {
+    String res = "";
+    RDFNode rdfName;
+    String request = "SELECT distinct ?uriAuteur WHERE {\n" + "?livre rdf:type <http://dbpedia.org/ontology/Book> .\n" + "?livre <http://dbpedia.org/ontology/author> ?uriAuteur .\n" + "FILTER EXISTS { ?uriAuteur rdfs:label ?nom . }\n" + "}\n" + "ORDER BY RAND()\n" +  "LIMIT 1";
+    for (QuerySolution solution : Outils.SPARQLQuerySolutions(QuestionReponsesFrDbpedia.getEntreeSparql(), QuestionReponsesWebSemantique.getPrefixSparql(), request)) {
+      rdfName = solution.get("uriAuteur");
+      res = rdfName.toString();
+    }
+    return res;
+  }
+
+  public QuestionReponses getQuestionReponses() {
+    String auteur = getURIAuteur();
+    return new QuestionReponsesLivres(auteur);
+  }
+}
-- 
GitLab