tp_injection contribution

Programmation Avancée

Modérateur : Douin

Répondre
Douin
Messages : 214
Inscription : 18 mars 2009 15:46

tp_injection contribution

Message par Douin » 10 janv. 2017 11:01

Bonjour,

En question2 du tp_injection, il vous est demandé de contribuer à la base d'exemples significatifs pour ce tp et à destination de vos successeurs

Vous pourrez contribuer jusqu'au mois d'avril, et dès la correction, je mettrai en ligne un corrigé (à base de properties...)

Bonne contribution

Douin
Messages : 214
Inscription : 18 mars 2009 15:46

Re: tp_injection contribution

Message par Douin » 10 janv. 2017 17:05

Re-Bonjour,

Juste pour développer l'idée pour une contribution du tp_injection

Au tp3 nous avions plusieurs implémentations de la même interface, ci-dessous une seule classe de tests unitaires quelque soit l'implémentation testée, il suffit simplement de changer le fichier de configuration en indiquant la classe à tester

c'est un essai à valider

à suivre...

Code : Tout sélectionner

bean.id.24=pile
pile.class=question1.Pile1
#pile.class=question1.Pile2

package question1;

import java.util.*;

/**  Essai d'une classe de tests unitaires pour plusieurs implémentations
 * d'une même interface, ici PileI
 *   Le fichier de configuration de femtoContainer contient
 * l'implémentation à tester.
 */

public class PileNTest extends junit.framework.TestCase{
  private PileI pile;
  
  protected void setUp() throws Exception{
    ApplicationContext ctx = Factory.createApplicationContext();
    pile = (PileI) ctx.getBean("pile");
    // à la place de pile = new Pile1();
    // ou            pile = new Pile2();
    // etc...
  }
  
  
	public void testPile() throws Exception{
	  pile.empiler(3);
	  pile.empiler(2);
	  assertEquals(2,pile.depiler());
	  assertEquals(3,pile.depiler());
	}
	
}


package question1;

public interface PileI{
 
  public void empiler(int i);
  public int depiler();
}
package question1;

import java.util.Stack;

public class Pile1 implements PileI{
  private Stack<Integer> stk;
  public Pile1(){
    this.stk = new Stack<Integer>();
  }
  public void empiler(int i){
    stk.push(i);
  }
  public int depiler(){
    return stk.pop();
  }
}
package question1;

import java.util.LinkedList;

public class Pile2 implements PileI{
  private LinkedList<Integer> stk;
  public Pile2(){
    this.stk = new LinkedList<Integer>();
  }
  public void empiler(int i){
    stk.push(i);
  }
  public int depiler(){
    return stk.pop();
  }
}


Douin
Messages : 214
Inscription : 18 mars 2009 15:46

Re: tp_injection contribution

Message par Douin » 10 janv. 2017 18:07

Une autre idée pour apporter votre contribution

Ci-dessous le patron décorateur, utilisé pour les piles, les décorations sont issues du fichier de configuration ...

à suivre...

Code : Tout sélectionner

bean.id.24=pile
pile.class=question1.Pile1
#pile.class=question1.Pile2

# PileI pile = new Deco1Pile(new Deco2Pile(new Pile1())); 
bean.id.25=deco1
deco1.class=question1.Deco1Pile
deco1.property.1=pile
deco1.property.1.param.1=deco2

bean.id.26=deco2
deco2.class=question1.Deco2Pile
deco2.property.1=pile
deco2.property.1.param.1=pile

package question1;

public abstract class DecorateurPile implements PileI{
  private PileI pile;

  public DecorateurPile(PileI pile){
    this.pile = pile;
  }
  public DecorateurPile(){}
  public void setPile(PileI pile){
    this.pile = pile;
  }

  public void empiler(int i){
    pile.empiler(i);
  }

  public int depiler(){
    return pile.depiler();
  }
}

package question1;

public class Deco1Pile extends DecorateurPile{

    public Deco1Pile(PileI pile){
        super(pile);
    }
    public Deco1Pile(){super();}
    public void empiler(int i){
      super.empiler(i*2);
    }
    public int depiler(){
      return super.depiler()/2;
    }
    
}
package question1;
public class Deco2Pile extends DecorateurPile{

    public Deco2Pile(PileI pile){
        super(pile);
    }
    
    public Deco2Pile(){super();}
    
    public void empiler(int i){
      super.empiler(i*4);
    }
    
    public int depiler(){
      return super.depiler()/4;
    }
    
}


Douin
Messages : 214
Inscription : 18 mars 2009 15:46

Re: tp_injection contribution

Message par Douin » 11 janv. 2017 19:58

