package avis;
import java.util.Collection;
import java.util.LinkedList;
import exception.BadEntry;
import exception.ItemBookAlreadyExists;
import exception.ItemFilmAlreadyExists;
import exception.MemberAlreadyExists;
import exception.NotAvis;
import exception.NotItem;
import exception.NotMember;
/**classe permettant d'instancier le SocialNetwork et qui regroupe les fonctions importantes*/
public class SocialNetwork {
/**
* Attributs
*/
private LinkedList <Member> _listMembers;
private LinkedList <Item> _listItems;
private LinkedList <ReviewOpinion> _listReviewsOfReviews = new LinkedList <ReviewOpinion> ();
/**
* Constructeurs
*/
public SocialNetwork(){
_listMembers = new LinkedList <Member>() ;
// listeMembreConstructeur = getMembers();
_listItems = new LinkedList <Item>();
// listeItemConstructeur = getItems();
}
/**
* @return Nombre de livres dans le SocialNetwork.
*/
public int nbBooks(){
int nbBook = 0;
for(int i =0; i< _listItems.size();i++){
if(_listItems.get(i) instanceof Book){
nbBook ++;
}
}
return nbBook;
}
/**
* @return Nombre de Films dans le SocialNetwork.
*/
public int nbFilms(){
int nbFilms = 0;
for(int i =0; i< _listItems.size();i++){
if(_listItems.get(i) instanceof Film){
nbFilms ++;
}
}
return nbFilms;
}
/**
* @return Nombre de membres du SocialNetwork.
*/
public int nbMembers(){
return _listMembers.size();
}
/**
* Méthode vérifiant la saisie des champs pseudo et password.
* @param pseudo Pseudo du membre
* @param password Password du membre
* @return Booleen, vrai si les champs sont correctement saisis
* @throws BadEntry
* <ul>
* <li> si le pseudo n'est pas instancié
* <li> si le pseudo a moins de 1 caractère
* <li> si le password n'est pas instancié
* <li> si le password a moins de 4 caractères, autre que des leadings or trailing blanks.
* </li></ul>
*/
public boolean checkEntryPseudoPassword(String pseudo, String password) throws BadEntry {
// pseudo non instancie
if(pseudo ==null)
throw new exception.BadEntry("Le pseudo n est pas instancie.");
//pseudo ayant moins de 1 caractere autre que des espaces
if(pseudo.trim().length()<1)
throw new exception.BadEntry("Le pseudo contient moins de un caractere autre que des espaces.");
//password non instancie
if(password==null)
throw new exception.BadEntry("Le password n est pas instancie");
//password ayant moins de 4 caracteres autre que des espaces
if(password.trim().length()<4)
throw new exception.BadEntry("Le password contient moins de 4 caracteres autre que des espaces.");
return true;
}
/**
* Méthode vérifiant la saisie du champ profil
* @param profil Profil du membre.
* @return Booleen, vrai si le champ profil est correctement saisi
* @throws BadEntry
* <ul>
* <li> si le profil n'est pas instancié
* </li></ul>
*/
public boolean checkEntryProfil(String profil) throws BadEntry {
if((profil==null))
throw new exception.BadEntry("Le profil n est pas instancie.");
return true; //true si la saisie est correcte, on arrive a la fin de la methode
}
/**
* Méthode vérifiant la saisie des champs titre, genre, auteur, nbPages pour l'ajout d'un livre.
* @param titre Titre du livre
* @param genre Genre du livre
* @param auteur Auteur du livre
* @param nbPages Nombre de pages du livre
* @return Booleen, vrai si les champs sont correctements saisis
* @throws BadEntry
* <ul>
* <li> si le titre n'est pas instancié ou a moins de 1 caractère autre que des espaces.
* <li> si le genre n'est pas instancié.
* <li> si l'auteur n'est pas instancié
* <li> si le nombre de pages n'est pas positif
* </li></ul>
*/
public boolean checkEntryBook(String titre, String genre, String auteur, int nbPages) throws BadEntry {
//titre non instancie
if(titre==null)
throw new exception.BadEntry("Le titre n est pas instancie");
//titre ayant moins de 1 caractere autre que des espaces
if(titre.trim().length()<1)
throw new exception.BadEntry("Le titre contient moins de un caractere autre que des espaces.");
//genre non instancie
if(genre==null)
throw new exception.BadEntry("Le genre n est pas instancie");
//auteur non instancie
if(auteur==null)
throw new exception.BadEntry("L'auteur n est pas instancie");
//nombre de page négatif
if((nbPages==0)||(nbPages<0))
throw new exception.BadEntry("Le nombre de page est négatif");
return true; // retournera true si toutes les saisies sont correctes
}
/**
* Méthode vérifiant la saisie des champs titre, genre, réalisateur, scénariste, durée pour l'ajout d'un film.
* @param titre Titre du film
* @param genre Genre du film
* @param realisateur Réalisateur du film
* @param scenariste scénariste du film
* @param duree Durée du film
* @return Booleen, vrai si les champs sont correctements saisis
* @throws : BadEntry
* <ul>
* <li> si le titre n'est pas instancié ou a moins de 1 caractère autre que des espaces.
* <li> si le genre n'est pas instancié.
* <li> si le réalisateur n'est pas instancié
* <li> si le scénariste n'est pas instancié
* <li> si la durée n'est pas positive
*/
public boolean checkEntryFilm(String titre,String genre,String realisateur,String scenariste, int duree) throws BadEntry {
//titre non instancie
if(titre==null)
throw new exception.BadEntry("Le titre n est pas instancie");
//titre ayant moins de 1 caractere autre que des espaces
if(titre.trim().length()<1)
throw new exception.BadEntry("Le titre contient moins de un caractere autre que des espaces.");
//genre non instancie
if(genre==null)
throw new exception.BadEntry("Le genre n est pas instancie");
//realisateur non instancie
if(realisateur==null)
throw new exception.BadEntry("Le realisateur n est pas instancie");
//scenariste non instancie
if(scenariste==null)
throw new exception.BadEntry("Le scenariste n est pas instancie");
//duree nulle
if((duree==0))
throw new exception.BadEntry("La duree est égale a 0");
//durée négative
if((duree<0))
throw new exception.BadEntry("La duree est négative");
return true; // retournera true si toutes les saisies sont correctes
}
/**
* Teste les erreurs de type BadEntry qu'on peut rencontrer lors de l'instanciation d'un review
* Retourne un boolean
*
* @param titre titre de l'item
* @param note note attribuée
* @param commentaire commentaire attribué
* @throws : BadEntry
* <ul>
* <li> si le titre n'est pas instancié ou a moins de 1 caractère autre que des espaces.
* <li> si la note est négative
* <li> si le commentaire n'est pas instancié
* @return un boolean pour indiquer si l'on évite les conditions énnoncées ci-dessus.
*/
public boolean checkEntryReview(String titre,float note,String commentaire) throws BadEntry {
//titre non instancie
if(titre==null)
throw new exception.BadEntry("Le titre n est pas instancie");
//titre ayant moins de 1 caractere autre que des espaces
if(titre.trim().length()<1)
throw new exception.BadEntry("Le titre contient moins de un caractere autre que des espaces.");
//note negative
if(note<0)
throw new exception.BadEntry("La note est négative");
//commentaire non instancie
if(commentaire==null)
throw new exception.BadEntry("Le commentaire n est pas instancie");
return true;
}
/**
* Teste les erreurs de type BadEntry qu'on peut rencontrer lors de l'instanciation d'un reviewOpinion
* Retourne un boolean
*
* @param titre titre de l'item
* @param note note attribuée
* @param commentaire commentaire attribué
* @throws : BadEntry
* <ul>
* <li> si le titre n'est pas instancié ou a moins de 1 caractère autre que des espaces.
* <li> si la note est négative
* <li> si le commentaire n'est pas instancié
*
* @return un boolean pour indiquer si l'on évite d'être dans les situations décrites ci-dessus.
*/
public boolean checkEntryAvisDavis (String titre, String pseduorev, float note, String com) throws BadEntry{
//titre non instancie
if(titre==null)
throw new exception.BadEntry("Le titre n est pas instancie");
//pseduorev non instancie
if(pseduorev==null)
throw new exception.BadEntry("Le pseduorev n est pas instancie");
//commenataire non instancie
if(com ==null){
throw new exception.BadEntry("Le commentaire n'est pas instancié.");
}
//note negative
if(note <0) {
throw new exception.BadEntry("La note est négative");
}
if(com.trim().length()<1){
throw new exception.BadEntry ("le commentaire fait moins d'un caractère");
}
return true;
}
/**
* Test si le nom accordé à ConsultItem n'éxecute pas une exception BadEntry
* Retourne un boolean
*
* @param nom nom utilisé par consultItem
* @throws : BadEntry
* <ul>
* <li> si le nom n'est pas instancié
* <li> si le nom contient moins de un caractere autre que des espaces
* @return un boolean pour indiquer si l'on évite la BadEntry ou non
*/
public boolean checkEntryNameConsultItem(String nom) throws BadEntry{
//nom non instancie
if(nom==null)
throw new exception.BadEntry("Le nom n est pas instancie");
//titre ayant moins de 1 caractere autre que des espaces
if(nom.trim().length()<1)
throw new exception.BadEntry("Le nom contient moins de un caractere autre que des espaces.");
return true;
}
/**
* Méthode de recherche de la presence d un membre
* @param pseudo Pseudo du membre
* @param password Mot de passe du membre
* @param condition Specifie le cas dans lequel la methode est appelée
* <ul>
* <li> Add : la methode est appellée lors de l'ajout d un membre
* <li> Other : la methode est appellée lors de l'ajout d'un livre, film, avis
* </li></ul>
* @return Booleen, faux si la confition n'est ni "add" ni "other"
* @throws MemberAlreadyExists
*/
public boolean checkMember(String pseudo, String password, String condition) throws NotMember, MemberAlreadyExists{
//verification de la non presence du membre dans le cas d'ajout de membre
if (condition.equals("add")){
for(Member m : _listMembers){
if(m.getPseudo().toLowerCase().trim().equals(pseudo.trim().toLowerCase())){
throw new MemberAlreadyExists();
}
}
return true;
}
//verification de la presence effective du membre pour l ajout de livre, film, review...
else if (condition.equals("other")){
for(Member m : _listMembers){
if(m.getPseudo().toLowerCase().trim().equals(pseudo.trim().toLowerCase()))
if(m.getPassword().equals(password)){
return true;
}
}
throw new NotMember("Le membre n est pas present");
}
return false;
}
/**
* Méthode de recherche de la presence d un livre
* @param titre Titre du livre a rechercher
* @param condition Specifie le cas dans lequel la methode est appelée
* <ul>
* <li> Add : la methode est appellee lors de l'ajout d'un livre
* <li> Other : la methode est appelle lors de l'ajout d'un avis
* </li></ul>
* @return Book, l'objet de type Book s'il existe
* @throws NotItem
* @throws ItemBookAlreadyExists
*/
public Book checkBook(String titre, String condition) throws NotItem, ItemBookAlreadyExists{
//verification de la presence effective du livre pour l ajout de livre
if (condition.equals("add")){
for(Item i : _listItems){
if(i instanceof Book){
//si le livre existe, il ne peut etre ajouter, on sort avec la levée de l exception
if(i.getTitre().trim().toLowerCase().equals(titre.trim().toLowerCase())){
throw new exception.ItemBookAlreadyExists();
}
}
}
//retourne null a la fin de la boucle for si lexception nest pas levee,
// si le livre n est pas deja present
return null;
}
//verification de la non presence du livre dans le cas d'ajout de review
if (condition.equals("other")){
Book book = null;
for(Item i : _listItems){
if(i instanceof Book){
if(i.getTitre().trim().toLowerCase().equals(titre.trim().toLowerCase())){
book = (Book)i;
return book;
}
}
}
throw new NotItem("Le livre n'existe pas");
}
return null; //retourne null si la condition n'est ni add ni other
}
/**
* Permet de chercher un film par son titre dans la liste d'Items
* Retourne un boolean
*
* @param titre titre du film
* @throws : NotItem
* <ul>
* <li> si le film n'existe pas dans la liste d'Items
* @return un boolean pour indiquer si le film existe ou non.
*/
public Film esTuCeFilm(String titre) throws NotItem{
Film film = null;
int compteur =0;
for(Item i : _listItems){
if(i instanceof Film)
if(i.getTitre().trim().toLowerCase().equals(titre.trim().toLowerCase())){
film = (Film)i;
compteur++;
}
}
if(compteur == 0)
throw new NotItem("Le film n'existe pas");
return film;
}
/**
* Permet de savoir si le livre peut être ajouté à la liste d'Items
* Retourne un boolean
*
* @param titre titre du livre
* @throws : ItemFilmAlreadyExists
* <ul>
* <li> si le film est déjà présent
* @return un boolean pour indiquer si le film peut être instancié ou non
*/
public boolean esTuDejaCeFilm(String titre) throws ItemFilmAlreadyExists {
for(Item i : _listItems){
if(i instanceof Film)
if(i.getTitre().trim().toLowerCase().equals(titre.trim().toLowerCase())){
throw new exception.ItemFilmAlreadyExists();
}
}
return true;
}
/**
* Permet d'ajouter un membre au Social Network
* Retourne un boolean
*
* @param pseudo pseudo souhaité
* @param password password du membre
* @param profil profil du member
* @throws : BadEntry
* <ul>
* <li> si le pseudo n'est pas instancié
* <li> si le pseudo a moins de 1 caractère
* <li> si le password n'est pas instancié
* <li> si le password a moins de 4 caractères, autre que des leadings or trailing blanks.
* </ul><br>
* @throws MemberAlreadyExists : si le pseudo est déjà pris
*
* @return le boolean indiquant la possibilité de créer ce membre
*/
public boolean addMember(String pseudo, String password, String profil) throws BadEntry, MemberAlreadyExists, NotMember{
String condition = "add";
if(checkEntryPseudoPassword(pseudo,password)){ // true
if(checkEntryProfil(profil)){ //true
if(checkMember(pseudo, password, condition)){ // si retourne true, le pseudo choisi n existe pas
//creation du membre
Member newMember = new Member(pseudo, password, profil);
_listMembers.add(newMember);
}
}
}
return true; //true si le membre a ete cree
}
/**
* Permet d'ajouter un livre à la liste d'Items
* Retourne un boolean
*
* @param pseudo Pseudo du membre
* @param password Password du membre
* @param titre Titre du livre
* @param genre Genre du livre
* @param auteur Auteur du livre
* @param nbPages Nombre de pages du livres
*
* @throws : BadEntry
* <ul>
* <li> si le pseudo n'est pas instancié
* <li> si le pseudo a moins de 1 caractère
* <li> si le password n'est pas instancié
* <li> si le password a moins de 4 caractères, autre que des leadings or trailing blanks.
* </ul><br>
* @throws NotMember :
* si le pseudo n'est pas celui d'un membre
* si le pseudo et le password ne correspondent pas.
*
* </ul><br>
* @throws ItemFilmAlreadyExists : si le livre existe déjà (avec un titre indifférent à la casse et aux trailing blanks)
*
* @return le boolean indiquant la possibilité d'ajouter le livre à la liste d'Items
* @throws MemberAlreadyExists
* @throws NotItem
*/
public boolean addItemBook(String pseudo, String password, String titre, String genre, String auteur, int nbPages) throws BadEntry, NotMember, ItemBookAlreadyExists, MemberAlreadyExists, NotItem {
//test saisie pseudo password
if(checkEntryPseudoPassword(pseudo,password)){ // true
//verification si le membre est bien present
if(checkMember(pseudo, password, "other")){ // si true : membre présent, on continu ...
//verification saisie des champs relatifs au book
if(checkEntryBook(titre,genre,auteur,nbPages)){ // si true, on continu ...
//verification que le titre de livre n est pas deja present
if(checkBook(titre, "add")==null){ //null si le livre n est pas present
Book newBook = new Book(titre,genre,auteur,nbPages);
_listItems.add(newBook); // on ajoute un livre en le spécifiant a un item
}
}
}
}
return true;
}
/**
* Permet d'ajouter un film à la liste d'Items
* Retourne un boolean
*
* @param pseudo pseudo du membre
* @param password password du membre
* @param titre titre du film
* @param genre genre du film
* @param réalisateur réalisateur du film
* @param scénariste scénariste du film nombre de pages du livres
* @param durée durée du film
*
*
* @throws : BadEntry
* <ul>
* <li> si le pseudo n'est pas instancié
* <li> si le pseudo a moins de 1 caractère
* <li> si le password n'est pas instancié
* <li> si le password a moins de 4 caractères, autre que des leadings or trailing blanks.
* <li> si le titre n'est pas instancié ou a moins de 1 caractère autre que des espaces.
* <li> si le genre n'est pas instancié.
* <li> si le réalisateur n'est pas instancié.
* <li> si le scénariste n'est pas instancié.
* <li> si la durée n'est pas positive.
* </ul><br>
* @throws NotMember :
* si le pseudo n'est pas celui d'un membre
* si le pseudo et le password ne correspondent pas.
*
* </ul><br>
* @throws ItemFilmAlreadyExists : si le film existe déjà (avec un titre indifférent à la casse et aux trailing blanks)
*
* @return le boolean indiquant la possibilité d'ajouter le film à la liste d'Items
* @throws MemberAlreadyExists
*/
public boolean addItemFilm(String pseudo, String password, String titre, String genre, String realisateur, String scenariste, int duree) throws BadEntry, NotMember, ItemFilmAlreadyExists, MemberAlreadyExists{
String condition ="other";
//test saisie pseudo password
if(checkEntryPseudoPassword(pseudo,password)){ // true
//verification si le membre est bien present
if(checkMember(pseudo, password, condition)){ // si true : membre présent, on continu ...
//verification saisie des champs relatifs au film
if(checkEntryFilm(titre,genre,realisateur,scenariste,duree)){ // si true, on continu ...
//verification que le titre de film n est pas deja present
if(esTuDejaCeFilm(titre)){
Film newFilm = new Film(titre,genre,realisateur,scenariste,duree);
_listItems.add(newFilm); // on ajoute un film en le spécifiant a un item
}
else
throw new exception.ItemFilmAlreadyExists();
}
}
else
throw new exception.NotMember("Le membre n est pas present");
}
return true;
}
/**
* Permet de consulter les items du socialNetwork par nom
* Retourne une LinkedList avec la représentation de tous les items ayant un titre équivalent à nom.
* Une liste vide sinon
*
* @param nom le nom de l'item (titre d'un film, d'un livre)
*
* @throws : BadEntry
* <ul>
* <li> si le nom n'est pas instancié
* <li> si le nom a moins de 1 caractère autre que des espaces
* @return une LinkedList avec la représentation de tous les items ayant un titre équivalent à nom. Une liste vide sinon
*/
public LinkedList<String> consultItems(String nom) throws BadEntry {
LinkedList <String> consultation = new LinkedList <String>();
if(checkEntryNameConsultItem(nom)){
consultation.add("Liste d'Item correspondant à la recherche : \n");
for(int i= 0; i <_listItems.size();i++){
if((_listItems.get(i).getTitre().trim().toLowerCase()).equals(nom.trim().toLowerCase())){
if((_listItems.get(i)) instanceof Book){
//transformation de listeItems en type Book
Book b = (Book)_listItems.get(i);
consultation.add("\nListe des livres correspondant : ");
consultation.add(b.toString());
}
else if((_listItems.get(i)) instanceof Film){
//transformation de listeItems en type Film
Film f = (Film)_listItems.get(i);
consultation.add("\nListe des films correspondant : ");
consultation.add(f.toString());
}
}
}
}
return consultation;
}
/**
* Permet de donner un avis sur un livre
* Retourne la note moyenne sur ce livre
*
* @param pseudo pseudo du membre
* @param password password du membre
* @param titre titre du film
* @param note note attribuée
* @param commmentaire commentaire attribué
* @throws : BadEntry
* <ul>
* <li> si le pseudo n'est pas instancié
* <li> si le pseudo a moins de 1 caractère
* <li> si le password n'est pas instancié
* <li> si le password a moins de 4 caractères, autre que des leadings or trailing blanks.
* <li> si le titre n'est pas instancié ou a moins de 1 caractère autre que des espaces.
* <li> si la note est négative
* <li> si le commentaire n'est pas instancié
* </ul><br>
* @throws NotMember :
* si le pseudo n'est pas celui d'un membre
* si le pseudo et le password ne correspondent pas.
*
* </ul><br>
* @throws NotItem : si le titre n'est pas le titre d'un film.
*
* @return la note moyenne du livre
* @throws MemberAlreadyExists
* @throws ItemBookAlreadyExists
*/
public float reviewItemBook(String pseudo, String password, String titre, float note, String commentaire) throws BadEntry, NotMember, NotItem, MemberAlreadyExists, ItemBookAlreadyExists{
int compteur =0;
String condition = "other";
//test saisie pseudo password
if(checkEntryPseudoPassword(pseudo,password)){ // true
//doit retourner le membre
//verification si le membre est bien present
if(checkMember(pseudo, password, condition)){ // si true : membre présent, on continu ...
//verification saisie des champs relatifs au riew
if((checkEntryReview(titre,note,commentaire))){ // si true : on continu
//verification que le titre de Book est bien présent
Book reviewedBook = checkBook(titre, condition);
if(reviewedBook!=null){ //si livre present
//pour chaque élément de la liste d'item
for(Item i : _listItems){
//verifie qu'il s'agit d'un livre
if(i instanceof Book){
//compare le titre entre en parametre a celui dans la liste
if(i.getTitre().trim().toLowerCase().equals(titre.trim().toLowerCase())){
//cree une nouvelle liste a partir de la liste d'avis du livre
LinkedList<Review> reviews = i.getReview();
//si la liste est vide = 1er avis
if(reviews.size()==0){
i.addReview(new Review(commentaire, note, pseudo));
}
else{
//sinon pour chaque element de la liste d'avis
for(Review r : reviews){
//on cherche le pseudo entre au debut
if(r.getPseudo().trim().toLowerCase().equals(pseudo.trim().toLowerCase())){
//on met a jour
i.setReview(note, commentaire, pseudo);
compteur++;
}
}
if(compteur == 0){//cad la liste n'est pas vide mais le membre qui veut ajouter n'a pas encore mis d'avis pour cet Item
i.addReview(new Review(commentaire, note, pseudo));
}
}
}
}
}
}
else
throw new exception.NotItem("Le livre n'est pas present");
}else
throw new exception.NotMember("Le membre n est pas present");
}
}
return note;
}
/**
* Permet de donner un avis sur un film
* Retourne la note moyenne de ce film
*
* @param pseudo pseudo du membre
* @param password password du membre
* @param titre titre du film
* @param note note attribuée
* @param commmentaire commentaire attribué
* @throws : BadEntry
* <ul>
* <li> si le pseudo n'est pas instancié
* <li> si le pseudo a moins de 1 caractère
* <li> si le password n'est pas instancié
* <li> si le password a moins de 4 caractères, autre que des leadings or trailing blanks.
* <li> si le titre n'est pas instancié ou a moins de 1 caractère autre que des espaces.
* <li> si la note est négative
* <li> si le commentaire n'est pas instancié
* </ul><br>
* @throws NotMember :
* si le pseudo n'est pas celui d'un membre
* si le pseudo et le password ne correspondent pas.
*
* </ul><br>
* @throws NotItem : si le titre n'est pas le titre d'un film.
*
* @return la note moyenne du film
* @throws MemberAlreadyExists
*/
public float reviewItemFilm(String pseudo, String password, String titre, float note, String commentaire) throws BadEntry, NotMember, NotItem, MemberAlreadyExists{
int compteur=0;
String condition = "other";
//test saisie pseudo password
if(checkEntryPseudoPassword(pseudo,password)){ // true
//doit retourner le membre
//verification si le membre est bien present
if(checkMember(pseudo, password, condition)){ // si true : membre présent, on continu ...
//verification saisie des champs relatifs au riew
if((checkEntryReview(titre,note,commentaire))){ // si true : on continu
//verification que le titre de Book est bien présent
Film reviewedFilm = esTuCeFilm(titre);
if(reviewedFilm!=null){ //si livre present
//pour chaque élément de la liste d'item
for(Item i : _listItems){
//verifie qu'il s'agit d'un livre
if(i instanceof Film){
//compare le titre entre en parametre a celui dans la liste
if(i.getTitre().trim().toLowerCase().equals(titre.trim().toLowerCase())){
//cree une nouvelle liste a partir de la liste d'avis du livre
LinkedList<Review> reviews = i.getReview();
//si la liste est vide = 1er avis
if(reviews.size()==0){
i.addReview(new Review(commentaire, note, pseudo));
}
else{
//sinon pour chaque element de la liste d'avis
for(Review r : reviews){
//on cherche le pseudo entre au debut
if(r.getPseudo().trim().toLowerCase().equals(pseudo.trim().toLowerCase())){
//on met a jour
i.setReview(note, commentaire, pseudo);
compteur++;
}
}
if(compteur == 0){//cad la liste n'est pas vide mais le membre qui veut ajouter n'a pas encore mis d'avis pour cet Item
i.addReview(new Review(commentaire, note, pseudo));
}
}
}
}
}
}
else
throw new exception.NotItem("Le film n'est pas present");
}else
throw new exception.NotMember("Le membre n est pas present");
}
}
return note;
}
/**
* Getter of the property <tt>members</tt>
* @return Returns the member.
*/
public Collection getMembers(){
return _listMembers;
}
/**
* Setter of the property <tt>members</tt>
* @param members The member to set.
*/
// public void setMembers(Collection members) {
// _listMembers = (LinkedList)members;
// }
public String toString(){
String message= "Membre de notre listeMembers : \n";
for(int i=0;i<_listMembers.size();i++){
message = message +_listMembers.get(i);
}
if(message=="Membre de notre listeMembers : \n")
message="Pas de membre";
return message;
}
/**
* Getter of the property <tt>items</tt>
* @return Returns the items.
*/
public LinkedList <Item> getItems() {
return _listItems;
}
/**
* Setter of the property <tt>items</tt>
* @param items The items to set.
*/
// public void setItems(Collection items) {
// this._listItems = (LinkedList)items;
// }
/**
* @uml.property name="item"
* @uml.associationEnd multiplicity="(0 -1)" inverse="socialNetwork1:avis.Item"
*/
//private Collection item;
/**
* Getter of the property <tt>item</tt>
* @return Returns the item.
* @uml.property name="item"
*/
// public Collection getItem() {
// return item;
// }
/**
* Setter of the property <tt>item</tt>
* @param item The item to set.
* @uml.property name="item"
*/
// public void setItem(Collection item) {
// this.item = item;
// }
/**
* @throws MemberAlreadyExists
* @throws BadEntry
*/
public void main() throws BadEntry, MemberAlreadyExists, NotMember {
}
public int existeOuPas(ReviewOpinion remplaceOrNot,LinkedList <Review> lesAutres){ // permet de dire si fo remplacer ou pas et si oui à quelle position.
int position =0;
for(int j =0;j<lesAutres.size();j++){
if((lesAutres.get(j).getCommentaire())==(remplaceOrNot.getCommentaire())){
position = j;
}
}
return position;
}
/**
* Donner son opinion sur un Avis.
* Ajoute l'opinion de ce membre sur cet Avis au <i>SocialNetwork</i>
* Si une opinion de ce membre sur ce film préexiste, elle est mise à jour avec ces nouvelles valeurs.
*
* @param pseudo pseudo du membre donnant son avis sur une opinion d'un autre membre
* @param password son mot de passe
* @param titre titre du film concerné
* @param reviewPseudo pseudo du membre qui a posé l'avis du film
* @param note la note qu'il donne à l'opinion
* @param commentaire ses commentaires
*
* @throws BadEntry :
* <ul>
* <li> si le pseudo n'est pas instancié ou a moins de 1 caractère autre que des espaces . </li>
* <li> si le password n'est pas instancié ou a moins de 4 caractères, autre que des leadings or trailing blanks. </li>
* <li> si le titre n'est pas instancié ou a moins de 1 caractère autre que des espaces. </li>
* <li> si le reviewPseudo n'est pas instancié ou a moins de 1 caractère autre que des espaces . </li>
* <li> si la note est négative. </li>
* <li> si le commentaire n'est pas instancié. </li>
* </ul><br>
* @throws NotMember : si le pseudo n'est pas celui d'un membre ou si le pseudo et le password ne correspondent pas.
* @throws NotMember : si le reviewPseudo n'est pas celui d'un membre.
* @throws NotItem : si le titre n'est pas le titre d'un film.
* @throws NotAvis : si reviewPseudo n'a pas donné d'avis sur ce film.
*
* @return la moyenne des opinions de ce film
* @throws MemberAlreadyExists
*/
public float reviewOpinionFilm(String pseudo, String password, String titre, String reviewPseudo, float note, String commentaire) throws BadEntry, NotMember, NotItem, NotAvis, MemberAlreadyExists {
// variable qui va contenir l'avis
Review avi = null;
String condition = "other";
if(checkEntryAvisDavis(titre, reviewPseudo, note, commentaire)){
// On récupère le membre qui note et qui est noté
// On récupère la liste des membres
LinkedList<Member> m = (LinkedList<Member>) getMembers();
// variable qui stock le membre qui note
Member membre = null;
//variable qui stock le membre qui est noté
Member reviewMembre = null;
// parcours de la liste
for (int i=0;i<m.size();i++) {
if(checkEntryPseudoPassword(pseudo,password)){
if(checkMember(pseudo, password, condition)){
// on récupère le membre qui note
membre=m.get(i);
}
}
// on cherche le membre noté qui a ce pseudo
if (m.get(i).getPseudo().trim().equalsIgnoreCase(reviewPseudo)) {
// on récupère le membre noté
reviewMembre=m.get(i);
}
}
// si le membre qui note ou qui est noté n'a pas été trouvé
if (membre == null) throw new NotMember(pseudo);
if (reviewMembre == null) throw new NotMember(reviewPseudo);
// On cherche maintenant le film ou le livre qui correspond à l'avis que l'on veut noter dans ces variables
Film film = null;
LinkedList <Film> f = new LinkedList <Film> ();
for(int j=0;j<_listItems.size();j++){
if(_listItems.get(j) instanceof Film){
f.add((Film) _listItems.get(j));
}
}
// on parcours les films
for (int i=0;i<f.size();i++) {
// on cherche le film qui correspond dans la liste
if (f.get(i).getTitre().equals(titre)) {
film=f.get(i);
}
}
// On renvoi une exception si aucun item a été trouvé
if (film == null) throw new NotItem(titre);
// on va maintenant déterminer quel avis correspond à cet item :
LinkedList <Review> a = film.getReview();
// on parcours la liste d'avis
for (int i=0;i<a.size();i++) {
// si le membre à noter a déjà donné un avis on récupère l'avis
if (a.get(i).getPseudo().equalsIgnoreCase(reviewPseudo))
avi = a.get(i);
}
if (avi == null) throw new NotAvis("l'avis n'existe pas");
// on récupère la liste des ReviewAvis
LinkedList <ReviewOpinion> r = avi.getAvisDavis();
// variable qui va contenir l'ancien ReviewAvis s'il existe
ReviewOpinion oldReviewAvis = null;
// on parcours la liste de ReviewAvis
for (int i=0;i<_listReviewsOfReviews .size();i++) {
// si le membre a déjà donné un ReviewAvis on récupère ce ReviewAvis
if (_listReviewsOfReviews.get(i).getMember().getPseudo().equalsIgnoreCase(pseudo))
oldReviewAvis = _listReviewsOfReviews.get(i);
}
// si le membre n'a jamais donné de ReviewAvis, on instancie un ReviewAvis
if (oldReviewAvis == null) {
// On instancie un nouveau commentaire et on l'ajoute à la liste
ReviewOpinion reviewAvis = new ReviewOpinion(membre,note,commentaire);
avi.getAvisDavis().add(reviewAvis);
}
else {
// sinon on le met à jour
oldReviewAvis.setNote(note);
oldReviewAvis.setCommentaire(commentaire);
}
// on met à jour le karma
updateKarma(reviewMembre);
}
// renvoi la moyenne de l'avis d'avis
return avi.getNote();
}
/**
* Donner son opinion sur un Avis de livre.
* Ajoute l'opinion de ce membre sur cet Avis au <i>SocialNetwork</i>
* Si une opinion de ce membre sur ce livre préexiste, elle est mise à jour avec ces nouvelles valeurs.
* Le Karma du membre que l'on note est automatiquement mis à jour
*
* @param pseudo pseudo du membre émettant l'opinion
* @param password son mot de passe
* @param titre titre du livre concerné
* @param reviewPseudo pseudo du membre émettant l'opinion
* @param note la note qu'il donne à l'opinion
* @param commentaire ses commentaires
*
* @throws BadEntry :
* <ul>
* <li> si le pseudo n'est pas instancié ou a moins de 1 caractère autre que des espaces . </li>
* <li> si le password n'est pas instancié ou a moins de 4 caractères, autre que des leadings or trailing blanks. </li>
* <li> si le titre n'est pas instancié ou a moins de 1 caractère autre que des espaces. </li>
* <li> si le reviewPseudo n'est pas instancié ou a moins de 1 caractère autre que des espaces . </li>
* <li> si la note est négative. </li>
* <li> si le commentaire n'est pas instancié. </li>
* </ul><br>
* @throws NotMember : si le pseudo n'est pas celui d'un membre ou si le pseudo et le password ne correspondent pas.
* @throws NotMember : si le reviewPseudo n'est pas celui d'un membre.
* @throws NotItem : si le titre n'est pas le titre d'un film.
* @throws NotAvis : si reviewPseudo n'a pas donné d'avis sur ce film.
*
* @return la moyenne des opinions de ce livre
* @throws MemberAlreadyExists
*/
public float reviewOpinionBook(String pseudo, String password, String titre, String reviewPseudo, float note, String commentaire) throws BadEntry, NotMember, NotItem, NotAvis, MemberAlreadyExists {
// variable qui va contenir l'avis
Review avi = null;
String condition = "other";
//test saisie pseudo password
if(checkEntryPseudoPassword(pseudo,password)){ // true
//doit retourner le membre
//verification si le membre est bien present
if(checkMember(pseudo, password, condition)) // si true : membre présent, on continu ...
//verification des entree pour le reviews d'avis
if(checkEntryAvisDavis(titre, reviewPseudo, note, commentaire)){
//si pas d'exception
// On récupère le membre qui note et qui est noté
// On récupère la liste des membres
LinkedList<Member> m = (LinkedList<Member>) getMembers();
// variable qui stock le membre qui note
Member membre = null;
//variable qui stock le membre qui est noté
Member reviewMembre = null;
// parcours de la liste
for (int i=0;i<m.size();i++) {
if(checkEntryPseudoPassword(pseudo,password)){
if(checkMember(pseudo, password, condition)){
// on récupère le membre qui note
membre=m.get(i);
}
}
// on cherche le membre noté qui a ce pseudo
if (m.get(i).getPseudo().trim().equalsIgnoreCase(reviewPseudo)) {
// on récupère le membre noté
reviewMembre=m.get(i);
}
}
// si le membre qui note ou qui est noté n'a pas été trouvé
if (membre == null) throw new NotMember(pseudo);
if (reviewMembre == null) throw new NotMember(reviewPseudo);
// On cherche maintenant le film ou le livre qui correspond à l'avis que l'on veut noter dans ces variables
Book book = null;
// on récupère les films dans f
LinkedList <Book> b = new LinkedList <Book> ();
for(int j=0;j<_listItems.size();j++){
if(_listItems.get(j) instanceof Film){
b.add((Book) _listItems.get(j));
}
}
// on parcours les films
for (int i=0;i<b.size();i++) {
// on cherche le film qui correspond dans la liste
if (b.get(i).getTitre().equals(titre)) {
book=b.get(i);
}
}
// On renvoi une exception si aucun item a été trouvé
if (book == null) throw new NotItem(titre);
// on va maintenant déterminer quel avis correspond à cet item :
// on récupère la liste des avis des livres
LinkedList <Review> a = book.getReview();
// on parcours la liste d'avis
for (int i=0;i<a.size();i++) {
// si le membre à noter a déjà donné un avis on récupère l'avis
if (a.get(i).getPseudo().equalsIgnoreCase(reviewPseudo))
avi = a.get(i);
}
// si l'avis n'a pas été donné
if (avi == null) throw new NotAvis("l'avis n'existe pas");
// on va regarder si on a pas déjà un avis similaire existant :
// on récupère la liste des ReviewAvis
LinkedList <ReviewOpinion> lesAvisDavis = avi.getAvisDavis();
// variable qui va contenir l'ancien ReviewAvis s'il existe
ReviewOpinion oldReviewAvis = null;
// on parcours la liste de ReviewAvis
for (int i=0;i<lesAvisDavis .size();i++) {
// si le membre a déjà donné un ReviewAvis on récupère ce ReviewAvis
if (lesAvisDavis.get(i).getMember().getPseudo().equalsIgnoreCase(pseudo))
oldReviewAvis = lesAvisDavis.get(i);
}
// si le membre n'a jamais donné de ReviewAvis, on instancie un ReviewAvis
if (oldReviewAvis == null) {
// On instancie un nouveau commentaire et on l'ajoute à la liste
ReviewOpinion reviewAvis = new ReviewOpinion(membre,note,commentaire);
avi.getAvisDavis().add(reviewAvis);
}
else {
// sinon on le met à jour
oldReviewAvis.setNote(note);
oldReviewAvis.setCommentaire(commentaire);
}
// on met à jour le karma
updateKarma(reviewMembre);
// renvoi la moyenne de l'avis d'avis
}
}
return avi.getNote();
}
/**
* Mettre à jour le karma d'un membre
*
* @param membre le karma du membre que l'on veut mettre à jour
*
*/
public void updateKarma(Member membre) {
LinkedList <Film> f = new LinkedList <Film> ();
for(int j=0;j<_listItems.size();j++){
if(_listItems.get(j) instanceof Film){
f.add((Film) _listItems.get(j));
}
}
LinkedList <Book> b = new LinkedList <Book> ();
for(int j=0;j<_listItems.size();j++){
if(_listItems.get(j) instanceof Film){
b.add((Book) _listItems.get(j));
}
}
LinkedList <Review> review;
LinkedList<ReviewOpinion> lesAvisDavis;
float somme = 0;
int compteur =0;
// on parcours les films
for (int i=0;i<f.size();i++) {
// on prend la liste de l'avis du nième film
review=f.get(i).getReview();
// on parcours l'avis
for (int j=0;j<review.size();j++) {
// si l'avis a été fait par le pseudo
if (review.get(j).getPseudo().equals(membre.getPseudo())) {
// on prend la liste des avis d'avis
lesAvisDavis= review.get(j).getAvisDavis();
// on en fait la somme des notes
for (int k=0;k<lesAvisDavis.size();k++) {
somme=somme+(lesAvisDavis.get(k)).getNote();
compteur++;
}
}
}
}
// on parcours les livres
for (int i=0;i<b.size();i++) {
// on prend la liste de l'avis du nième livre
review=b.get(i).getReview();
// on parcours l'avis
for (int j=0;j<review.size();j++) {
// si l'avis a été fait par le pseudo
if (review.get(i).getPseudo().equals(membre.getPseudo())) {
// on prend la liste des avis d'avis
lesAvisDavis=review.get(i).getAvisDavis();
// on en fait la somme des notes
for (int k=0;k<lesAvisDavis.size();k++) {
somme=somme+lesAvisDavis.get(i).getNote();
compteur++;
}
}
}
}
// on met à jour le karma du membre
membre.setKarma(somme/compteur);
}
}