/**
 * 'Vehicule'  Vérif. de l'interface 'Cloneable' et du traitement d'exception par 'try ... catch' 
 * @author   (c) ~/2A  - H. Nguyen-Phu
 * @version  1.0  02.10.2007  
 * @since     0.9  Sept. 2001 (cf. Valembois I. et Millecam L. - Java autoformation,  p. 69,  éd. ellipses, 2001)
 */
public class Vehicule  { 
// public class Vehicule  implements Cloneable  {

	/** 'jo' est  un alias de 'System.out' pour soulager la frappe ... */
    static final java.io.PrintWriter jo = new java.io.PrintWriter(System.out, true);
	String marque;
	String immatriculation;
	Moteur moteur;
	
	Vehicule( ) { marque = "Dacia";  immatriculation = "530 AAA 75";  moteur = new Moteur(); }
	
	Vehicule( String marque, String imm, Moteur m) {
		this.marque = marque;  immatriculation = imm;  
		moteur = new Moteur(m); }
	
	Vehicule(Vehicule V)                      { 
		marque = V.marque;
		immatriculation = V.immatriculation; 
		moteur = new Moteur(V.moteur);    	}
	
	public String toString()  {
		return "\n"+ marque + ", No d'imm.: " + immatriculation + " \t" + moteur.toString();         	}
	// public Object clone()  {
	public Vehicule clone()  {
		try {
			Vehicule uneAuto = (Vehicule) super.clone();
			uneAuto.moteur = (Moteur) moteur.clone();
			return uneAuto;
		} catch (CloneNotSupportedException erreur)  {
			return null;
		  }
	}
   /**  Méthode principale publique 'main(...)'.
	*   @param args Tableau de chaînes pour ligne de commande éventuelle
	*/ 
	public static void main(String args[])  {
        jo.println("\nVehicule: Test de l'interface 'Cloneable' et de 'try ... catch'\n--------  MAJ: 18h20  02.10.2007 - A ANALYSER & DEBOGUER !\n");
		
		Moteur mote1 = new Moteur();
		Moteur mote2 = new Moteur("moteur hybride", 150);
		Moteur mote3 = mote2.clone();
		jo.println(mote1); jo.println(mote2); jo.println(mote3);
		
		Vehicule v1 = new Vehicule();	
		Vehicule v2 = new Vehicule("Lexus", "1070 ABC 54", mote3);
		Vehicule v3 = v1.clone();
		Vehicule v4 = new Vehicule(v2);
		jo.println(v1);	jo.println(v2);	
		if (v3 != null) jo.println(v3);	
		else jo.println("\nv3 = L.N.I. ('null' en Java) !!");
		jo.println(v4);	
		
		es.attente(); 
  }
}

class Moteur  implements Cloneable {
//class Moteur  {
	String typeMoteur;
	int chevalVapeur;
	
	Moteur()   {	
		typeMoteur = "moteur à essence";	
		chevalVapeur = 110; 	}
	
	Moteur(String type, int chevaux)  {	
		typeMoteur = type;	
		chevalVapeur = chevaux;		}
		
	Moteur(Moteur M)  {	
		typeMoteur = new String(M.typeMoteur);	
		chevalVapeur = M.chevalVapeur; 	}
	
	public String toString()  {
		return "- "+ typeMoteur + " - " + chevalVapeur + " ch"; 	}
		
	public Moteur clone()  {
		try {
			return (Moteur) super.clone();
		} catch (CloneNotSupportedException error)  {
			return null;
		  }
	}
}
