ROME – Aggrégation de plusieurs flux (5/8)

July 20, 2007

L’aggrégation de plusieurs flux est extrèmement simple à mettre en place. La classe SyndFeed représentant un flux possède des accesseurs/modifieurs qui permettent de créer le flux directement dans le code. L’exemple ci-dessous crée un flux de type RSS 1.0, lui assigne un titre, une description, un auteur et un lien.

SyndFeed aggrFeed = new SyndFeedImpl ();
aggrFeed.setFeedType ("rss_1.0");
aggrFeed.setTitle("Flux aggrégé");
aggrFeed.setDescription ("Flux aggrégé");
aggrFeed.setAuthor ("Marwan KHELIF");
aggrFeed.setLink ("http://wiki.mkhelif.fr/");

Les propriétés d’un objet SyndFeed peuvent être modifiées, assignées à un autre flux, supprimer, etc… Les accesseurs modifient directement la référence de l’objet et non la valeur, ainsi modifier les entrées d’un flux auquel on a assigné les entrées d’un autre flux aura pour effet d’altérer les deux flux.

L’exemple suivant présente comment insérer les entrées d’un flux en train d’être lu, dans un flux d’un autre format :

package com.mkhelif.rome.exemples;

import java.io.PrintWriter;
import java.net.URL;

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

import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.io.SyndFeedOutput;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;

/**
 * Aggrégateur de flux (de différents types) dans un unique flux au format spécifié.
 *
 * @author Marwan KHELIF
 */
public class Aggregator {

    public static void main (String[] args) {
        if (args.length < 2) {
            printUsage ();
        } else {
            try {
                String outputType = args [0];

                SyndFeed feed = new SyndFeedImpl ();
                feed.setFeedType (outputType);

                feed.setTitle ("Flux aggrégé");
                feed.setDescription ("Flux aggrégé");
                feed.setAuthor ("Marwan KHELIF");
                feed.setLink ("http://www.mkhelif.fr/");

                List entries = new ArrayList ();
                feed.setEntries (entries);

                for (int i = 1 ; i < args.length ; i++) {
                    URL inputUrl = new URL (args[i]);

                    SyndFeedInput input = new SyndFeedInput ();
                    SyndFeed inFeed = input.build (new XmlReader (inputUrl));

                    entries.addAll (inFeed.getEntries ());
                }

                SyndFeedOutput output = new SyndFeedOutput ();
                output.output (feed, new PrintWriter (System.out));
            } catch (Exception ex) {
                ex.printStackTrace ();
            }
        }
    } // main ()

    private static void printUsage () {
        System.out.println ("Aggrégateur de flux (de différents types) dans un unique flux au format spécifié.");
        System.out.println ("Usage: java Aggregator
<format> <url>");
        System.out.println ("Formats valides : rss_0.9, rss_0.91, rss_0.92, rss_0.93,");
        System.out.println ("                  rss_0.94, rss_1.0, rss_2.0, atom_0.3");
        System.out.println ();
    } // printUsage ()
} // Aggregator
</url></format>