Une autre idée, le patron chaine de responsabilités, la chaine est construite dans la configuration...

Code : Tout sélectionner

bean.id.28=chain
chain.class=question1.LogHandler
chain.property.1=successor
chain.property.1.param.1=seuil_10
#chain.property.1.param.1=trace

bean.id.29=seuil_10
seuil_10.class=question1.SeuilHandler
seuil_10.property.1=successor
seuil_10.property.1.param.1=seuil_50
seuil_10.property.2=seuil
seuil_10.property.2.param.1=10

bean.id.30=seuil_50
seuil_50.class=question1.SeuilHandler
seuil_50.property.1=successor
seuil_50.property.1.param.1=seuil_100
seuil_50.property.2=seuil
seuil_50.property.2.param.1=50

bean.id.31=seuil_100
seuil_100.class=question1.SeuilHandler
seuil_100.property.1=successor
seuil_100.property.1.param.1=trace
seuil_100.property.2=seuil
seuil_100.property.2.param.1=100

bean.id.32=trace
trace.class=question1.TraceHandler
trace.property.1=successor
trace.property.1.param.1=null


package question1;


// voir le patron chain of responsability
public abstract class Handler<D>{
    private Handler<D> successor;

    public void setSuccessor(Handler<D> successor){
      this.successor = successor;
    }
    
    public boolean handleRequest(D data){
      if(successor!=null)
        return successor.handleRequest(data);
      else
        return false;
      }
    
}

package question1;


public class LogHandler<D> extends Handler<D>{

   public boolean handleRequest(D data){
     System.out.println("log: " + data);
     return super.handleRequest(data);
    }
}

package question1;




public class SeuilHandler extends Handler<Integer>{
  private int seuil;
  
  public void setSeuil(int seuil){
    this.seuil = seuil;
  }

  @Override
   public boolean handleRequest(Integer data){

     if(data>seuil){
       System.out.println("seuil " + seuil + " dépassé : " + data);
     }
     return super.handleRequest(data);
  }
  
}

package question1;


public class TraceHandler<D> extends Handler<D>{

   public boolean handleRequest(D data){
     System.out.println("trace : " + data);
     return super.handleRequest(data);
    }
}


package question1;


public class CoRTest extends junit.framework.TestCase{

  private static ApplicationContext ctx;
  static{
    ctx = Factory.createApplicationContext();
  }

  public void testHandler() throws Exception{
    Handler<Integer> chain = (Handler) ctx.getBean("chain");
    chain.handleRequest(8);
    chain.handleRequest(100);
    chain.handleRequest(30);
    chain.handleRequest(60);
    chain.handleRequest(1000);
    chain.handleRequest(3);
  }


}




Douin
Messages : 214
Inscription : 18 mars 2009 15:46

Re: tp_injection contribution

Message par Douin » 18 janv. 2017 12:55

Bonjour,

Êtes vous partant pour que j’intègre votre réponse au tp_injection et vos exemples, au projet bluej qui sera distribué en solution l'an prochain ?

Je pensais déclarer votre nom de famille comme nom du paquetage java, quelque chose comme m_dupont.question1

Bonne journée

als
Messages : 10
Inscription : 29 déc. 2016 19:02

Re: tp_injection contribution

Message par als » 18 janv. 2017 20:35

Bonjour Mr Douin,
Oui vous pouvez inclure ma soumission.
Cordialement.

Alemu S.

David Bertrand
Messages : 34
Inscription : 20 oct. 2016 13:10

Re: tp_injection contribution

Message par David Bertrand » 18 janv. 2017 20:54

Bonjour,

vous avez ma bénédiction !

J'ai profité que les soumissions étaient encore ouvertes pour vous soumettre une nouvelle version : un second parser pour le contexte injecte un fichier yaml avec une structure légèrement améliorée, mais incompatible avec la première version du parser.

Bien cordialement,

David Bertrand.

florent.fourcade
Messages : 1
Inscription : 21 janv. 2017 14:40

Re: tp_injection contribution

Message par florent.fourcade » 21 janv. 2017 14:44

Bonjour,

Ok pour inclure ma soumission.

Je viens de voir que l'on peut contribuer jusqu'en avril, j'essaierai donc si j'ai le temps d'effectuer quelques améliorations.

Cordialement,

Florent Fourcade

Douin
Messages : 214
Inscription : 18 mars 2009 15:46

Re: tp_injection contribution

Message par Douin » 31 janv. 2017 11:24

Bonjour,

Une contribution possible par la mise en œuvre de l'injection par mutateurs d'un bean (cf cours 4_MVC quand Nombre devient Bean ...)

(ci dessous avec différents essais syntaxiques, notamment l'affectation de tableaux de types primitifs ou d'objets)

Code : Tout sélectionner

package question1;

// https://docs.oracle.com/javase/tutorial/javabeans/writing/index.html
// https://www.jmdoudoux.fr/java/dej/chap-javabean.htm

import java.awt.*;
import javax.swing.*;
import java.beans.*;

public class UnBean implements java.io.Serializable {

  private int longueur;

  private PropertyChangeSupport propertySupport;
  private VetoableChangeSupport vetoableSupport;
  
  public UnBean(){
    propertySupport = new PropertyChangeSupport(this);
    vetoableSupport = new VetoableChangeSupport(this);
  }
  
 
  public int getLongueur() {
    return longueur;
  }

  public void setLongueur(int longueur) {
    int oldLongueur = this.longueur;
    this.longueur = longueur;
    try{
      vetoableSupport.fireVetoableChange("longueur",oldLongueur,longueur);
    }catch(PropertyVetoException e) {    
      this.longueur = oldLongueur;
    }
    if ( oldLongueur != this.longueur ) {   
      propertySupport.firePropertyChange("longueur",oldLongueur, longueur);
    }
  }

  public Double[] notes;
  public Double[] getNotes() {return notes;}
  public void setNotes(Double[] notes) {this.notes = notes;}
  
  public float[] notesF;
  public float[] getNotesF() {return notesF;}
  public void setNotesF(float[] notesF) {this.notesF = notesF;}
  
  public int[] notesI;
  public int[] getNotesI() {return notesI;}
  public void setNotesI(int[] notesI) {this.notesI = notesI;}
  
  public boolean[] notesB;
  public boolean[] getNotesB() {return notesB;}
  public void setNotesB(boolean[] notesB) {this.notesB = notesB;}

  
  public char[] notesC;
  public char[] getNotesC() {return notesC;}
  public void setNotesC(char[] notesC) {this.notesC = notesC;}

  
  // modif set pour femtoContainer
  public void setPropertyChangeListener(PropertyChangeListener listener){
    addPropertyChangeListener(listener);
  }
  
  public void addPropertyChangeListener(PropertyChangeListener listener) {
    propertySupport.addPropertyChangeListener(listener);
  }
 
  public void removePropertyChangeListener(PropertyChangeListener listener) {
    propertySupport.removePropertyChangeListener(listener);
  }
  
  public void setVetoableChangeListener(VetoableChangeListener listener){
    addVetoableChangeListener(listener);
  }
  public synchronized void addVetoableChangeListener(VetoableChangeListener listener) {
    vetoableSupport.addVetoableChangeListener(listener);
  }

  public synchronized void removeVetoableChangeListener(VetoableChangeListener listener) {
    vetoableSupport.removeVetoableChangeListener(listener);
  } 
  
    private  Handler<?>[] handlers;
  
   public void setHandlers(Handler<?>[] handlers){
  //public void setHandlers(Handler... handlers){
    this.handlers = handlers;
  }
  public Handler<?>[] getHandlers(){
    return this.handlers;
  }
  

  public static void main(String[] args){
    UnBean bean = new UnBean();
    PropertyChangeListener listener1 = new FaceBeanPropertyChangeListener();
    bean.addPropertyChangeListener(listener1);
    PropertyChangeListener listener2 = new FaceBeanPropertyChangeListener();    
    bean.addPropertyChangeListener(listener2);
    
    bean.setLongueur(10);
    bean.setLongueur(100);
  }
 
}

Code : Tout sélectionner

package question1;
import java.beans.*;

public class FaceBeanPropertyChangeListener 
    implements PropertyChangeListener, VetoableChangeListener{
      
  public int valeurLongueurRecue=0;
  
  @Override
  public void propertyChange(PropertyChangeEvent e) {
    String propertyName = e.getPropertyName();
    if ("longueur".equals(propertyName)) {
      System.out.println("longueur a changé : " + e.getNewValue());
      valeurLongueurRecue = (Integer)e.getNewValue();
    } //else if ("focusedWindow".equals(propertyName) {
    //...
    //}
  }
   @Override
  public void vetoableChange(PropertyChangeEvent e) throws PropertyVetoException {
    String propertyName = e.getPropertyName();
    if ("longueur".equals(propertyName)) {
      if( ((Integer)e.getNewValue()) <=0){
        System.out.println("longueur a un veto : " + e.getNewValue());
        throw new PropertyVetoException("valeur négative ou nulle",e);
      }
      valeurLongueurRecue = (Integer)e.getNewValue();
    } //else if ("focusedWindow".equals(propertyName) {
    //...
    //}
  }
}

