Erreur dans les actions possédant des attributs sur un objet développé en Rhino

Tags: #<Tag:0x00007fdd4a190a08>

Bonjour,

Quand je lance en V5 une action qui possède des attributs, j’obtiens une erreur, en revanche, la même action ne pose pas de Pb en V4 :

L’action :

Le code :

ImmoCompany.aideDeclarationTva = function(pt) {
	// On récupère les paramètre de date de début et de fin saisies par l'utilisateur lors de l'écran de confirmation de l'action
	this.getGrant().setParameter("aideDeclarationTvaStartDtParam", pt.get("aideDeclarationTvaStartDt"));
	this.getGrant().setParameter("aideDeclarationTvaEndDtParam", pt.get("aideDeclarationTvaEndDt"));	

Erreur :

2020-10-14 17:03:44,358 ERROR [com.simplicite.util.RhinoScriptInterpreter] SIMPLICITE|https://e3m.simplicite.io:10163||ECORESC002|designer|com.simplicite.util.RhinoScriptInterpreter|ImmoCompany.aideDeclarationTva||Erreur évaluation script: ImmoCompany
    org.mozilla.javascript.EcmaError: TypeError: Cannot find function get in object {"confirm":true,"name":"ImmoCompany_AideDeclarationTva-A","id":"1277","type":79,"enabled":true}. (ImmoCompany#329) in ImmoCompany at line number 329
    line 324: return true;
    line 325: };
    line 326: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    line 327: ImmoCompany.aideDeclarationTva = function(pt) {
    line 328: // On récupère les paramètre de date de début et de fin saisies par l'utilisateur lors de l'écran de confirmation de l'action
    error329: this.getGrant().setParameter("aideDeclarationTvaStartDtParam", pt.get("aideDeclarationTvaStartDt"));
    line 330: this.getGrant().setParameter("aideDeclarationTvaEndDtParam", pt.get("aideDeclarationTvaEndDt"));
    line 331:

Pourriez-vous me dire ce qui ne va plus dans mon code svp ?
Merci d’avance.
Abed.

Une évolution récente a été de pouvoir envoyer des documents dans les champs de confirmation (et pas juste des champs textes) donc avoir l’action elle-même dans les paramètres du callback (et pas juste des paires field/value textuels).

En Rhino : je suppose que votre “pt” est une Action et non plus une Map<String,String>, et qui faut faire des pt.getConfirmField(…) pour récupérer les contenus saisis.

En java : l’invoke method supporte les 2 syntaxes (l’ancienne avec un message deprecated), ce n’est pas faisable en Rhino qui reste un interpréteur dynamique (pas de “method not found / fallback”). On en revient toujours au fait que rester en Rhino depuis la V3 vous posera de plus en plus de soucis au niveau du code de vos objets V5.

Extrait de la release note V5

public String myAction(Action action) {
    String lang = getGrant().getLang();
    String param = action.getConfirmField(lang, "myStringField").getValue();
    ObjectField myDocField = action.getConfirmField(lang, "myDocField");
    DocumentDB doc = myDocField.getDocument();
    AppLog.info(getClass(), "myAction", "DOCUMENT " + doc, getGrant());
    if (doc!=null) {
        // Uploaded tmp file
        java.io.File file = doc.getUploadFile();
        AppLog.info(getClass(), "myAction", "DOCUMENT FILE " + file, getGrant());
        // do something with the document...
        // Remove the file from /tmp directory
        file.delete();
    }
    return null;
}

Toute la documentation sera bientôt en Java en V5.
Rhino étant à réserver aux expressions simples dans le paramétrage (champ calculé, contrainte…).

Merci @francois pour votre retour.

On en revient effectivement au fait que quand on a commencé à travailler sur Simplicité, nous avons eu le droit à une formation en Rhino, nous avons même été conseillé et encouragé à coder en Rhino, alors que la version à l’époque était la V4 (et donc java était apparemment déjà d’actualité chez vous) !
Maintenant qu’on a mis beaucoup de moyen pour développer notre appli en Rhino, aujourd’hui ce n’est pas à l’ordre du jour de faire cette migration. On le fera sûrement un jour, mais en attendant, nous devons donc rester en Rhino.

Pour cela, et pour revenir à notre pb bloquant d’attribut d’action causé par la V5, effectivement si je mets la syntaxe que vous proposez (getConfirmField), le pb est résolu en V5, mais pas en V4.

Code modifié :

ImmoCompany.aideDeclarationTva = function(pt) {
	// On récupère les paramètre de date de début et de fin saisies par l'utilisateur lors de l'écran de confirmation de l'action
    var lang =this.getGrant().getLang();
	this.getGrant().setParameter("aideDeclarationTvaStartDtParam", pt.getConfirmField(lang,"aideDeclarationTvaStartDt").getValue());
	this.getGrant().setParameter("aideDeclarationTvaEndDtParam", pt.getConfirmField(lang,"aideDeclarationTvaEndDt").getValue());	
	var ret = '';
	ret = this.invokePrint("ImmoCompanyAideDeclarationTva-PDF");
	if (ret != true) return ret + "\n" + this.getGrant().T("ERREUR_CONTACTER_ADMIN");
};

Erreur en V4 :

    org.mozilla.javascript.EcmaError: TypeError: Cannot find function getConfirmField in object {aideDeclarationTvaStartDt=2020-10-01, aideDeclarationTvaEndDt=2020-10-14}. (ImmoCompany#331) in ImmoCompany at line number 331

Auriez-vous donc une solution svp de comment on peut faire pour avoir un code qui fonctionne aussi bien en V4 qu’en V5 pour ce cas ?

Merci d’avance pour votre compréhension et de votre aide.
Abed.

Il doit être possible de tester le type de l’objet genre:

if (pt instance of com.simplicite.util.Action) {
    // v5
} else {
    // v4
}

A tester.

Pour ce qui est de Rhino,ce qu’on dit c’est qu’en V5 il va devenir progressivement deprecated. Ca veut dire concrètement qu’on sera en mode “best effort” pour maintenir la possibilité de s’en servir mais qu’il pourra y avoir des incompatibilités ou des limitations.

Pour mémoire la V4 va être maintenue 3 ans à dater de la sortie de la V5 donc rien ne vous oblige non plus à migrer en V5 tout de suite. A l’issue de ses 3 ans de maintenance long terme, la V4 ne disparaitra pas mais nous ne ferons plus de correctif de manière proactive ni en dehors d’une prestation ad hoc.

Merci @david
La ligne :

if (pt instance of com.simplicite.util.Action) {

semble incomplète/incorrecte, j’ai une erreur dans l’éditeur de code. Est-ce qu’il manque qq chose ? dois-je remplacer qq chose ?

instanceof pas instance of désolé.

Merci beaucoup @david, ça marche nickel !

Ce débat n’a pas de sens.
Vous avez été formé au moment de la transition où Java n’était pas encore stable alors que Rhino l’était depuis la V3. Ca va faire au moins 3 ans, depuis le monde a tourné et pas que chez Simplicité.

Rhino vous posera des problèmes bloquants alors que Java permet de beaucoup mieux gérer les deprecated / compatibilité ascendante entre les versions (vous auriez eu un warning et pas un plantage, et on aurait tous passé moins de temps sur ce sujet).

Comptez l’effort à maintenir du code obsolescent vs migrer petit à petit vos composants.
Passer de Rhino à Java n’est pas si compliqué car 80% du code est déjà du java (tous les accesseurs), c’est plus robuste et plus performent. Vous pouvez changer objet par objet.

Et sur le besoin que votre code migré en V5 marche toujours en V4, là vous allez dans le mur car j’en déduis que vous allez importer des modules V5 en V4 et reciproquement.

Personne ne fait ça sinon on serait tous resté sous simplicité v1.