DOC JAVA

Date

Exemple1:
		
String d1=2008-11-07T22:13:58.000+01:00,2008-08-15T12:07:58.000+02:00

//methode 1
Calendar cal =  Calendar.getInstance();
cal.set(Integer.parseInt(d1.substring(0, 4)), Integer.parseInt(d1.substring(5, 7)), Integer.parseInt(d1.substring(8, 10)));
Date d =  new Date(cal.getTimeInMillis());
	
//methode2
Locale localeUS = new Locale("en", "US");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD", localeUS);
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));		
Date date = (Date) sdf.parse(dates.substring(0, 10));			

Exmple 2 conversion string->date date->string


public String getDuree() throws ParseException{
		//date:08/10/2012  heure:14:00
		SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy-HH:mm");
		Date dates=formatter.parse(this.date+"-"+this.heure);
		Date datee=formatter.parse(this.date+"-"+this.heureFin);
		Long time=datee.getTime()-dates.getTime();
		
		formatter = new SimpleDateFormat("HH:mm");
		Date date= new Date(time);
		return formatter.format(date);		
	}	

List

package com.gadille.JavaTuto; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class TutoList { public static void main(String[] args) { List listVmstat = new ArrayList(); listVmstat.add("toto"); listVmstat.add("titi"); List qcElements = new ArrayList();; qcElements.add(new qcElement("numero", "0476897875")); qcElements.add(new qcElement("numero", "0476897876")); System.out.println("impressions"); for (int i = 0; i < listVmstat.size(); i++) { System.out.println("listVmstat.get("+i+"):"+listVmstat.get(i)); } System.out.println("\nimpression par iterator"); Iterator it = listVmstat.iterator(); while (it.hasNext()) { System.out.println("it.next():" + it.next()); } System.out.println("\nconversion en tableau"); String[] strList = new String[listVmstat.size()]; for (int i = 0; i < listVmstat.size(); i++) { strList[i]=listVmstat.get(i); } System.out.println("strList[1]:"+strList[1]); for (String msg : listVmstat){ System.out.println("msg"+msg); } for (QCElement qcElement : qcElements){ System.out.println(qcElement.getKey()+"="+qcElement.getValue()); } } } }
impressions listVmstat.get(0):toto listVmstat.get(1):titi impression par iterator it.next():toto it.next():titi conversion en tableau strList[1]:titi

Pour pouvoir utiliser la methode indexOf(Object o) dans une liste si votre liste est composer d'objet non natif il faut redefinir 2 méthode
hashCode: utilisé pour savoir si les objets sont les même en complemnt du egal (par default renvoie l'adresse du pointeur de l'objet)
Donc si on le remplace pas on deux objet a même contenue (deux adresse distinc) ne sont pas egaux
equals: qui est utilise en complemnt du hash pour savoir si les deux objet sont egaux

package fr.francetelecom.AsMetier.Global.Bean;

public class QCElement{
	private String key;
	private String value;

	public  QCElement(String key,String value){
		this.key=key;
		this.value=value;
	}
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}

	//pour faire des recherche dans list on doit implementer le hashCode
	 @Override	
	 public int hashCode() {
		 int hash=0;
		 if (key!=null){
			 hash=key.hashCode();
		 }else if (value!=null){
			 hash=value.hashCode();
		 }if (value!=null & key !=null){
			 hash=(key+value).hashCode();
		 }		 		
		 return hash;
	 }
	 //et le equals
	 @Override
	 public boolean equals(Object obj) {
		 if (obj==null){
			 return false;
		 }else if (obj.getClass() == this.getClass()){
			 QCElement qcElement= (QCElement) obj;
			 if (this.getKey().equals(qcElement.getKey())&&this.getValue().equals(qcElement.getValue())){
				 return true;	 
			 }else{
				 return false;
			 }
		 }else{
			 return false;
		 }		 
	 }
}
StringBuilder/StringBuffer ou Hashtable/HashMap.
Vector est synchronisée et donc thread-safe alors qu’ArrayList ne l’est pas.
Par conséquent, Vector est plus lent qu’ArrayList et ne doit être utilisé qu’en environnement multithreadé.

map

Attention une map ne contient pas de doublons sur les key
	
//access via new for-loop
for(String key : mapA.keySet()) {
    String value = mapA.get(key);
}

for (BeanFiles beanFiles:beanFilesList){
 //profite de l'abssence de doublon
 Map  beanFilesMap= beanFiles.getBeanFiles();
 for(Path path : beanFilesMap.keySet()) {
	BeanFile bf=beanFilesMap.get(path);
	returnBeanFilesMap.put(path,bf);
 }	    
}

regex

Patern matching extracting , Extraction de patern
package com.test; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TestRegex { public static void main(String[] args) { String mapage="du baratin et la flute lionel.gadille@free.fr et encore du baratin"; String mapage2="du baratin et la flute lionel.gadille@free.fr"; //http://gadille.free.fr/doc/scripting/perl/perl.html#Regex \\s(w+@w+\\.\\w\\w)\\w+ System.out.println("g1"); Matcher matcher = Pattern.compile("(\\S+@\\w+.\\w\\w)\\W\\w+").matcher(mapage); if (matcher.find()) { System.out.println("glob:"+matcher.group()); System.out.println("mail:"+matcher.group(1)); } System.out.println("g2"); matcher = Pattern.compile("(\\S+@\\w+.\\w\\w)").matcher(mapage2); if (matcher.find()) { System.out.println("glob:"+matcher.group()); System.out.println("mail:"+matcher.group(1)); } } }

sql db2,mysql

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Date; public class Dtb implements Runnable { String[] dtb; public Dtb() { } public void cleandtb(String[] dtb) { Connection con = mysql(dtb); Statement stmt; try { stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); // ResultSet rs = System.out.println("\tDtb.cleandtb --> delete from object_performances can take 20 min"); stmt.execute("delete from object_performances"); } catch (SQLException e) { e.printStackTrace(); } System.out.println("\tDtb.cleandtb --> clean done"); } public void selectDatte(){ } public Connection mysql(String[] dtb) { Connection con = null; String dtbUrl = dtb[0]; String dtbLogin = dtb[1]; String dtbPassword = dtb[2]; try { Class.forName("com.mysql.jdbc.Driver");// kk mysql con = DriverManager.getConnection(dtbUrl, dtbLogin, dtbPassword); System.out.println(" dtbscheduler --> -- connection a dtb " + dtbUrl + " --"); } catch (SQLException sqle) { System.out.println("testsPreparatio.clean **> SQLException sur :" + dtbUrl + " msg: " + sqle.getMessage()); } catch (Exception e) { System.out.println("testsPreparatio.clean **> Exception sur :" + dtbUrl + " msg: " + e.getMessage()); System.out.println("Exception cause: " + e.getCause()); System.out.println("Exception stackTrace " + e.getStackTrace()); System.out.println("Exception stackTrace " + e.toString()); } return con; } public Connection db2conV8(String[] dtb) { Connection con = null; String dtbUrl = dtb[0]; String dtbLogin = dtb[1]; String dtbPassword = dtb[2]; try { Class.forName("com.ibm.db2.jcc.DB2Driver");// v8 con = DriverManager.getConnection(dtbUrl, dtbLogin, dtbPassword); System.out.println(" dtbscheduler --> -- connection a dtb " + dtbUrl + " --"); } catch (SQLException sqle) { System.out.println("testsPreparatio.clean **> SQLException sur :" + dtbUrl + " msg: " + sqle.getMessage()); } catch (Exception e) { System.out.println("testsPreparatio.clean **> Exception sur :" + dtbUrl + " msg: " + e.getMessage()); System.out.println("Exception cause: " + e.getCause()); System.out.println("Exception stackTrace " + e.getStackTrace()); System.out.println("Exception stackTrace " + e.toString()); } return con; } public Connection db2conV7(String[] dtb) { Connection con = null; String dtbUrl = dtb[0]; String dtbLogin = dtb[1]; String dtbPassword = dtb[2]; try { Class.forName("COM.ibm.db2.jdbc.net.DB2Driver");// v7 con = DriverManager.getConnection(dtbUrl, dtbLogin, dtbPassword); System.out.println(" dtbscheduler --> -- connection a dtb " + dtbUrl + " --"); } catch (SQLException sqle) { System.out.println("testsPreparatio.clean **> SQLException sur :" + dtbUrl + " msg: " + sqle.getMessage()); } catch (Exception e) { System.out.println("testsPreparatio.clean **> Exception sur :" + dtbUrl + " msg: " + e.getMessage()); System.out.println("Exception cause: " + e.getCause()); System.out.println("Exception stackTrace " + e.getStackTrace()); System.out.println("Exception stackTrace " + e.toString()); } return con; } }

Thread

Thread le but

Le but d'un thread et de faire executer pusieur programme en meme temps
C'est util notamentdans le cadre d'un ihm (evite de figer l'interface graphique) ou tous process un peux long
Cela permet d'utiliser plusieur processeur (core 2 duo, phenon ... ) essayer d'utiliser les thread des que posssible
Les trhead ne sont pas souhaitable pour lorsd des axcés a une ressource unique limité en bande passante par exemple un dique dur
En effet la lecture de deux fichiers en concurence entrainerais des depalcement de tete de lecture intempestif (un moteur c'est lent)

Step a

Il existe plusieur facons de faire un thread en voici une implementer Runnable implements Runnable
Implement= implementer ou ecrir sois meme le code
Runnable est une interface elle décrit le code qui doit etre ecrit
package com.gadille.JavaTuto.Thread; public class Actiona implements Runnable { Thread runner; public void launch(){ runner = new Thread(this); runner.start(); } @Override public void run() { System.out.println("Thread -> hello from thread"); System.out.println("Thread -> go sleep"); try { Thread.sleep(5000);//en ms } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread -> wakeup"); } }
Attention palcer le le runner.start() aprés toute vos init sinon les init ce feront parfois avant parfois aprés
Notez bien que je n'est pas appelé run sinon le programme n'aurais pas marcher de maniere concurente
package com.gadille.JavaTuto.Thread; public class ThreadMaina { public static void main(String[] args) { System.out.println("Main -> start"); Actiona ac= new Actiona(); ac.launch(); System.out.println("Main -> end"); } }
Execution
Main -> start
Thread -> hello from thread
Thread -> go sleep
Main -> end
Thread -> wakeup
Notez L'ordre ... si vous suprimé le sleep le Thread ce termine avant car il est trop cour
Comme le changement de context (de Thread) est couteux en temps l'os prefere travaillez par tranche plus ou moins long (#100ms) sur chaque Thread
Donc Sans le spleep le Thread est fini avant le changemetn de context

Step b

Rajout d'un bollean pour controller la fin du thread
Rajout de nbr pour renvoyer une etat d'avencement ici calculler pour faire du pourcentage
if (0 == (i % 10000) && i > 0) nbr+=1; // si i=10 000 alors le modullo de i est different de zero
package com.gadille.JavaTuto.Thread; public class Actionb implements Runnable { boolean finish = false; double a; double b; int purcent=0; public boolean getFinish(){ return finish; } public double getResult(){ return a+b; } public int getPurcent(){ return purcent; } Thread runner; public void launch(){ runner = new Thread(this); runner.start(); } @Override public void run() { System.out.println("Thread -> hello from thread"); for (int i=0;i<1000*1000;i++){ if (0 == (i % 10000) && i > 0) purcent+=1; for (int j=0;j<3;j++){ long arg = 23; a=java.lang.Math.log(arg); b=java.lang.Math.hypot(2, 4); } } System.out.println("Thread -> result done"); finish=true; } }
La presence du sleep est conseillé dans le mains car sinon on utilise enormement de ressource systeme a attendre le thread
Le choix de 1s et un bhon compromits et permet de remonter des info a l'utilisateur
package com.gadille.JavaTuto.Thread; public class ThreadMainb { public static void main(String[] args) { System.out.println("Main -> start"); Actionb ac= new Actionb(); ac.launch(); int purc=0; while (!(ac.getFinish())){ try { Thread.sleep(1000);//en ms } catch (InterruptedException e) { e.printStackTrace(); } if (ac.getNbr()!=purc){ purc=ac.getNbr(); System.out.println("Main --> "+purc+"%"); } } System.out.println("Main -> Result:"+ac.getResult()); } }
Voici le resultat de 2 run (adapter le j en focntion de votre proc)
Run1
Main -> start
Thread -> hello from thread
Main --> 27%
Main --> 54%
Main --> 81%
Thread -> result done
Main --> 99%
Main -> Result:7.607630170928729
Run2
Main -> start
Thread -> hello from thread
Main --> 28%
Main --> 60%
Main --> 92%
Thread -> result done
Main --> 99%
Main -> Result:7.607630170928729

Javax Mail , Thunderbird

Le propos est d'envoyer une message html avec une image intégré dans la page html
Ceci est un exemple de base on peut ensuite rajoutté des styles ect
		String host = "toto.tata.fr";
		Properties props = System.getProperties();
		props.put("mail.smtp.host", host);
		props.put("mail.smtp.port", "25");
		props.put("mail.smtp.auth", "false");
		props.put("mail.smtp.starttls.enable", "false");
		Session session = Session.getInstance(props, null);

		// Define message
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress("toot@free.fr"));
		message.addRecipient(Message.RecipientType.TO, new InternetAddress("toto@hotmail.fr"));
		message.addRecipient(Message.RecipientType.TO, new InternetAddress("toto@free.fr"));
		message.setSubject("Bonjour ceci est un test");
		
		//html
		MimeMultipart multipart = new MimeMultipart("related");
		MimeBodyPart bodyPart = new MimeBodyPart();
		String str = "<html><h1>Hello</h1> avant:<img src=\"cid:ensimag\" alt=\"image erreur\">:apres</html>";
		bodyPart.setContent(str, "text/html");
		multipart.addBodyPart(bodyPart);

		//image
		bodyPart = new MimeBodyPart();
		DataSource ds = new FileDataSource(System.getProperty("user.dir") + "/public/images/ensimag.png");
		bodyPart.setDataHandler(new DataHandler(ds));
		bodyPart.setHeader("MIME-Version", "1.0");
		bodyPart.setHeader("Content-ID", "<ensimag>");		
		bodyPart.setFileName(ds.getName());
		multipart.addBodyPart(bodyPart);

		// Add multipart content to message.
		message.setContent(multipart);

testRoundDouble

private static double round(double v, int sigDigits) { double f = Math.pow(10, Math.ceil(Math.log10(Math.abs(v))) - sigDigits); return Math.round(v/f)*f; }

Annotation

en details ici

@interface

L'annotation @interface permet de definir des tag personalisable
/*
* Juste pour indiquer qu'une methode ou class n'est pas entierement codé
*/
public @interface InProgress { }

@InProgress
public void mamethodepascode(){
 ...
}

testUtils

http://gadille.free.fr/doc/java/testUtils/readmeTestUtils.html

debug

Rajouter a sa comande java les options de debugage
-Xdebug -Xrunjdwp:transport=dt_socket,address=8010,server=y,suspend=n
Si suspend=y cela bloque le programme temps que eclipse ne lui donne pas l'ordre de repartir
Ensuite sous eclipse ouvrir le projet avec le code faire un debug remote application avec le port et le nom du serveur
placer vos break pointe et sa roule
aplicable sur web app, ou appli java ...

Outils Java

decompiller

utiliser javap fournit dans le jdksun

Monitoring

guide oracle

Visuel

jvisualvm et jconsole Permet de faire du monitoring visuel temps reel

Ligne de cmd

jps permet de connetre les jre en cours d'execution avec leur pid a fournir au autre outils
jstat(pour le gc)
jstat -gcutil 32684 1000 7
effectue 7 fois la commande avec un intervalle de 1000ms