2008-10-02 6 views
11

J'ai un assez grand nombre de fichiers source que j'ai besoin d'analyser et d'extraire tous les littéraux de chaîne et de les mettre dans un fichier en tant que vieille constante java jouer.
Pour exemple:Extraire toute la chaîne d'un projet Java

Label l = new Label("Cat"); 

deviendrait:

Label l = new Label(Constants.CAT); 

Et Constants.java je l'aurais:

public final static String CAT = "Cat"; 

je ne veux pas les chaînes à externalisées dans un texte de la propriété fichier.
L'une des raisons est la cohérence et la lisibilité du code.
L'autre est que notre code client utilise GWT, qui ne prend pas en charge le mécanisme de fichier texte de propriété Java.

Je pourrais écrire une sorte d'analyseur (en utilisant peut-être la tâche de remplacement de fourmis)?
Mais je me demandais si un IDE fait déjà ce genre de chose automatiquement.

+0

"notre code client utilise GWT, qui ne supporte pas le mécanisme de fichier texte de propriétés Java": ce n'est pas vrai ... C'est vrai, vous ne pouvez pas charger un fichier de propriétés * directement * du client, mais le client peut faire un appel asynchrone au serveur et le serveur peut renvoyer l'objet Properties (ou les données sous la forme que vous voulez). Vous pouvez * utiliser * les fichiers de propriétés du côté client, il vous reste juste une ou deux étapes à franchir. –

Répondre

9

Pour compléter la réponse de Peter Kelley, vous pourriez envisager pour Eclipse IDE la solution AST.

Vous pouvez alors écrire un programme AST qui analyse votre code source et fait ce que vous voulez.

Un exemple complet est disponible dans ce eclipse corner article, également plus de détails dans eclipse help.
Et vous pouvez trouver quelques exemples dans Listing 5 of the section "Implementation of in-place translation" of Automating the embedding of Domain Specific Languages in Eclipse JDT, aux côtés de multiple examples in GitHub projects.

+0

@Roy, s'il vous plaît partager le résultat. Même je cherche la même chose. Il serait très utile si vous pouviez le partager – Ravisha

+1

@VonC lien de présentation est en baisse !! –

+1

@YajliMaclo Exact, cette présentation n'est plus disponible. J'ai référencé de nouveaux exemples à la place. – VonC

21

Eclipse le fait automatiquement. Cliquez avec le bouton droit sur le fichier, choisissez "Source", puis "Externaliser les chaînes"

Cela ne fait pas exactement ce que vous avez demandé (avoir les chaînes dans un fichier Constants.java comme Strings) mais la méthode utilisée est vraiment très puissante . Il les déplace dans un fichier de propriétés qui peut être chargé dynamiquement en fonction de vos paramètres régionaux. Les avoir dans un fichier source Java séparé comme vous le suggérez signifie que vous aurez TOUTES les langues dans votre application à la fois ou que vous enverrez différentes applications en fonction des paramètres régionaux.

Nous l'utilisons pour nos applications où même les éléments de base doivent être livrés en anglais et en japonais - nos applications plus complexes sont livrées avec 12 langues - nous ne sommes en aucun cas une petite société de développement de logiciels :-).

Si vous faites les voulez dans un fichier Java, malgré les défauts déjà mentionnés, il est beaucoup plus facile d'écrire un programme pour transformer le fichier de propriétés dans un fichier source Java que d'essayer d'extraire les chaînes de source Java de forme libre.

Tout ce que vous devez ensuite faire est de modifier la classe Accessor pour utiliser les chaînes intégrées (dans la classe séparée) plutôt que de les charger au moment de l'exécution.

+0

J'ai déjà vérifié Eclipse et il va déplacer toute la chaîne dans un fichier de propriétés txt, qui est ensuite chargé par Messages.getString(). Ce n'est pas ce que je veux faire. Je veux juste que ma corde soit jouée par le vieux java constant. –

+0

Ce n'est pas une mauvaise idée. Une fois que vous avez ces, vous pouvez rechercher ces modèles et les remplacer avec ce que vous voulez. – ykaganovich

+0

En outre, cette méthode ne reconnaît pas la même chaîne dans le même projet. Je veux que toutes les instances de "Cat" pointent vers Constants.CAT –

1

Il y a de bonnes raisons pour lesquelles vous ne voudriez pas faire cela. Mis à part le fait qu'un tel fichier généré (je ne connaissais pas la fonction eclipse) ne va pas faire la distinction entre les chaînes que vous définissez, par exemple, comme arguments construct dans les classes de test et les choses que vous voulez réellement avoir comme constantes, le plus gros problème est que toutes vos finales statiques publiques vont être compilées dans vos classes, et si vous voulez modifier le comportement des classes, vous devrez modifier non seulement la classe qui contient les constantes, mais tout ce qui s'y rapporte. Je reconnais pleinement ce que dit Pax Diablo.

1

Nous utilisons cette fonction aussi.

Lorsqu'elle est appliquée à un fichier de classe, la fonction "Externaliser les chaînes" créera deux fichiers, une classe Messages.class et un fichier de propriétés messages.properties. Ensuite, il redirigera toutes les utilisations directes des littéraux de chaîne vers un appel à Messages.get (clé de chaîne) et en utilisant la clé que vous avez entrée pour la chaîne dans l'assistant "Chaîne Ext".

BTW: Quel est le problème avec les fichiers de propriétés? Comme il l'a dit, vous pouvez simplement changer le fichier de propriétés et ne pas avoir à changer de classe si vous avez besoin de changer le texte.

Un autre avantage est celui-ci: La façon d'extraire les littéraux de chaîne dans un fichier de propriétés vous laisse libre de traduire la langue source dans n'importe quelle langue sans modifier le code. Le chargeur de fichiers de propriétés charge automatiquement le fichier de langue cible en utilisant le fichier correspondant avec le code iso de la langue. Vous n'avez donc pas à vous soucier de la plate-forme sur laquelle votre code s'exécute, il sélectionnera la langue appropriée (presque) automatiquement. Voir la documentation de la classe ResourceBundle pour savoir comment cela fonctionne en détail.

Questions connexes