2011-09-08 13 views
4

Bonjour je n'étais pas tout à fait sûr de savoir comment nommer cette question, mais je vais vous expliquer pourquoi je suis en train de faire. Tout d'abord, j'ai un dossier qui contient des scripts SQL dans un format spécifique, qui est updateXtoY.sql, où X et Y sont des entiers. Ce dont j'ai besoin, c'est de savoir quel Y est le nombre le plus élevé. (Essentiellement, de savoir qui est le dernier script)ANT: Charger les noms de fichiers et extraire les données à partir des noms de fichiers

Donc, si j'ai dans mon dossier « scripts/» 3 fichiers:

update3to5.sql 
update2to5.sql 
update1to6.sql 

le résultat que je besoin est d'avoir attribuer une propriété « latest.version 'la valeur de 6.

De ce point je peux facilement exécuter le script. Donc, le problème que j'ai est triple:

1- Comment charger les noms de fichiers dans une structure de données.

2- Comment parcourir la structure de données.

3- Comment évaluer chaque nom de fichier afin que je puisse extraire la partie « Y » du fichier et obtenir la valeur la plus élevée. (Je lis sur regex en ce moment)

Je suis nouveau à ANT et je ne suis pas sûr si cela est possible et/ou réalisable.

Merci pour vos suggestions.

+0

pouvez-vous renommer vos fichiers afin que le numéro correspondant est F.E. avant updateTo6from1.sql vous pourriez alors simplement trier par nom de fichier et être fait avec le problème? – Yashima

+0

Eh bien, tout cela doit être fait automatiquement à partir de ANT, donc je ne suis pas sûr une fois que les noms de fichiers sont chargés dans une structure si je peux garantir que le dernier sera le premier élément. – Endo

+0

ça fait longtemps que j'ai utilisé Ant. Vous pouvez toujours implémenter ceci en tant que AntTask dans Java et utiliser votre propre tâche. En général, vous utiliserez probablement un FileSet pour charger vos fichiers, mais il ne semble pas trivial de trier un ensemble de fichiers. – Yashima

Répondre

5

La première partie de la tâche - obtenir les noms de fichiers dans une « structure » est le mieux fait en utilisant un FileSet - dire pour les scripts SQL dans un répertoire appelé scripts:

<fileset dir="scripts" includes="*.sql" id="versions" /> 

Cela crée une fourmi resource collection cela peut être référé à l'aide de l'ID versions. La collection connaît vos fichiers de script SQL.

En utilisant (comme vous le suggérez) un mappeur regexp, nous pouvons convertir l'ensemble des fichiers dans une collection de chaînes, tenant seulement les parties de la version des noms de fichiers:

<mappedresources id="versions"> 
    <fileset dir="scripts" includes="*.sql" /> 
    <regexpmapper from="update.*to(.*).sql" to="\1" /> 
</mappedresources> 

Dans cet exemple versions détient maintenant une 'list', qui serait "5,5,6" pour vos fichiers d'exemple.

Il devient plus compliqué maintenant, car vous devez probablement effectuer un tri numérique sur une liste de chaînes - pour éviter que le tri soit inférieur à 9. Ant est livré avec un interpréteur JavaScript incorporé, donc vous pouvez utiliser que pour trouver le maximum. Une autre option serait d'utiliser la capacité de tri numérique qui ant-contrib a à offrir.

Voici un Javascript « finder max »:

<scriptdef name="numeric_max" language="javascript"> 
    <attribute name="property" /> 
    <attribute name="resources_id" /> 
    <![CDATA[ 
    var iter = project.getReference(
     attributes.get("resources_id") 
    ).iterator(); 

    var max_n = 0.0; 
    while (iter.hasNext()) 
    { 
     var n = parseFloat(iter.next()); 
     if (n > max_n) max_n = n; 
    } 
    project.setProperty(attributes.get("property"), max_n); 
    ]]> 
</scriptdef> 

qui définit une nouvelle entité XML Ant - numeric_max - qui ressemble à une tâche, et peut être utilisé pour trouver le maximum numérique d'une collection de chaînes. Ce n'est pas parfait - il n'y a pas de validation des cordes, et je l'ai utilisé flotteurs plutôt que ints.

La combinaison de cela avec le mappedresources ci-dessus:

<mappedresources id="versions"> 
    <fileset dir="scripts" includes="*.sql" /> 
    <regexpmapper from="update.*to(.*).sql" to="\1" /> 
</mappedresources> 
<numeric_max property="latest.version" resources_id="versions" /> 

<echo message="Latest SQL script version: ${latest.version}." /> 

Quand je lance que vos trois fichiers que je reçois:

[echo] Latest SQL script version: 6. 
+0

Le plus utile. J'apprécie vraiment les explications. J'étais sur le point d'essayer une tâche java ant personnalisée, mais cela fonctionne très bien. – Endo

Questions connexes