Code : Tout sélectionner

 public void testFirePropertyChange(){
    ApplicationContext ctx = Factory.createApplicationContext("question1/configBean.props","question1.FileSystemTextApplicationContext");
    UnBean bean = (UnBean) ctx.getBean("unBean");
    bean.setLongueur(10);
    PropertyChangeListener listener1 = (PropertyChangeListener) ctx.getBean("listener1");
    assertTrue(listener1 instanceof FaceBeanPropertyChangeListener);
    FaceBeanPropertyChangeListener listener = (FaceBeanPropertyChangeListener)listener1;
    
    assertEquals(10, listener.valeurLongueurRecue);
    assertEquals(10, bean.getLongueur());
    bean.setLongueur(-1); // un véto a été installé
    assertEquals(10, bean.getLongueur());
     
  }

Code : Tout sélectionner


# cf.https://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html
bean.id.1=unBean
unBean.class=question1.UnBean
unBean.property.1=longueur
unBean.property.1.param.1=100
unBean.property.2=notes
unBean.property.2.param.1=100 2.0 12.0
unBean.property.3=notesF
unBean.property.3.param.1=100 2.0 12.0
unBean.property.4=notesI
unBean.property.4.param.1=100 20 12 3
unBean.property.5=handlers
unBean.property.5.param.1=seuil_10 seuil_100 seuil_1000
unBean.property.6=PropertyChangeListener
unBean.property.6.param.1=listener1
unBean.property.7=PropertyChangeListener
unBean.property.7.param.1=listener2
unBean.property.8=VetoableChangeListener
unBean.property.8.param.1=listener1


bean.id.2=listener1
listener1.class=question1.FaceBeanPropertyChangeListener

bean.id.3=listener2
listener2.class=question1.FaceBeanPropertyChangeListener


bean.id.4=seuil_10
seuil_10.class=question1.SeuilHandler
seuil_10.property.1=successor
seuil_10.property.1.param.1=seuil_100
seuil_10.property.2=seuil
seuil_10.property.2.param.1=10

bean.id.5=seuil_100
seuil_100.class=question1.SeuilHandler
seuil_100.property.1=successor
seuil_100.property.1.param.1=seuil_1000
seuil_100.property.2=seuil
seuil_100.property.2.param.1=100

bean.id.6=seuil_1000
seuil_1000.class=question1.SeuilHandler
seuil_1000.property.1=successor
seuil_1000.property.1.param.1=null
seuil_1000.property.2=seuil
seuil_1000.property.2.param.1=100

Douin
Messages : 214
Inscription : 18 mars 2009 15:46

Re: tp_injection contribution

Message par Douin » 06 févr. 2017 17:51

Bonjour,

Une contribution possible par la mise en œuvre de la question 4 de l'examen de janvier....

Code : Tout sélectionner

package pubsub.question4;
import question1.ApplicationContext; // femtoContainer
import question1.Factory;
import pubsub.question1.*;
import java.util.*;

public class TestsAvecInjections extends junit.framework.TestCase{

  public void testPublishSubscribe() throws Exception{
    ApplicationContext ctx = Factory.createApplicationContext("pubsub/question4/README.TXT","question1.FileSystemTextApplicationContext");
    PublishSubscribeI pubsub = (PublishSubscribeI) ctx.getBean("pubsub");
    assertNotNull(pubsub);
    assertEquals(3,pubsub.getSubscribers("meteo").size());
    Publisher pub2 = (Publisher)ctx.getBean("pub2");
    assertEquals("meteo",pub2.getTopic());
    assertEquals(3,pub2.publish("beau temps"));
    
    Message message = new Message("test","20°C");
    assertEquals(3, pubsub.publish("temperature",message));
    
    Message msg1 = (Message)ctx.getBean("msg1");
    assertEquals(3, pubsub.publish("meteo",msg1));
    
    Message msg_error = (Message)ctx.getBean("msg_error");
    assertEquals(0, pubsub.publish("meteo",msg_error));
    
  }
}

Code : Tout sélectionner

package pubsub.question4;

import pubsub.question1.*;
import java.util.*;

public class TestsSansInjections extends junit.framework.TestCase{

 
        
  public void testPublishSubscribe() throws Exception{
    PublishSubscribeI pubsub = new PublishSubscribeImpl();
    assertNotNull(pubsub);
    
    Publisher pub2 = new Publisher();
    pub2.setName("p2");
    pub2.setTopic("meteo");
    pub2.setPubsub(pubsub);
    Publisher pub3 = new Publisher();
    pub3.setName("p3");
    pub3.setTopic("meteo");
    pub3.setPubsub(pubsub);
    Publisher pub4 = new Publisher();
    pub4.setName("p4");
    pub4.setTopic("temperature");
    pub4.setPubsub(pubsub);
    
    Subscriber sub1 = new Subscriber();
    sub1.setName("s1");
    sub1.setTopics(new String[]{"meteo","temperature"});
    sub1.setPubsub(pubsub);
    Subscriber sub2 = new Subscriber();
    sub2.setName("s2");
    sub2.setTopics(new String[]{"meteo"});
    sub2.setPubsub(pubsub);
    Subscriber sub3 = new Subscriber();
    sub3.setName("s3");
    sub3.setTopics(new String[]{"meteo"});
    sub3.setPubsub(pubsub);
    Subscriber sub4 = new Subscriber();
    sub4.setName("s4");
    sub4.setTopics(new String[]{"temperature"});
    sub4.setPubsub(pubsub);
    Subscriber sub5 = new Subscriber();
    sub5.setName("s5");
    sub5.setTopics(new String[]{"temperature"});
    sub5.setPubsub(pubsub);
    
    assertEquals(3,pubsub.getSubscribers("meteo").size());
    assertEquals("meteo",pub2.getTopic());
    assertEquals(3,pub2.publish("beau temps"));
    
    pubsub.question1.Message message = new pubsub.question1.Message("test","20°C");
    assertEquals(3, pubsub.publish("temperature",message));
    
    Message msg1 = new Message();
    msg1.setSource("p1");
    msg1.setContent("il pleut");
    assertEquals(3, pubsub.publish("meteo",msg1));
    
    Message msg_error = new Message();
    msg_error.setSource("p2");
    msg_error.setContent("error");
    assertEquals(0, pubsub.publish("meteo",msg_error));
    
    
  }
}

Code : Tout sélectionner


bean.id.1=pubsub
pubsub.class=pubsub.question4.PublishSubscribeImpl

bean.id.2=pub2
pub2.class=pubsub.question4.Publisher
pub2.property.1=name
pub2.property.1.param.1=p2
pub2.property.2=topic
pub2.property.2.param.1=meteo
pub2.property.3=pubsub
pub2.property.3.param.1=pubsub

bean.id.3=pub3
pub3.class=pubsub.question4.Publisher
pub3.property.1=name
pub3.property.1.param.1=p3
pub3.property.2=topic
pub3.property.2.param.1=meteo
pub3.property.3=pubsub
pub3.property.3.param.1=pubsub

bean.id.4=pub4
pub4.class=pubsub.question4.Publisher
pub4.property.1=name
pub4.property.1.param.1=p4
pub4.property.2=topic
pub4.property.2.param.1=temperature
pub4.property.3=pubsub
pub4.property.3.param.1=pubsub


bean.id.5=sub1
sub1.class=pubsub.question4.Subscriber
sub1.property.1=name
sub1.property.1.param.1=s1
sub1.property.2=topics
sub1.property.2.param.1=meteo temperature
sub1.property.3=pubsub
sub1.property.3.param.1=pubsub


bean.id.6=sub2
sub2.class=pubsub.question4.Subscriber
sub2.property.1=name
sub2.property.1.param.1=s2
sub2.property.2=topics
sub2.property.2.param.1=meteo
sub2.property.3=pubsub
sub2.property.3.param.1=pubsub


bean.id.7=sub3
sub3.class=pubsub.question4.Subscriber
sub3.property.1=name
sub3.property.1.param.1=s3
sub3.property.2=topics
sub3.property.2.param.1=meteo
sub3.property.3=pubsub
sub3.property.3.param.1=pubsub


bean.id.8=sub4
sub4.class=pubsub.question4.Subscriber
sub4.property.1=name
sub4.property.1.param.1=s4
sub4.property.2=topics
sub4.property.2.param.1=temperature
sub4.property.3=pubsub
sub4.property.3.param.1=pubsub

bean.id.9=sub5
sub5.class=pubsub.question4.Subscriber
sub5.property.1=name
sub5.property.1.param.1=s5
sub5.property.2=topics
sub5.property.2.param.1=temperature
sub5.property.3=pubsub
sub5.property.3.param.1=pubsub

bean.id.10=msg1
msg1.class=pubsub.question1.Message
msg1.property.1=source
msg1.property.1.param.1=p1
msg1.property.2=content
msg1.property.2.param.1=il pleut

bean.id.11=msg_error
msg_error.class=pubsub.question1.Message
msg_error.property.1=source
msg_error.property.1.param.1=p2
msg_error.property.2=content
msg_error.property.2.param.1=error






Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité