2009-12-30 7 views
1

Je veux permettre aux utilisateurs de fournir une classe groovy avec une propriété qui est une fermeture fichier-sélecteur que je passe à la tâche « copie » de AntBuilder:test pour la fermeture groovy vide?

class Foo { 
    def ANT = { fileset(dir:'/tmp/tmp1') } 
    } 

dans mon code, je prends la propriété ANT comme « Fant » et passer à Ant:

ant.copy(todir:'/tmp/tmp2', fAnt) 

Cela fonctionne - mais, si l'utilisateur passe dans une fermeture vide (def ANT = {}) ou avec un sélecteur qui ne sélectionne pas quoi que ce soit (peut-être le jeu de fichiers dir n'existe pas) alors ça explose. J'ai essayé d'entourer la copie de fourmi avec un try-catch pour attraper le InvokerInvocationException, mais d'une manière ou d'une autre l'exception arrive de toute façon ... pendant que je dépiste cela, y a-t-il un moyen de relire le contenu d'une Closure groovy comme une chaîne? pour tester si c'est vide?

Répondre

1

En résumé: Non. Vous ne pouvez pas décompiler une fermeture de manière significative au moment de l'exécution. S'il est fourni par l'utilisateur, la fermeture peut même être une classe Java. Réponse longue: Si vous voulez faire beaucoup de travail, vous pourriez être en mesure de le faire, mais cela ne vaut probablement pas le coup. L'analyseur Groovy fait partie de l'API, donc si vous avez accès à la source, vous pouvez théoriquement examiner l'AST et déterminer si la fermeture est vide. Regardez dans la classe SourceUnit.

Cependant, cela ne vaut certainement pas la peine. Il est préférable d'intercepter l'exception et d'ajouter un message utile comme "Vous avez peut-être réussi une fermeture vide ou un ensemble de fichiers non valide".

0

Un mystère résolu - l'exception que j'ai besoin d'attraper est org.apache.tools.ant.BuildException - donc je peux juste attraper ça pour piéger les erreurs, mais la question originale demeure - y a-t-il un moyen d'examiner le contenu d'une fermeture? ?