How to install Apache Spark on Windows 10

This guide is for beginners who are trying to install Apache Spark on a Windows machine, I will assume that you have a 64-bit windows version and you already know how to add environment variables on Windows.

Note: you don’t need any prior knowledge of the Spark framework to follow this guide.

1. Install Java

First, we need to install Java to execute Spark applications, note that you don’t need to install the JDK if you want just to execute Spark applications and  won’t develop new ones using Java. However, in this guide we will install JDK.

To do that go to this page and download the latest version of the JDK. After you install it, add the JAVA_HOME variable to your System Variables and make sure that it’s path value is pointing to JDK parent folder (see figure bellow for demonstration)

JAVA_HOME system variable

After you add this variable, it’s time to modify the Path system variable and add a new entry like this: %JAVA_HOME%\bin. This will let Windows command line recognize Java commands

Path variable demonstration

Now, start  the Command Line and type:

java -version

to check if Java was correctly installed

Java version

2. Install Scala

Download Scala windows installer from this page, scroll down to “Other resources” section and download the MSI file for windows (see figure bellow). Install it and add a new variable to your System Variables named SCALA_HOME which will point to the parent folder of Scala. Then, add %SCALA_HOME %\bin to Path system variable

Scala download page

3. Spark binaries

Since it’s not easy to build Spark from sources, we will download a pre-built package that contains all Spark binaries needed to execute it. Go to this page and choose the latest stable version pre-built for Hadoop 2.7 and later (see figure bellow). Extract the compressed file in any location you choose and make sure that the path to this location doesn’t contain any spaces. I suggest you to place Spark folder directly into a partition (C: for example).

Spark download page

Add a new variable to you system variables and name it: SPARK_HOME. This variable holds the Spark parent directory path (C:\spark-2.2.0-bin-hadoop2.7 for example). After that, add %SPARK_HOME%\bin to Path system variable

4. Hadoop WinUtils

Since we are using a pre-built Spark binaries for Hadoop, we need also additional binary files to run it. To do that. Create a new folder and name it “WinUtils” and place it in a parent directory of any partition (C:\WinUtils for example), then,  go to this page and download this repository by clicking in the right green button and choosing Download ZIP option. After you download the zip file, extract it and copy files from this folder “hadoop-2.7.1” to WinUtils folder (don’t copy the whole directory, just its content, the bin folder).

Note that you can use another folder/location for Hadoop Windows Binaries, but to simplify things and organize the work we used this method.

Now, add HADOOP_HOME variable to your system variables and make it points to the WinUtils folder (C:\WinUtils in this case).

Note: make sure that the variables we added before point to parent directories and not to bin folders !

5. Run Spark shell

Run Command Line as an administrator and type:

spark-shell

 If things work well, you will end up with an output like this:

Spark Shell

6. Run a sample Spark application

Spark comes with various examples that you can run them directly from the command line using this command:

 run-example 

Let’s run a sample app that computes an approximation value to pi:

 run-example SparkPi 
 run-example SparkPi 10 

We have tested two times: the first one will use the default number of partitions (2) and the second one will use 10

Results:

SparkPi (default)
SparkPi (10 partitions)

That’s all, thank you for reading this post and hope this simple guide will help you to install Apache Spark on your own Windows machine.

Implementation of TF-IDF in JAVA

In this tutorial i will show you how to implement the TF-IDF Algorithm in Java, TF-IDF stands for Term Frequency-Inverse Document Frequency, this algorithm is highly used in Text Mining to convert text inputs into a vector that contains weight of each term in each document.

Definition

TF(t,d) = Term Frequency(t,d): is the number of times that term t occurs in document d.

IDF(t,D) = Inverse Term Frequency(t,D)measures the importance of term in all documents (D), we obtain this measure by dividing the total number of documents by the number of documents containing the term, and then taking the logarithm of that quotient.

IDF(t,D) = \log_2{\frac{N}{DF}}

where N is the number of documents in the collection, and DF is the number of documents in which the term appears.

Finally, the weight is obtained by multiplying the two measures:

TF-IDF(t,d) = TF(t,d) * IDF(t,D) = Term Frequency(t,d) * Inverse Term Frequency(t,D)

TFIDF(t,d,D) = TF(t,d)\times IDF(t,D)

Implementation

I have represented a document d as a List object of Strings and the collection of all documents D or the dataset as a List of List of String objects.

Term Frequency(t,d)

public double tf(List<String> doc, String term) {
    double result = 0;
    for (String word : doc) {
       if (term.equalsIgnoreCase(word))
              result++;
       }
    return result / doc.size();
}

Inverse Term Frequency(t,D)

public double idf(List<List<String>> docs, String term) {
    double n = 0;
    for (List<String> doc : docs) {
        for (String word : doc) {
            if (term.equalsIgnoreCase(word)) {
                n++;
                break;
            }
        }
    }
    return Math.log(docs.size() / n);
}

TF-IDF(t,d,D)

public double tfIdf(List<String> doc, List<List<String>> docs, String term) {
    return tf(doc, term) * idf(docs, term);
}

Example

public static void main(String[] args) {

    List<String> doc1 = Arrays.asList("Lorem", "ipsum", "dolor", "ipsum", "sit", "ipsum");
    List<String> doc2 = Arrays.asList("Vituperata", "incorrupte", "at", "ipsum", "pro", "quo");
    List<String> doc3 = Arrays.asList("Has", "persius", "disputationi", "id", "simul");
    List<List<String>> documents = Arrays.asList(doc1, doc2, doc3);

    TFIDFCalculator calculator = new TFIDFCalculator();
    double tfidf = calculator.tfIdf(doc1, documents, "ipsum");
    System.out.println("TF-IDF (ipsum) = " + tfidf);

}

Result

TF-IDF (ipsum) = 0.2027325540540822

Here you can find the complete implementation of this class TFIDFCalculator

[Android] Annuaire Algérie 3.0


Bonjour,

Aujourd’hui  je vais vous présenter l’une de mes applications Android, elle s’agit de l’application “Annuaire Algérie”, Cette application vous offre la possibilité de chercher dans l’annuaire téléphonique d’Algérie Telecom d’après votre  smartphone.

Annuaire Algérie Accueil

 

L’application viens avec une interface graphique très simple, Il suffit juste d’entrer les informations (Nom, Prénom, Wilaya) et clique sur le bouton bleu “Recherche”, L’application va chercher sur l’annuaire et retourne les résultats dans une Liste.

Annuaire Algérie Résultats

Avec “Annuaire Algérie” vous avez la possibilité aussi de faire des recherches inversés en utilisant le numéro téléphone fixe.

Annuaire Algérie Recherche Inverse

 

Télécharger Annuaire Algérie pour Android

google-play-logo

 

 

[WEKA] Filtrage de Spam en Java

Bonjour,

Chaque un de nous possède au moins un compte email (Gmail,Yahoo,…), et chaque jour des dizaines de spam (courrier indésirable) sont filtrer (bloquer ) par le serveur de messagerie (le filtre ).

Spam

Donc comment ce filtre décide si un message est un spam ou ham (normal) ?

Il existe plusieurs approches pour le faire, parmi ces approches on trouve :

Filtrage bayesien

Filtrage par mots-clés ou adresses

Filtrage de contenu

Filtrage de Spam : le Corpus

Dans cette étude j’ai utilisé un corpus des SMS 🙂  qui contient 5,574 SMS (Spam et Ham) en Anglais.

Site Officiel du corpus : http://www.dt.fee.unicamp.br/~tiago/smsspamcollection/

Filtrage de Spam : Algorithmes

Les classificateurs utilisés dans cette étude sont

  1. NaiveBayes
  2. Arbre de Decession (C 4.5 )
  3. Knn
  4. SVM

Code Source en JAVA sur GitHub : https://github.com/guenodz/SMS-Spam-Classifier-.git

[JAVA] Utilisation de WordNet en JAVA

Bonjour,
Aujourd’hui nous allons voir comment chercher sur Le WordNet en JAVA en utilisant L’API “JAWS”.

Installation de WordNet sous Windows

WordNet : Telecharger 

Installer WordNet sur votre système comme n’importe quelle Logiciel.

L’API JAWS

JAWS : Site Officile 

L’API JAWS (Java API for WordNet Searching) c’est un API JAVA open source qui nous permet de chercher dans le WordNet.

Chargement de WordNet 

Pour charger WordNet en JAVA avec JAWS il faut tout d’abord changer la propriété wordnet.database.dir avec l’emplacement de dictionnaire du WordNet WordNet\x.x\dict  (x.x) version WordNet 

System.setProperty("wordnet.database.dir","C:\\Program Files (x86)\\WordNet\\2.1\\dict");

WordNetDatabase database = WordNetDatabase.getFileInstance();

Exemple 


import edu.smu.tspell.wordnet.NounSynset;
import edu.smu.tspell.wordnet.Synset;
import edu.smu.tspell.wordnet.SynsetType;
import edu.smu.tspell.wordnet.WordNetDatabase;

public class WordNet {

	public static void main(String[] args) {

		System.setProperty("wordnet.database.dir",
				"C:\\Program Files (x86)\\WordNet\\2.1\\dict");

		WordNetDatabase database = WordNetDatabase.getFileInstance();
		NounSynset nounSynset;
		Synset[] synsets = database.getSynsets("bus", SynsetType.NOUN);
		System.out.println("Le Mot Bus");
		for (int i = 0; i < synsets.length; i++) {
			nounSynset = (NounSynset) synsets[i];
			System.out.println("Définition " + i + " : "
					+ nounSynset.getDefinition());
			System.out.println("Synonymes du Mot : ");
			for (String syn : nounSynset.getWordForms())
				System.out.println("	" + syn);
		}

	}

}

Résultat


Le Mot Bus
Définition 0 : a vehicle carrying many passengers; used for public transport
Synonymes du Mot :
	bus
	autobus
	coach
	charabanc
	double-decker
	jitney
	motorbus
	motorcoach
	omnibus
	passenger vehicle
Définition 1 : the topology of a network whose components are connected by a busbar
Synonymes du Mot :
	bus topology
	bus
Définition 2 : an electrical conductor that makes a common connection between several circuits
Synonymes du Mot :
	busbar
	bus
Définition 3 : a car that is old and unreliable
Synonymes du Mot :
	bus
	jalopy
	heap

Récupérer la Météo d’une ville avec YWeather4j

YWeather4j est un Wrapper de Yahoo Weather API pour JAVA.

Avec YWeather4j vous pouvez récupérez facilement les information de météo d’un ville.

Lien GitHub.com : https://github.com/guenodz/YWeather4j

Demo 

Récupérer la météo de la ville d’Alger :


import com.guendouz.yweather.YWeather;
import com.guendouz.yweather.model.WeatherInfo;

public class Main {

	public static void main(String[] args) {
		YWeather weather = new YWeather();
		WeatherInfo info = weather.getWeatherForPlace("Algiers");
		// afficher la vitesse du vent 
		System.out.println(info.getWind().getSpeed());

	}

}

1

[Python] Manipulation des Fichiers Exécutables avec PEFile

Bonjour a tous ,

Aujourd’hui nous allons apprendre comment parser , lire et récupérer les informations sur un fichier exécutable (Format PE) en Python avec le module pefile .

Format PE 

Toute un fichier exécutable 32 bit sur la plateforme Windows  est structuré sous une format standard , cette dernière encapsule toute les informations d’un EXE ( version , fonctions systèmes utilisés , ressources IHM , … ).

Format PE

PEFile

pefile est un module python multiplateforme développé par Ero Carerra qui nous permet de manipuler un fichier Portable Executable  d’une façons très simple .

Site Web Officiel : https://code.google.com/p/pefile/

Charger un Fichier EXE 

Avant toute opération sur un fichier PE , il faut que ce dernier est chargé dans la mémoire.

Pour parser notre exécutable avec PEFile, il suffit d’instancier la classe PE et comme paramètre le chemin totale de notre exécutable .

import pefile

exe = pefile.PE("calc.exe")

Récupérer les informations sur la structure 

une fois le fichier PE est chargé ont peut facilement accéder aux différents sections .

Signature Signature permettant d’identifier le fichier, qui doit être égale à 0x00004550, soit “PE” ( étant un octet nul).

import pefile

exe = pefile.PE("calc.exe")
print "Signature  : %s " % hex(exe.NT_HEADERS.Signature)

la section FileHeader : contenant des informations sur la structuration du fichier .

import pefile

exe = pefile.PE("calc.exe")

for keys in exe.FILE_HEADER.__keys__:
    for item in keys:
        valeur = getattr(exe.FILE_HEADER, item)
        print item + ": %s" % hex(valeur)

Résultat :

Machine: 0x14c
NumberOfSections: 0x3
TimeDateStamp: 0x3b7d8410
PointerToSymbolTable: 0x0
NumberOfSymbols: 0x0
SizeOfOptionalHeader: 0xe0
Characteristics: 0x10f

la section OptionalHeader

import pefile

exe = pefile.PE("calc.exe")

for keys in exe.OPTIONAL_HEADER.__keys__:
    for item in keys:
        valeur = getattr(exe.OPTIONAL_HEADER, item)
        print item + ": %s" % hex(valeur)

Résultat :

Magic: 0x10b
MajorLinkerVersion: 0x7
MinorLinkerVersion: 0x0
SizeOfCode: 0x12800
SizeOfInitializedData: 0x9600
SizeOfUninitializedData: 0x0
AddressOfEntryPoint: 0x12475
BaseOfCode: 0x1000
BaseOfData: 0x14000
ImageBase: 0x1000000
SectionAlignment: 0x1000
FileAlignment: 0x200
MajorOperatingSystemVersion: 0x5
MinorOperatingSystemVersion: 0x1
MajorImageVersion: 0x5
MinorImageVersion: 0x1
MajorSubsystemVersion: 0x4
MinorSubsystemVersion: 0x0
Reserved1: 0x0
SizeOfImage: 0x1f000
SizeOfHeaders: 0x400
CheckSum: 0x1c7f7
Subsystem: 0x2
DllCharacteristics: 0x8000
SizeOfStackReserve: 0x40000
SizeOfStackCommit: 0x1000
SizeOfHeapReserve: 0x100000
SizeOfHeapCommit: 0x1000
LoaderFlags: 0x0
NumberOfRvaAndSizes: 0x10

Énumération des Symboles (DLL et Fonctions )

Imports 

Lister les DLL et les Fonctions importer par un fichier PE , ont trouve ces informations dans la structure DIRECTORY_ENTRY_IMPORT

import pefile

exe = pefile.PE("calc.exe")

for entry in exe.DIRECTORY_ENTRY_IMPORT:
    print "DLL %s Imports : " % entry.dll
    for symbol in entry.imports:
        print symbol.name

Résultat :

DLL GDI32.dll Imports :
SetBkColor
SetTextColor
SetBkMode
DLL USER32.dll Imports :
GetMenu
SetDlgItemInt
GetWindowTextW
CheckDlgButton
HideCaret
CallWindowProcW
[...]

Récupéré la Table des Sections 

Lister les différents sections de notre fichier PE .

import pefile

exe = pefile.PE("calc.exe")

for sec in exe.sections:
    print "%s , @ : %s , Size : %s " % (sec.Name,hex(sec.VirtualAddress), hex(sec.SizeOfRawData))

Résultat :

.text , @ : 0x1000 , Size : 0x12800
.data , @ : 0x14000 , Size : 0xa00
.rsrc, @ : 0x16000 , Size : 0x8c00

Sources 

http://fr.wikipedia.org/wiki/Portable_Executable

https://code.google.com/p/pefile/

Click to access PE%20Format.pdf

[JAVA] Lire un Fichier XML via SAX

Bonjour a tous ,

Je vous présente dans cet article un rapide Tutorial  a SAX avec un exemple d’implémentation d’une lecture d’un fichier XML en JAVA.

Présentation de SAX 

SAX signifie Simple API XML, c’est un API qui permet de lire des flux XML.

SAX travaille d’une façon totalement déférente a DOM, SAX utilise les fonctions de rappel (callback functions) pour informer les clients de la structure du document XML.

Pour l’utiliser il faut donc définir une classe qui va implémenter ces méthodes particulières qui sont :

startDocument() et endDocument() : appelés lorsque le parseur débute ou termine la lecture d’un document.

startElement() et endElement() : appelés lorsque le parseur débute ou termine la lecture d’un élément du document (rencontre d’une nouvelle balise).

characters() : appelés lorsque le parseur rencontre des caractères entre un début et la fin d’une balise d’un élément du document.

Implémentation

j’ai utiliser ce Fichier XML pour l’exemple : ici

MyXmlHandler.java

package com.guendouz.saxtut;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MyXmlHandler extends DefaultHandler {

	boolean author = false;
	boolean title = false;
	boolean genre = false;

	@Override
	public void startDocument() throws SAXException {
		System.out.println("Debut du Document");
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		System.out.println("Debut de L'Element : " + qName);

		if (qName.equalsIgnoreCase("AUTHOR")) {
			author = true;
		}
		if (qName.equalsIgnoreCase("TITLE")) {
			title = true;
		}
		if (qName.equalsIgnoreCase("GENRE")) {
			genre = true;
		}
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (author) {
			System.err.println("Author : " + new String(ch, start, length));
			author = false;
		}
		if (title) {
			System.err.println("Title : " + new String(ch, start, length));
			title = false;
		}
		if (genre) {
			System.err.println("Genre : " + new String(ch, start, length));
			genre = false;
		}

	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		System.out.println(" Fin de L'Element");
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.println("Fin du Document");
	}

}

Main.java

package com.guendouz.saxtut;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;

public class Main {

	public static void main(String[] args) throws ParserConfigurationException,
			SAXException, IOException {
		SAXParserFactory factoy = SAXParserFactory.newInstance();
		SAXParser parser = factoy.newSAXParser();
		File xmlFile = new File("books.xml");
		parser.parse(xmlFile, new MyXmlHandler());

	}

}

Resultat

Debut du Document
Debut de L'Element : catalog
Debut de L'Element : book
Debut de L'Element : author
 Fin de L'Element
Debut de L'Element : title
 Fin de L'Element
Debut de L'Element : genre
 Fin de L'Element
Debut de L'Element : price
 Fin de L'Element
Debut de L'Element : publish_date
 Fin de L'Element
Debut de L'Element : description
Author : Gambardella, Matthew
Title : XML Developer's Guide
Genre : Computer
 Fin de L'Element
 Fin de L'Element
Debut de L'Element : book
Debut de L'Element : author
Author : Ralls, Kim
Title : Midnight Rain
Genre : Fantasy
 Fin de L'Element
Debut de L'Element : title
 Fin de L'Element
Debut de L'Element : genre
 Fin de L'Element
Debut de L'Element : price
 Fin de L'Element
Debut de L'Element : publish_date
 Fin de L'Element
Debut de L'Element : description
 Fin de L'Element
 Fin de L'Element
Debut de L'Element : book
Debut de L'Element : authorAuthor : Corets, Eva
Title : Maeve Ascendant
Genre : Fantasy

 Fin de L'Element
Debut de L'Element : title
 Fin de L'Element
Debut de L'Element : genre
 Fin de L'Element
Debut de L'Element : price
 Fin de L'Element
Debut de L'Element : publish_date
 Fin de L'Element
Debut de L'Element : description
 Fin de L'Element
 Fin de L'Element
 Fin de L'Element
Fin du Document

[JAVA] Afficher les Résultats d’une requête SQL dans un JTable

Bonjour a tous,

Dans ce Tutorial on a vu comment gérer une base de données SQLite en java , Aujourd’hui on va voir comment  afficher les résultats d’une requête SQL ( sélection ) dans un tableau  (JTable), pour cela il faut  ré-implémenter  les méthodes de la classe AbstractTableModel, après nous avons utiliser cette dernière comme un modèle pour le JTable .

1. les Méthodes de la classe AbstractTableModel :

AbstractTableModel contient plusieurs méthodes mais on va  s’intéresser a ces 4  méthodes :

  1. public int getRowCount()
  2. public int getColumnCount()
  3. public Object getValueAt(int row, int column)
  4. public String getColumnName(int column)

1. public int getRowCount(); cette méthode renvoi le nombre de lignes dans le tableau .

2. public int getColumnCount(); cette méthode renvoi le nombre de colonnes dans tableau .

3. public Object getValueAt(int row, int column);  cette méthode renvoi l’objet situé dans la ligne numéro row et la colonne numéro column (commençons par la valeur de 0).

4. public String getColumnName(int column); cette méthode renvoi le nom de la colonne dont le numéro est column .

2. Implémentation : 

Avant d’implémenter ces méthodes on ajoute a la  classe deux  attributs :

private final String[] Titres = { “Titre”, “Sous Titre”, “Pages”, “Date de Publication”}; 

un tableau de String contient les noms des colonnes (entête)

private final List<Book> Livres = new ArrayList<Book>();

une liste contient les résultats d’une requête ( un liste de Livres )


package com.guendouz.tutdb.gui;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import com.guendouz.tutdb.Book;

public class TableModel extends AbstractTableModel {

	private final String[] Titres = { "Titre", "Sous Titre", "Pages",
			"Date de Publication" };
	private final List Livres = new ArrayList();

	@Override
	public int getColumnCount() {
		return Titres.length;
	}

	@Override
	public int getRowCount() {
		return Livres.size();
	}

	@Override
	public String getColumnName(int column) {
		return Titres[column];
	}

	@Override
	public Object getValueAt(int row, int column) {
		switch (column) {
		case 0:
			return Livres.get(row).getTitle();
		case 1:
			return Livres.get(row).getSubTitle();
		case 2:
			return Livres.get(row).getPages();
		case 3:
			return Livres.get(row).getPublished();
		default:
			return "";
		}
	}
}

3. Créer L’Interface

après qu’on a crée et implémenter le modèle du table,  ils nous reste qu’ajouter un composant JTable a notre interface JFrame


package com.guendouz.tutdb.gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.JTable;

import com.guendouz.tutdb.Book;
import com.guendouz.tutdb.Connexion;

public class MainFrame extends JFrame {

	private JPanel contentPane;
	private JTable table;
	private Connexion connexion;
	private TableModel model;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					MainFrame frame = new MainFrame();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public MainFrame() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);

		connexion = new Connexion("Database.db");
		connexion.connect();
		ArrayList bookList = connexion.getAllBooks();

		model = new TableModel(bookList);

		table = new JTable();
		table.setModel(model);
		contentPane.add(new JScrollPane(table), BorderLayout.CENTER);

		connexion.close();
	}
}

Résultat

JTable

Maintenant on ajoutent les trois méthodes suivantes pour bien gérer l’accès a notre TableModel (Modèle de table)

1. public void addBook(Book book) ; ajouter un Livre au tableau (Objet de type Book)

2. public Book getBookAt(int row) ; retourner l’objet a la ligne numéro : row

3. public void deleteBookAt(int row) ; supprimer l’objet de la ligne numéro : row

Remarque : Apres avoir supprimer ou ajouter un élément de  la table il faut que nous informent la table (JTable) qu’on a fait un changement en utilisent  les méthodes fireTableRowsInserted fireTableRowsDeleted


public void addBook(Book book) {
		int index = Livres.size();
		Livres.add(book);
		fireTableRowsInserted(index, index);
	}

	public Book getBookAt(int row) {
		if (row >= Livres.size())
			return null;
		else
			return Livres.get(row);
	}

	public void deleteBookAt(int row){
		if (row < Livres.size()){
			Livres.remove(row);
			fireTableRowsDeleted(row, row);
		}
	}

4. Résultat Finale : TableModel.java


package com.guendouz.tutdb.gui;

import java.util.List;

import javax.swing.table.AbstractTableModel;

import com.guendouz.tutdb.Book;

public class TableModel extends AbstractTableModel {

	private final String[] Titres = { "Titre", "Sous Titre", "Pages",
			"Date de Publication" };
	private final List<Book> Livres;

	public void addBook(Book book) {
		int index = Livres.size();
		Livres.add(book);
		fireTableRowsInserted(index, index);
	}

	public Book getBookAt(int row) {
		if (row >= Livres.size())
			return null;
		else
			return Livres.get(row);
	}

	public void deleteBookAt(int row){
		if (row < Livres.size()){
			Livres.remove(row);
			fireTableRowsDeleted(row, row);
		}
	}

	public TableModel(List<Book> livres) {
		Livres = livres;
	}

	@Override
	public int getColumnCount() {
		return Titres.length;
	}

	@Override
	public int getRowCount() {
		return Livres.size();
	}

	@Override
	public String getColumnName(int column) {
		return Titres[column];
	}

	@Override
	public Object getValueAt(int row, int column) {
		switch (column) {
		case 0:
			return Livres.get(row).getTitle();
		case 1:
			return Livres.get(row).getSubTitle();
		case 2:
			return Livres.get(row).getPages();
		case 3:
			return Livres.get(row).getPublished();
		default:
			return "";
		}
	}

}

Ainsi , je termine cet article sur l’utilisation de JTable et AbstractTableModel  n’hésitez pas de posez des questions sur les notions incompréhensibles ou sur  JAVA en générale .

Merci a tous … a bientôt avec d’autres Tutoriaux  .

[JAVA] Lire un Fichier XML via DOM

Bonjour a tous ,

Un Fichier XML est un des moyens les plus utilisé pour Représenter ,Partager , et Transformer les Informations entre les Applications , les Systems (même entre les humains !)  , dans cet Article je vous présente comment lire ou parser un fichier XML via DOM .

Prérequis :

  • Comment écrire un fichier XML (Syntaxe ..).
  • Programmer en JAVA

DOM … C’est Quoi ?

DOM signifier “Document Object Model” c’est l’un des moyens utilisé pour représenter un fichier XML sur L’ordinateur (en Memoire) il le  représente sous forme d’un Arbre dont les nœuds représente les Eléments du fichier XML .

Arbre DOM

Obtenir L’Arbre DOM d’un Fichier XML 

pour obtenir un arbre DOM  représentant un document XML, il faut utiliser un parseur qui implémente DOM .

Exemple 1 : Récupérer l’objet Document qui représente l’arbre DOM du Fichier Books.xml

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

public class DOMParser {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Document document = null;
		DocumentBuilderFactory factory = null;
		DocumentBuilder builder = null;

		try {
			factory = DocumentBuilderFactory.newInstance();
			builder = factory.newDocumentBuilder();
			document = builder.parse("Books.xml");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Le parcours d’un arbre DOM 
On peut parcourir les éléments d’un fichier XML via DOM par plusieurs méthodes

Element getDocumentElement() : retourne l’élément de la tête 

Element getElementById(String elementId) : retourne l’élément dont l'id est elementId

NodeList getElementsByTagName(String tagname) : retourne une NodeListe (Liste des nœuds ) de tout les éléments dont le nom de la balise est tagname

Exemple 2 : obtenir tous les livres (balise “book”)

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class DOMParser {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Document document = null;
		DocumentBuilderFactory factory = null;
		DocumentBuilder builder = null;

		try {
			factory = DocumentBuilderFactory.newInstance();
			builder = factory.newDocumentBuilder();
			document = builder.parse("Books.xml");
			NodeList booksList = document.getElementsByTagName("book");
			System.out.println("Nombre de Livres est : "+booksList.getLength());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Exemple 3 : Obtenir les sous-éléments de la premier balise <book>

NodeList sousElements = booksList.item(0).getChildNodes();
			for (int i = 0; i < sousElements.getLength(); i++) {
				System.out.println(sousElements.item(i).getNodeName());
			}

Resultat :

#text
author
#text
title
#text
genre
#text
price
#text
publish_date
#text
description
#text

Ou vient ces “#text” ? malgré le fichier ne contient aucune balise sous ce nom
et ben c’est le parseur , car il reconnue le espaces comme des éléments , et ou est la solution ?
La solution est de tester a chaque fois le type de l’élément retourne par le parseur

Code :

NodeList sousElements = booksList.item(0).getChildNodes();
			for (int i = 0; i < sousElements.getLength(); i++) {
				Node child = sousElements.item(i);
				if (child instanceof Element)
					System.out.println(sousElements.item(i).getNodeName());
			}

Resultat :


author
title
genre
price
publish_date
description
 

Dans cet article ont a vu comment Lire (ou Parser ) un fichier XML via DOM , mais il n’y a pas que le DOM , il existe une autre solution c’est Le “SAX” , un parseur basé sur les Evénements et très rapide que DOM , de plus DOM est tres Lourd cote Mémoire , pour cela L’Article prochain inchalaa sera sur le SAX
Ainsi que je termine cet article , Merci a tous …