Groupe 2 (communication)

Date de création : 23 septembre 2004
Dernière modification :
Diffusion : internet

Canal Mailto

Exemple d'utilisation du canal Mailto normal.

Exemple téléchargeable ici

Présentation

Notre canal d'exemple affiche un menu proposant d'accéder à un formulaire d'envoi de mail, avec des options différentes. Ce qui nous proposons ici est bien sûr qu'un exemple d'utilisation.

Les varialbes nécessaires

Il faut déclarer une variable qui précise si le canal servant est en cours d'exécution ou pas.

private boolean servantAvailable = false;

Il faut également répertorié le canal servant dans une variable lorsqu'il est actif de façon à accéder à ses méthodes.

private IServant servant; 

Instanciation et utilisation du servant

Il faut instancier le canal quand vous en avez besoin. Le plus simple est de tester un paramètre dans la méthode setRuntimeData. Dans notre si le paramètre "action" est valué à "mailto". Alors le canal "maître" sait qu'il va passer la main au servant.

if ( (!servantAvailable)
   && (rd.getParameter("action")!=null) 
   && (rd.getParameter("action").equals("mailTo"))
   ){
   	servantAvailable = true;
   }

Une fois que le servant est noté comme "actif", créons une nouvelle instance du canal servant.

 if (servantAvailable){    
   
   try {
   	Class servantClass = Class.forName("org.esupportail.portal.channels.CMailTo.CMailToServant");
   	// Instanciation du servant
   	Object servantObj = servantClass.newInstance();
   	servant = (IServant)servantObj;
   	} catch (ClassNotFoundException e) {
   		LogService.log(LogService.ERROR,"CTestMailtoNormal::setRuntimeData:ClassNotFoundException    : "+e.getMessage());
   	} catch (InstantiationException e) {
   		LogService.log(LogService.ERROR,"CTestMailtoNormal::setRuntimeData:InstantiationException    : "+e.getMessage());
   	} catch (IllegalAccessException e) {
   		LogService.log(LogService.ERROR,"CTestMailtoNormal::setRuntimeData:IllegalAccessException    : "+e.getMessage());
   	} catch (Exception e) {
   		LogService.log(LogService.ERROR,"CTestMailtoNormal::setRuntimeData:Exception    : "+e.getMessage());
   	}

Dès lors, le servant est créé. Il reste maintenant à lui envoyer tous les paramètres du canal maître au canal servant.

 //Passage des paramètres
   servant.setStaticData(staticData);
   servant.setRuntimeData(runtimeData);
  

Il faut tester aussi que le canal servant a fini de s'éxecuter. Pour cela, testez le code retour de la méthode "isFinished" du servant.

   if (servant.isFinished()) {
   	servantAvailable=false;
   } 
}

Maintenant que le servant est bien démarré, vous devez lui donner la main pour l'affichage.

Pour cela, renommez la méthode "renderXML" de votre canal en "myRenderXML".

private void myRenderXML(ContentHandler out) throws PortalException { 

Puis recréez la méthode "renderXML", qui va afficher soit le rendu du canal maître soit le rendu du canal servant.

 public void renderXML(ContentHandler out) throws PortalException {
   if (servantAvailable){
   	servant.renderXML(out);
   }
   else{
   	myRenderXML(out);
   }
 }

Paramétrage du servant

Il est possible de modifier le formulaire d'envoi de mail en positionnant certains paramètres. Dans notre exemple, le menu propose différents cas d'utilisation. En plus de valuer la variable "action" à "mailTo", nous spécifions quel cas d'utilisation nous exécutons.
Juste avant d'envoyer les "runtimeData" au canal servant, créez les attributs du mail que vous voulez préremplir et stockez les dans les "runtimeData".

Un attribut du mail peut avoir 3 caractéristiques :

1 => sa valeur
2 => si l'utilisateur peut modifier cette valeur
3 => si l'utilisateur peut voir cette valeur

Un attribut est donc un tableau de 3 chaînes de caractères.

String[] att = new String[3];
   //destinataire
   att[0] = "sgaudin@univ-nancy2.fr";
   att[1] = "false";
   att[2] = "true";
   runtimeData.setParameterValues(Mail.TO,att);

   //cc
   att = new String[3];
   att[0] = "";
   att[1] = "false";
   att[2] = "false";
   runtimeData.setParameterValues(Mail.CC,att);

   //bcc
   att = new String[3];
   att[0] = "";
   att[1] = "false";
   att[2] = "false";
   runtimeData.setParameterValues(Mail.BCC,att);

   //sujet
   att = new String[3];
   att[0] = "Test de mail";
   runtimeData.setParameterValues(Mail.SUBJECT,att); 

   //sujet
   att = new String[3];
   att[0] = "Message à modifier";
   runtimeData.setParameterValues(Mail.CONTENT,att); 
 

La feuille de style (test.xsl dans notre exemple)

Vous devez mettre un hyperlien dans votre feuille de style (.xsl) pour acceder à l'action d'envoie de mail.

Par exemple dans le menu, un lien va pointer sur l'action "mailTo" qui correspond ici à l'instanciation du canal servant sans paramètre.

<li><a href="{$baseActionURL}?action=mailTo">Formulaire standard</a></li><br/>

Envoi automatique

Au niveau de la method setRuntimeData, il est possible de tester si on a cliqué sur le lien "sendMail". Si c'est le cas, alors on on peut créer un Mail et lui passer les paramètres que l'on veut.

if ( (!servantAvailable)
		&& (rd.getParameter("action")!=null)
		&& (rd.getParameter("action").equals("sendMail"))
		){
		Mail myMail = new Mail();
		myMail.setFrom(staticData.getPerson().getAttribute("mail").toString());
		myMail.setTo("sgaudin@univ-nancy2.fr");
		myMail.setSubject("Test de mail");
		myMail.setContent("message envoyé automatiquement");
Maintenant il faut envoyer le mail.
		try {
			myMail.send();
		} catch (MalFormedMailException e) {
			rd.setParameter("errorSendMail","true");
			log.error("CTestMailToNormal::setRuntimeData : ",e);
		}
	}

Vous remarquerez que dans le cas de l'envoi automatique le servant n'est pas executé. Comme il n'est pas necessaire d'afficher l'interface d'envoi, il est possible d'utiliser directement la methode send de l'objet Mail.