IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres Java Discussion :

[AspectJ] Comment Gérer les héritages en Aspect


Sujet :

Autres Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [AspectJ] Comment Gérer les héritages en Aspect
    Bonjour,
    Tout d’abord merci pour le tutoriel sur AspectJ il est très intéressant, et aide beaucoup.
    Cependant un problème n’est pas souvent abordé : Celui des héritages de classes qu’on intercepte. Ca tombe mal c’est le mien..

    Voici mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class InternalCartoParser extends AbstractInternalAntlrParser {
     
         private GrammarAccess myGrammar;
     
         public final EObject ruleLigneSdt() throws RecognitionException {
    	EObject current = null;
     
             setCurrentLookahead(); 
             resetLookahead(); 
     
    	return current;  // Just as an example  
    	}
    }
    Les méthodes setCurrentLookahead(), resetLookahead sont des méthodes de la classe mère AbstractInternalAntlrParser et sont protected.

    Voici mon aspect (j’intercepte donc la méthode ruleLigneSdt de la classe InternalCartoParser) Mon aspect est en privileged, j’ai donc accès à tout ce qui est privé dans la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
            privileged aspect InternalParser {
          	   declare parents: InternalCartoParser extends
    AbstractInternalAntlrParser;
     
                pointcut ruleLigneSdt(InternalCartoParser c):
    execution(EObject         
    org.xtext.example.parser.antlr.internal.InternalCartoParser.ruleLigneSdt())
    && target(c) ;
     
    	EObject around(InternalCartoParser c): ruleLigneSdt(c) {
                  System.out.prinln("Start of Aspect class");
                  CartoGrammarAccess grammarAccessLocal = c.grammarAccess
                  EObject current = new EObject();
                  setCurrentLookahead(); // WARNING
                  resetLookahead(); // WARNING
                  System.out.prinln("End of Aspect class");
                  return current;    
    	}
            }
    J’obtiens un warning au niveau de mon setCurrenLookahead: "this
    affected type is not exposed to the weaver:
    org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser (needed for
    privileged access) [Xlint:typeNotExposedToWeaver]"

    J’ai tenté la technique “declare parents”, pour l’héritage mais sans succès toujours ce problème. Je n’arrive pas à atteindre les méthodes de ma classe mère…

    Si quelqu’un a une idée…
    Merci d’avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Le problème ne semble pas venir du "declare parent" absent ou non, mais de "inpath" : http://dev.eclipse.org/newslists/new.../msg00650.html

    Essaie d'ajouter la bibliothéque comprenant le parent, dans le inpath en plus du classpath.

    A plus

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Hello

    Merci pour la réponse. J'étais tombé sur l'idée du inpath, mais appliquée à mon cas ça ne marche pas. En effet ma library est composée d'enormément de classe, et est en quelque sorte la colonne vertebrale de mon projet.

    -Tout d'abord, c'est pas possible de mettre dans le inpath et dans le buildpath une meme library : "duplicated ..." je me rappelle plus du message.
    - Lorsque j'enleve du buildPath et que je la met dans le inpath, j'ai tous mes problemes d'imports, de références qui apparaissent... (ref screen shot)

    Ce qu'il faut savoir (je me trompe peut être avec cette manière de faire) j'ai mis mon .aj dans mon projet java (que j'ai préalablement converti en projet aspect).

    A l'heure qu'il est, j'ai fait de la reflection pour atteindre mes méthodes, et attributs mais c'est très très lourd...
    Images attachées Images attachées  

  4. #4
    Invité
    Invité(e)
    Par défaut
    En fait j'aurais une question :
    Est-ce que tu compiles toutes les classes à instrumenter ? ou veux-tu aussi faire du load-time weaving ?
    Là le problème semble être que tu cehrches à instrumenter une bibliothèque tierce qui est déjà compilée (si je ne m'abuse).

    J'ai aussi du mal à saisir ton exemple : tu veux remplacer complètement la méthode appelée et ignorer la méthode d'origine ? (je ne vois proceed nulle part).
    ensuite la méthode ruleLigneSdt existe dans la classe parente ? si oui alors je commence à comprendre ce qu'est le problème :
    il intercepte aussi le pointcut de la classe parente mais ne peux pas instrumenter (vu qu'elle se trouve dans une bibliothèque déjà compilée).
    En plus je trouve bizarre le target utilisé dans un pointcut execution, pourquoi pas utiliser this plutôt que target ? Ça devrait être pareil dans ce cas (vu que dans le cas d'un execution, tu est déjà dans la méthode donc target == this en toute logique).

    Sinon ben je sèche un peu, faudrait que je teste ça moi même

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je compile tout d'un coup, normalement. Je ne sais pas ce que c'est qu'un load-time weaving.
    Je désire en effet remplacer completement une méthode. C'est donc pour ça que je fais un around, je souhaite ignorer la méthode d'origine. Pour proceed et this, pourquoi veux tu que j'en mette? La méthode LigneSdt existe dans la classe que j'intercepte oui. Mais pas dans la classe mère.
    Le problème est que certaines méthodes appelées dans ma classe interceptée, sont des méthodes de ma classe mère, tout comme des attribut de ma classe mère sont utilisés dans ma classe interceptés.

    Et donc le message de warning apparait. J'ai reussi à résoudre le problème avec Reflection à l'heure qu'il est. Mais je passe d'un fichier de 150 lignes à 350 lignes jonché de try catch.

    Je changerai lundi le this et le target (je ne suis plus au travail) Je t'informerai du résultat.

    merci pour ton temps en tout cas

    Antoine

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par laffonda Voir le message
    Bonjour,
    Tout d’abord merci pour le tutoriel sur AspectJ il est très intéressant, et aide beaucoup.
    Cependant un problème n’est pas souvent abordé : Celui des héritages de classes qu’on intercepte. Ca tombe mal c’est le mien..

    Voici mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class InternalCartoParser extends AbstractInternalAntlrParser {
     
         private GrammarAccess myGrammar;
     
         public final EObject ruleLigneSdt() throws RecognitionException {
    	EObject current = null;
     
             setCurrentLookahead(); 
             resetLookahead(); 
     
    	return current;  // Just as an example  
    	}
    }
    Les méthodes setCurrentLookahead(), resetLookahead sont des méthodes de la classe mère AbstractInternalAntlrParser et sont protected.

    Voici mon aspect (j’intercepte donc la méthode ruleLigneSdt de la classe InternalCartoParser) Mon aspect est en privileged, j’ai donc accès à tout ce qui est privé dans la classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
            privileged aspect InternalParser {
          	   declare parents: InternalCartoParser extends
    AbstractInternalAntlrParser;
     
                pointcut ruleLigneSdt(InternalCartoParser c):
    execution(EObject         
    org.xtext.example.parser.antlr.internal.InternalCartoParser.ruleLigneSdt())
    && target(c) ;
     
    	EObject around(InternalCartoParser c): ruleLigneSdt(c) {
                  System.out.prinln("Start of Aspect class");
                  CartoGrammarAccess grammarAccessLocal = c.grammarAccess
                  EObject current = new EObject();
                  setCurrentLookahead(); // WARNING
                  resetLookahead(); // WARNING
                  System.out.prinln("End of Aspect class");
                  return current;    
    	}
            }
    J’obtiens un warning au niveau de mon setCurrenLookahead: "this
    affected type is not exposed to the weaver:
    org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser (needed for
    privileged access) [Xlint:typeNotExposedToWeaver]"

    J’ai tenté la technique “declare parents”, pour l’héritage mais sans succès toujours ce problème. Je n’arrive pas à atteindre les méthodes de ma classe mère…

    Si quelqu’un a une idée…
    Merci d’avance
    quel problème en fait ?
    Un warning n'est pas un problème en soi…

    ce qu'il vous dit dans ce cas-ci c'est que "setCurrentLookahead()" et "resetLookahead()" sont des méthodes d'une classe qui ne peut être "weaved" et ceci probablement parce qu'elle est liée à votre application sous forme de jar.

    Mais comme dans ce que vous montrez, il n'y a pas de pointcut sur ces méthodes : en quoi est-ce un problème ?

    Si vous désirez appliquer AspectJ sur des classes qui sont dans un jar dont vous n'avez pas les sources : il faut dézipper le jar et ajouter les .class à votre projet…
    la compilation produira des nouvelles .class… que vous pourrez ré-assembler ensuite dans une nouvelle version du jar initial…

  7. #7
    Invité
    Invité(e)
    Par défaut
    Salut,

    Ok j'ai eu une illumination cette nuit sur l'origine du warning : un privileged aspect donne accès aux variables et méthodes internes de la classe, seulement pour la super classe qu'il ne peut pas weaver (instrumenter) car déjà compilée, le compilateur AspectJ te donne un warning en te disant surement que tu auras pas vraiment accès à tout.

    Quand je parlais de load-time weaving, c'est une fonctionnalité qui permet d'instrumenter une classe au runtime lorsqu'elle est chargée par la machine virtuelle. L'avantage est justement que tu n'as pas besoin de tout compiler toi même avec le compilo AspectJ, l'inconvénient est au niveau des performances comme on peut s'en douter.

    Voilà j'espère avoir éclaici ton problème.

    A plus

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Hello

    La piste de George7 est effectivement la bonne : mon "privileged aspect" bénéficie de visibilité sur la classe aspectisée, mais pas sur sa classe mère, qui est elle située dans une librairie déjà compilée. Le warning est donc explicable en ce sens, et nous pourrions le tolérer en tant que tel.

    Cependant à l'exécution, les lignes de log démontrent clairement que l'exécution s'arrête sur toute ligne de code présentant ce warning, avec une stacktrace du type :

    0 [Worker-0] ERROR org.eclipse.xtext.ui.core.editor.reconciler.XtextReconcilerUnitOfWork - Parsing in reconciler failed.
    org.eclipse.xtext.parser.ParseException: java.lang.NoSuchMethodError: org.xtext.example.parser.antlr.internal.InternalCartoParser.ajc$privMethod$parser_InternalParser$org_eclipse_xtext_parser_antlr_AbstractInternalAntlrParser$setCurrentLookahead()V
    at org.xtext.example.parser.antlr.CartoParser.parse(CartoParser.java:37)
    at org.eclipse.xtext.parser.antlr.AbstractAntlrParser.parse(AbstractAntlrParser.java:51)
    at org.eclipse.xtext.parser.antlr.AbstractAntlrParser.doParse(AbstractAntlrParser.java:34)
    at org.eclipse.xtext.parser.antlr.AbstractAntlrParser.doParse(AbstractAntlrParser.java:1)
    at org.eclipse.xtext.parser.AbstractParser.parse(AbstractParser.java:27)
    at org.eclipse.xtext.parser.SwitchingParser.parse(SwitchingParser.java:49)
    at org.eclipse.xtext.resource.XtextResource.doLoad(XtextResource.java:151)
    at org.eclipse.xtext.linking.lazy.LazyLinkingResource.doLoad(LazyLinkingResource.java:43)
    at org.eclipse.xtext.resource.XtextResource.reparse(XtextResource.java:82)
    at org.eclipse.xtext.ui.core.editor.reconciler.XtextReconcilerUnitOfWork.process(XtextReconcilerUnitOfWork.java:59)
    at org.eclipse.xtext.ui.core.editor.reconciler.XtextReconcilerUnitOfWork.process(XtextReconcilerUnitOfWork.java:1)
    at org.eclipse.xtext.concurrent.IUnitOfWork$Void.exec(IUnitOfWork.java:36)
    at org.eclipse.xtext.concurrent.IStateAccess$AbstractImpl.modify(IStateAccess.java:57)
    at org.eclipse.xtext.ui.core.editor.model.XtextDocument.modify(XtextDocument.java:146)
    at org.eclipse.xtext.ui.core.editor.reconciler.XtextDocumentReconcileStrategy.reconcile(XtextDocumentReconcileStrategy.java:27)
    at org.eclipse.xtext.ui.core.editor.reconciler.XtextReconciler.run(XtextReconciler.java:196)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
    Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodError: org.xtext.example.parser.antlr.internal.InternalCartoParser.ajc$privMethod$parser_InternalParser$org_eclipse_xtext_parser_antlr_AbstractInternalAntlrParser$setCurrentLookahead()V
    at org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser.parse(AbstractInternalAntlrParser.java:345)
    at org.xtext.example.parser.antlr.CartoParser.parse(CartoParser.java:34)
    ... 16 more
    Caused by: java.lang.NoSuchMethodError: org.xtext.example.parser.antlr.internal.InternalCartoParser.ajc$privMethod$parser_InternalParser$org_eclipse_xtext_parser_antlr_AbstractInternalAntlrParser$setCurrentLookahead()V
    at org.xtext.example.parser.antlr.internal.InternalCartoParser.ruleLigneSdt_aroundBody1$advice(InternalCartoParser.java:115)
    at org.xtext.example.parser.antlr.internal.InternalCartoParser.ruleLigneSdt(InternalCartoParser.java:1)
    at org.xtext.example.parser.antlr.internal.InternalCartoParser.ruleModel(InternalCartoParser.java:141)
    at org.xtext.example.parser.antlr.internal.InternalCartoParser.entryRuleModel(InternalCartoParser.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)


    Nous ne cherchons pas àaspectiser ces méthodes, mais simplement à appeler des méthodes éventuellement privées de la classe mère. Nos tentatives à ce jour :
    - Ajouter le jar de la classe mère au inpath : cela provoque des erreurs, car le jar est également présent dans le classpath pour d'autres besoins
    - Supprimer le jar du build path et ne l'ajouter qu'au inpath : nos autres classes necessitant ce jar ne comiplent plus
    - Faire appel aux méthodes de la classe mère par introspection / reflection. Cela fonctionne mais alourdit considérablement le code, d'où notre recherche de solution alternative et plus propres.

    Tout feedback sur une expérience similaire serait grandement apprécié.

    Merci par avance.

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par laffonda Voir le message
    Nous ne cherchons pas àaspectiser ces méthodes, mais simplement à appeler des méthodes éventuellement privées de la classe mère.
    Çà revient au même…

    -> essayer en dézippant le JAR et en ajoutant les .class dans votre projet sous forme d'un nouveau dossier de fichiers sources…

Discussions similaires

  1. [Framework] Comment gérer les aspects transactionnels ?
    Par dyngry dans le forum Spring
    Réponses: 4
    Dernier message: 14/05/2010, 13h45
  2. Réponses: 2
    Dernier message: 08/07/2005, 10h40
  3. [C#/SQL] Comment gérer les exceptions d'une Procédure stockée ?
    Par thomas_strass dans le forum Accès aux données
    Réponses: 10
    Dernier message: 06/07/2005, 10h40
  4. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h02
  5. Comment gérer les espaces blancs?
    Par Lambo dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/05/2003, 09h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo