Archive

Articles taggués ‘Java’

Ajouter un timeout en RMI – How to handle a timeout on RMI connections ?

29/06/2010
Commentaires fermés

Par défaut les connexions RMI ont un timeout assez long (20s sur mon environnement).

Il peut être utile de gérer soit même le timeout utilisé pour se connecter au serveur RMI.

Prenons le code suivant:

Here is a little « How to handle timeout on a RMI connection », lets try the execution of following code:

Lire la suite…

Java ,

Audio snippet code in Java

24/03/2010
Commentaires fermés

Here is an example of two simple Java classes that deals with audio streams ! One for retrieving Info, the other for playing sound …

Voici deux petits exemples de classe Java pour gérer des flux audio. L’une affichant les informations, l’autre implémentant un lecteur très minimaliste !


import java.io.File;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.Line;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.Port;
import javax.sound.sampled.SourceDataLine;

public class AudioInfo {

    public static void main(final String[] args) {
        try {
            AudioFileFormat format = AudioSystem.getAudioFileFormat(new File("Recharger.wav"));
            System.out.println("format: " + format);

            Mixer.Info[] infos = AudioSystem.getMixerInfo();
            Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo();
            Line.Info lineInfo = null;
            for (int i = 0; i < infos.length; ++i) {
                Mixer mixer = AudioSystem.getMixer(mixerInfo[i]);
                System.out.println("Target lines infos");
                Line.Info[] lineInfos = mixer.getTargetLineInfo(Port.Info.SPEAKER);
                for (int l = 0; l < lineInfos.length; ++l) {
                    System.out.println("Line Info " + l + " - " + lineInfos[l]);
                    lineInfo = lineInfos[l];
                }
            }

            SourceDataLine sourceLine;
            DataLine.Info info = new DataLine.Info(SourceDataLine.class, format.getFormat()); // format is an AudioFormat object
            if (AudioSystem.isLineSupported(info)) {
                // Obtain and open the line.
                try {
                    sourceLine = (SourceDataLine) AudioSystem.getLine(info);
                    sourceLine.open(format.getFormat());
                } catch (LineUnavailableException ex) {
                    // Handle the error.
                    ex.printStackTrace();
                }
            } else {
                // Handle the error.
                System.out.println("Line is not supported");
            }

            Port targetLine;
            if (AudioSystem.isLineSupported(Port.Info.SPEAKER)) {
                try {
                    targetLine = (Port) AudioSystem.getLine(Port.Info.SPEAKER);
                    targetLine.open();
                } catch (LineUnavailableException ex) {
                    // Handle the error.
                    ex.printStackTrace();
                }
            } else {
                // Handle the error.
                System.out.println("SPEAKER Line is not supported");
            }

        } catch (Exception ex) {
            //UnsupportedAudioFile... &amp; IO...
            ex.printStackTrace();
        }
    }
}

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class SoundPlayer extends JFrame implements Runnable {

    private final File currentDir; // Current directory
    private String oldFilename; // Last selected file name
    private final JComboBox soundChoice; // Dropdown list of files
    private final JButton play; // PLAY button
    private AudioInputStream source; // Stream for the sound file
    private SourceDataLine sourceLine; // The speaker output line
    private byte[] soundData; // Buffer to hold samples
    private int bufferSize; // Buffer size in bytes
    private Thread thread; // Playing thread
    private boolean playing = false; // Thread control

    public SoundPlayer() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setTitle("Sound File Player");
        setSize(250, 100);

        // Get the sounds file names from current directory
        currentDir = new File(System.getProperty("user.dir"));
        FilenameFilter filter = new FilenameFilter() {
            public boolean accept(final File directory, final String filename) {
                String name = filename.toLowerCase();
                return name.endsWith(".au") || name.endsWith(".aif") || name.endsWith(".wav");
            }
        };
        String soundFiles[] = currentDir.list(filter);
        if (soundFiles == null || soundFiles.length == 0) {
            JOptionPane.showMessageDialog(this, "No sound files .:. terminating...", "Sound Files Error", JOptionPane.ERROR_MESSAGE);
            System.exit(1);
        }
        soundChoice = new JComboBox(soundFiles);
        soundChoice.setSelectedIndex(0);
        newSound(soundFiles[0]);
        oldFilename = soundFiles[0];

        soundChoice.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                newSound((String) soundChoice.getSelectedItem());
            }
        });

        // Set up the PLAY button to play the current sound file
        play = new JButton("PLAY");
        play.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                if (e.getActionCommand().equals("PLAY")) {
                    startPlay();
                    play.setText("STOP");
                } else {
                    stopPlay();
                    play.setText("PLAY");
                }
            }
        });
        Container content = getContentPane();
        content.add(soundChoice);
        content.add(play, BorderLayout.SOUTH);
        setVisible(true);
    }

    public static void main(final String[] args) {
        new SoundPlayer();
    }

    public void newSound(final String filename) {
        File soundFile = new File(currentDir, filename);

        // We may have played a file already
        if (sourceLine != null) {// If we have a line
            if (sourceLine.isActive()) {
                sourceLine.stop(); // ...stop it
            }
            play.setText("PLAY"); // Ensure button is PLAY
        }

        // Now try for a stream and a line
        try {
            AudioInputStream newSource = AudioSystem.getAudioInputStream(soundFile);

            if (newSource.markSupported()) {
                newSource.mark(Integer.MAX_VALUE); // mark the start for later reset
            }

            AudioFormat format = newSource.getFormat(); // Get the audio format
            DataLine.Info sourceInfo = new DataLine.Info(SourceDataLine.class, format);
            if (AudioSystem.isLineSupported(sourceInfo)) { // If the line type is supported
                // Get a new line
                sourceLine = (SourceDataLine) AudioSystem.getLine(sourceInfo);
                bufferSize = (int) (format.getFrameSize() * format.getFrameRate() / 2.0f);
                sourceLine.open(format, bufferSize); // Open the line
                source = newSource; // New line is OK so save it
                soundData = new byte[bufferSize]; // Create the buffer for read
                oldFilename = filename; // Save the current file name
            } else {
                JOptionPane.showMessageDialog(null, "Line not supported", "Line NotSupported", JOptionPane.WARNING_MESSAGE);
                soundChoice.setSelectedItem(oldFilename); // Restore the old selection
            }
        } catch (UnsupportedAudioFileException e) {
            JOptionPane.showMessageDialog(null, "File not supported", "Unsupported File Type", JOptionPane.WARNING_MESSAGE);
            soundChoice.setSelectedItem(oldFilename);
        } catch (LineUnavailableException e) {
            JOptionPane.showMessageDialog(null, "Line not available", "Line Error", JOptionPane.WARNING_MESSAGE);
            soundChoice.setSelectedItem(oldFilename);
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "I/O Error creating stream", "I/O Error", JOptionPane.WARNING_MESSAGE);
            soundChoice.setSelectedItem(oldFilename);
        }
    }

    // Start playing the current file
    public void startPlay() {
        if (sourceLine == null) {// Verify we have a line
            JOptionPane.showMessageDialog(null, "No line available", "Play Problem", JOptionPane.WARNING_MESSAGE);
            return;
        }
        thread = new Thread(this); // Create the playing thread
        playing = true; // Set the control to true
        thread.start(); // Start the thread
    }

    // Stop playing the current file
    public void stopPlay() {
        playing = false;
    }

    // The playing thread
    public void run() {
        sourceLine.start(); // Start the line
        int byteCount = 0; // Bytes read
        try {
            while (playing) { // Continue while true
                byteCount = source.read(soundData, 0, soundData.length); // Read the stream

                if (byteCount == -1) { // If it's the end of input
                    if (source.markSupported()) {
                        source.reset(); // ...put it back to the start
                        sourceLine.drain(); // Play what is left in the buffer
                        playing = false; // Reset the thread control
                    } else {
                        sourceLine.drain(); // Play what is left in the buffer
                        playing = false; // Reset the thread control
                        source.close();
                        newSound((String) soundChoice.getSelectedItem());
                    }
                    break; // then stop playing
                }
                sourceLine.write(soundData, 0, byteCount); // Write the array to the line
            }
        } catch (IOException e) { // For the stream read operation
            System.err.println(e);
        }
        sourceLine.stop(); // Stop the line
        play.setText("PLAY"); // Reset the button text
    }
}

Java , ,

Mise à jour de l’application URLPinger

19/03/2010
Commentaires fermés

URLPinger, petite application qui se met dans le systray (icônes en bas à droite sous Windows) à été mis à jour !

La version 0.3 permet de personnaliser le temps d’attentes entre deux vérifications de l’URL.

La version 0.4 permet de ne pas perdre la définition de ses services lors de la fermeture / réouverture de l’application. (Les paramètres sont stockés dans le répertoire utilisateur).


java1 Télécharger
URLPinger.jar (539)

Lire les articles sur cette application.

Java , , ,

Digester Factory

22/09/2009
Commentaires fermés

This is a DigesterFactory class that load a XML file into an object using an other XML rule file.

I like this way of loading java object from a XML file, because it’s not intrusive, you just have to give it a rule file that define the way of loading object.



import java.io.File;
import java.io.IOException;
import java.net.URL;

import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;
import org.xml.sax.SAXException;

/**
 * Digester Factory
 * This load a Java object from a XML file using Digester framework
 *
 * @author Gabriel Dromard
 */
public class DigesterFactory {
	/*
	public static Root loadRoot(File input) throws SAXException, Exception {
		// Create the digester instance
		Digester digester = new Digester();

		// Activate or not the DTD checking
		digester.setValidating( false );

		// This is needed because digester is sending errors directly to output without raising exceptions othervise
		//digester.setErrorHandler(new DefaultSAXErrorHandler());
		digester.setErrorHandler(new ErrorHandler() {
			public void error(SAXParseException exception) throws SAXException { throw exception; }
			public void fatalError(SAXParseException exception) throws SAXException { throw exception; }
			public void warning(SAXParseException exception) throws SAXException { throw exception; }
		});

		// Parsing rules
		digester.addObjectCreate( "myxml", Root.class );
		//digester.addSetProperties( "descriptor", "type", "type" );
		//digester.addSetProperties( "myxml/a/b", new String [] {"type", "target", "header"} , new String [] {"outputType", "outputTarget", "header"} );

		digester.addObjectCreate( "myxml/a", A.class );
		digester.addSetProperties( "myxml/a", "name", "name" );
		digester.addSetProperties( "myxml/a/b", "name" , "bname" );
		digester.addSetNext( "myxml/a", "setA");

		digester.addObjectCreate( "myxml/a/c", C.class );
		digester.addSetProperties( "myxml/a/c", new String [] {"name", "value"} , new String [] {"name", "value"} );
		digester.addBeanPropertySetter("myxml/a/c", "description");
		digester.addSetNext( "myxml/a/c", "addC");

		return (Root)digester.parse( input );
	}
*/

	/**
	 * Load an object from a XML file unsing digester framwork
	 * @param input The data input file defining the Java Object
	 * @param rules The rules input file defininf the digester rules for loading this Java Object
	 * @return Return an instance of the a Java Object (defined in rule file)
	 * @throws SAXException Can be thrown while parsing files.
	 * @throws Exception Can be MalformedURLException or IOException for the input or rules files.
	 * @see DigesterFactory#load(File, URL)
	 * @see DigesterFactory#load(URL, URL)
	 */
	public static Object load(File input, File rules) throws SAXException, IOException {
		Digester digester = DigesterLoader.createDigester(rules.toURI().toURL());
		return digester.parse(input);
	}

	/**
	 * Load an object from a XML file unsing digester framwork
	 * @param input The data input URL defining the Java Object
	 * @param rules The rules input URL defining the digester rules for loading this Java Object
	 * @return Return an instance of the a Java Object (defined in rule file)
	 * @throws SAXException Can be thrown while parsing files.
	 * @throws Exception Can be MalformedURLException or IOException for the input or rules files.
	 * @see DigesterFactory#load(File, URL)
	 * @see DigesterFactory#load(File, File)
	 */
	public static Object load(URL input, URL rules) throws SAXException, IOException {
		Digester digester = DigesterLoader.createDigester(rules);
		return digester.parse(input.openStream());
	}

	/**
	 * Load an object from a XML file unsing digester framwork
	 * @param input The data input file defining the Java Object
	 * @param rules The rules input URL defining the digester rules for loading this Java Object
	 * @return Return an instance of the a Java Object (defined in rule file)
	 * @throws SAXException Can be thrown while parsing files.
	 * @throws Exception Can be MalformedURLException or IOException for the input or rules files.
	 * @see DigesterFactory#load(URL, URL)
	 * @see DigesterFactory#load(File, File)
	 */
	public static Object load(File input, URL rules) throws SAXException, IOException {
		Digester digester = DigesterLoader.createDigester(rules);
		return digester.parse(input);
	}

	public static void main(String[] args) {
		if (args.length == 2) {
			try {
				//Root o = loadRoot(new File( "input.xml" ));
				//Object o = load(new File("input.xml"), new File("digester-input-rules.xml"));
				Object o = load(new File(args[0]), new File(args[1]));
				/*Display resulting beans*/
				System.out.println("=================================");
				System.out.println(o.toString());
				System.out.println("=================================");
			} catch( SAXException saxEx) {
				System.err.println("Error in XML parsing: "+saxEx.getMessage());
			} catch( Exception exc ) {
				exc.printStackTrace(System.err);
			}
		} else {
			System.out.println("Usage: java "+DigesterFactory.class.getName()+" [XML input file] [XML rule]");
		}
	}
}

Java , ,

Exemple/Tutoriel: Utiliser un agent java …

14/09/2009
Commentaires fermés

Même s’il n’existe pas beaucoup de documentation sur cette possibilité offerte dans Java depuis le JDK 1.5, il existe de bon articles comme cette introduction de « Soft qui peut » ainsi que celle de Xebia.

En condensé, un JavaAgent est déployé sous forme de jar (contenant un Manifest spécifique: Premain-Class: my.package.MyAgent) et utilisé via une option donnée à la JVM (-javaagent:path/mayagent.jar).Voir la documentation Sun pour plus de détails sur les options.

Un Agent  Java est un composant qui s’interconnecte entre la machine virtuelle Java et le logiciel. Il est appelé à chaque chargement d’une classe. Il peut donc écouter tous les appels. Son utilisation la plus simple et la plus courante est le profiling, logging …

Il peut également être utilisé pour faire de l’AOP (Programmation orientée Aspect).

Ici je vous propose une implémentation d’un agent permettant de mettre en œuvre un petit outil de monitoring en utilisant l’AOP. Lire la suite…

Java , , , ,

Un serveur qui tombe …

22/07/2009
Commentaires fermés

Vous voulez écouter vos serveur web pour vérifier qu’ils soient bien disponible ? URLPinger.jar (539) est une petite application fait pour !

Ecrite en Java, elle se loge dans le ‘Systray’ (barre des taches). Vous pourrez y ajouter des services qui écoute une URL, et vous serez informé dès que l’URL n’est plus accessible !

Elle est même en mesure de suivre l’historique des états du service web ! (pour les services qui tombent souvent ça peut-être utile)

Java ,

La premiére du JUG Toulousain

12/05/2009
Commentaires fermés

Bonjour !

Juste, un petit post pour vous rappeler que c’est ce soir à 18h à l’Université Paul Sabatier que le JUG Toulousain fait sa première conférence.

A programme nous écouterons Bruno Marchesson (consultant sénior Valtech) qui nous parlera du framework GWT, puis Sylvain Wallez (CTO Goojet) qui traitera des sujets relatifs aux développements sur mobile (JavaME).

A ce soir.

Java , , ,

Le Test Driven Development (ou TDD pour les intimes)

08/04/2009

Qu’est que le TDD ? Bonne question ?

Prenons un petit exemple de réalisation d’une méthode en suivant la méthode du TDD (Test Driven Developpement ou en français le développement piloté par les tests).

Lire la suite…

Java , , , , ,

Que d’outils pour inciter à un code ‘de qualité’ !

08/04/2009

eclipseTestNG, EclEmma, Checkstyle, sont des outils intéressant à mettre dans notre boite à outil qu’est Eclipse !

Le plugin TestNG, un concurrent sérieux de JUnit qui se base sur les annotations, permet de développer des tests unitaires. Et le plugin EclEmma permet de visualiser très rapidement la couverture de notre test écrit à l’aide de TestNG (il fonctionne également avec JUnit).

Les actions de sauvegardes d’eclipse, peuvent elle aussi nous permettre de réaliser certaine taches/actions avant la sauvegarde, comme l’ajout du mot clef ‘final’ sur les attributs de méthode, formater le code, organiser les import…

Java , , , , ,

Une très petite application

11/11/2008
Commentaires fermés

Après avoir écris un petit post sur comment télécharger un album picasaweb … quelques mois ont passés et iPhoto (sur mac) à été mis à jours et permet d’orénavant de s’abonner à un flux RSS.

Pour les Windowsiens je conseille très vivement Picasa 2.

Malheureusement, certaine personnes, comme ma belle grand mère n’a pas une version récente de Mac et n’a pas pu privilégier des mises à jour d’iPhoto.

J’ai donc pris un peu de temps pour développer une très petite application (Picasaweb Album Downloader) permettant de télécharger l’ensemble d’un album picasaweb.

Cette petite application est dévelopée en Java, elle peut donc être utilisée aussi bien sur windows que sur Mac.

Je serais heureux que vous me laissiez un petit commentaire pour me dire que vous l’utilisez et si vous en êtes satisfait.

Java, Mac , , , , , , , ,