énoncé première session 2007

UE NFP121


QUESTION 1) On demande d'implémenter (classe " Main1 ") l'interface " SujetExamen " ci-dessous dans laquelle les méthodes 'extraire' impriment la liste des méthodes de la classe c soit sur la sortie courante soit dans un flot de sortie choisi. Pour réaliser cette fonctionnalité on utilisera l'introspection offerte par la classe Class et la classe Method.

interface SujetExamen {
      void extraire(Class c) ;
      void extraire(Class c, OutputStream out);
}

exemple de résultat :
SujetExamen 
public abstract void SujetExamen.extraire(java.lang.Class)
public abstract void .SujetExamen.extraire(java.lang.Class,java.io.OutputStream)


QUESTION 2) On demande d'implémenter la classe " Main2 " qui étend la classe " Main1 " de la question 1 pour que l'impression des classes ou interfaces internes éventuelles et de leurs méthodes se fasse également.

une telle situation imbriquée :
public interface Map {
// Basic Operations
   Object put(Object key, Object value);
…
   boolean isEmpty();
…
   public Set keySet();
// Interface for entrySet elements
   public interface Entry {
      Object getKey();
      Object getValue();
      Object setValue(Object value);
   }
}


QUESTION 3) On demande d'implémenter la classe " Fenetre " pour obtenir les résultats de la question 2 dans une fenêtre.

Le nom de la classe à " extraire " est donné dans le champ de la partie supérieure et un clic sur le bouton " extraire " provoque l'impression dans la " JTextArea " en dessous.

Compléter l'implantation ci-dessous pour obtenir le comportement spécifié.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Fenetre extends JFrame{    
    private JTextField nomDeLaClasse = new JTextField("",20);
    private JButton bouton = new JButton("extraire");
    private JTextArea contenu = new JTextArea();
    
    public Fenetre(final SujetExamen main){
        super("question3"); this.setSize(600,400);
        JPanel enHaut = new JPanel();
        enHaut.add(nomDeLaClasse); enHaut.add(bouton);
        this.setLayout(new BorderLayout(5,5));
        this.getContentPane().add("North",enHaut);
        contenu.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(contenu);
        this.getContentPane().add("Center",scrollPane);
        //…..????????
        
        this.setVisible(true);
    }}


QUESTION 4) On souhaite enfin " sérialiser " les méthodes introspectées sous forme xml.

La DTD à respecter est :

DTD à respecter
<!ELEMENT classes (classe)>
<!ELEMENT classe (methode*|classe*)>
<!ATTLIST    classe nom CDATA #REQUIRED>
<!ELEMENT  methode (parametre*)>
<!ATTLIST    methode nom CDATA #REQUIRED>
<!ATTLIST    methode typeRetour CDATA #REQUIRED>
<!ELEMENT parametre EMPTY>
<!ATTLIST    parametre type CDATA #REQUIRED>

exemple concernant l'interface SujetExamen de la question1
<?xml version="1.0" encoding="UTF-8"?>
<classes>
  <classe nom="question1.SujetExamen">
    <methode nom="extraire" typeRetour="void">
      <parametre type="java.lang.Class" />
      <parametre type="java.io.OutputStream" />
    </methode>
    <methode nom="extraire" typeRetour="void">
      <parametre type="java.lang.Class" />
      <parametre type="java.io.Writer" />
    </methode>
    <methode nom="extraire" typeRetour="void">
      <parametre type="java.lang.Class" />
    </methode>
  </classe>
</classes>

Complétez l'implantation ci-dessous pour obtenir cette forme de sérialisation

import java.lang.reflect.Method;
import org.jdom.*;
import org.jdom.output.*;

public class Main4 extends Main2{
   private  org.jdom.Element racine;
   private  org.jdom.Document document;
   private  XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
   
    public void extraire(Class c){
                      // compléter …
    }
   // compléter…
}