1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2005
    Messages : 215
    Points : 435
    Points
    435

    Par défaut Modifier automatiquement une variable statique lors de l'enregistrement du fichier

    Bonjour à tous,
    Actuellement sur Mars.2 (mais je peux évoluer si nécessaire), je cherche à faire en sorte que lors d'un enregistrement d'un fichier .java, je positionne une constante à la date du jour (ou avec un numéro de version ou autre, je suis ouvert). L'idée est de pouvoir identifier facilement en ouvrant le fichier .class généré dans quelle version de fichier je suis.

    Il est fréquent d'avoir à vérifier sur des applications client quelle version de fichier est présente (notre système de patch ayant parfois des soucis avec les droits d'accès, notamment sous Linux) et il est un peu lourd de devoir décompiler pour s'assurer que la version du fichier présente est la bonne. Ce que nous faisons actuellement (enfin surtout mes collègues, j'ai un peu du mal à me discipliner pour le faire, mais je me soigne), c'est de gérer manuellement une ligne du genre en début de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static public final String s_VERSION_DATE = "05/02/2018 16:07";
    et avant chaque commit de modifier cette valeur.

    J'ai réussi, par template, à générer une ligne semblable avec le template suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static public final String s_VERSION_DATE = "${date} ${time}";
    Par contre, je ne suis pas bien avancé car maintenant il faudrait que j'arrive à mettre jour ceci, soit lors de la sauvegarde, soit lors du commit sur SVN (là, ça devient plus compliqué car les uns utilisent Subclipse, les autres Subversive, mais si quelqu'un a une solution avec l'un ou l'autre, on peut imposer le plugin…) et c'est là que je sèche.

    J'ai cherché un peu du côté des "Save Actions" dans le menu "Java"/"Editor" des préférences, mais je n'ai rien trouvé qui correspondrait à ce que je souhaite.
    Est-ce qu'il faut que je parte sur du développement de plugin Eclipse pour faire un traitement lors du save (et si oui, un début de piste, ce serait top, sinon je creuserai de ce côté) ? Est-ce qu'il y a un moyen plus simple ? Est-ce qu'il y aurait une autre solution pour identifier facilement un fichier (et sa version) .class, sans passer par ce système de variable statique (qui reste un peu pourri à mon avis, mais qui a le mérite de fonctionner) ?

    En tous cas, merci d'avance pour l'aide que vous pourrez m'apporter.
    « Pourquoi faire simple quand on peut faire compliqué ? » (Deuxième principe fondamental de la logique Shadok)

  2. #2
    Membre émérite
    Avatar de Mickael_Istria
    Homme Profil pro
    Développeur Expert Eclipse IDE/RCP, pour Red Hat
    Inscrit en
    juillet 2008
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Expert Eclipse IDE/RCP, pour Red Hat
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2008
    Messages : 1 154
    Points : 2 421
    Points
    2 421

    Par défaut

    Est-ce que ton appli utilise Maven ou Gradle pour faire le build? Plutot que de customiser le comportement de l'IDE, c'est mieux car plus portable et mieux factorise de customiser le comportement de l'outil de build (pour qu'il te modifie tes dates) et ensuite de faire en sorte d'avoir l'IDE qui prend bien en compte la custo de l'outil de build (dans Eclipse IDE, selon le plugin Maven, ca peut marcher tout seul, ou bien necessiter d'installer un plugin, ou bien ne pas marcher si le plugin Maven et complique et qu'il n'existe pas de plugin. Mais ceci dit, c'est tout a fait possible de contribuer au plugin Maven pour qu'il ameliore l'integration avec Eclipse IDE et autres https://wiki.eclipse.org/M2E_compatible_maven_plugins ).
    Tu fais du JEE/Web/Mobile dans Eclipse IDE? Essaye JBoss Tools !
    Follow me on twitter

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2005
    Messages : 215
    Points : 435
    Points
    435

    Par défaut

    Bonjour,
    Merci pour ta réponse.
    Les builds sont faits avec Ant (et Ivy pour la gestion des libraries).

    J'ai un petit peu du mal à voir si je fais quelque chose au moment du build comment ça va pouvoir marcher vu notre fonctionnement. Je la fais courte, on a un système qui génère des patchs (un fichier zip qui contient les .class modifiés) à partir des commentaires de commit ; ce système (je ne sais pas trop sur quel(s) outil(s) il est basé, le collègue qui gère ça n'est pas très bavard là-dessus) est sur une machine dédiée, il fait un update SVN régulièrement, build le projet, parse les commentaires de commit et à partir de là, génère nos patchs.

    Donc si je comprends bien ton idée (si ce n'est pas ça, n'hésite pas à corriger), il faudrait que la machine à patchs modifie les fichiers lors du build (mais du coup, on n'aurait pas la constante à jour sur nos postes pour faire la comparaison, donc je ne vois pas trop l'intérêt, à moins que le générateur de patchs ne commit sa modif… mais là, je vais me faire lyncher si le nombre de commits double).

    Petite remarque : pas sûr que ce soit mieux factorisé de faire un truc au niveau du build (on maintient une quinzaine de versions de l'appli qui sont gérées chacune dans un projet, alors que ces modifications n'intéressent, à l'heure actuelle, qu'une des équipes de développeurs, donc 4 personnes à ce jour)
    « Pourquoi faire simple quand on peut faire compliqué ? » (Deuxième principe fondamental de la logique Shadok)

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2005
    Messages : 215
    Points : 435
    Points
    435

    Par défaut

    Bonjour à tous,
    Plutôt des bonnes nouvelles, j'ai fini par trouver une solution à mon problème.
    J'ai un plugin qui ajoute quelques fonctionnalités utiles dans notre contexte (affichage des libellés sous forme d'info-bulles dans le code, ...), j'ai ajouté une petite fonctionnalité à la sauvegarde (je vais essayer de nettoyer un peu le code et de chercher mon texte de manière un peu plus propre, mais ça permet déjà de donner une idée si quelqu'un est confronté au même problème).

    Dans ma class Activator (le point d'entrée du plugin) :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    	public void start(BundleContext context) throws Exception {
    		super.start(context);
    		plugin = this;
    		ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() {
    			public void resourceChanged(IResourceChangeEvent event) {
    				IResourceDelta delta = event.getDelta();
    				if (delta != null) {
    					arrangeResourceDelta(delta);
    				}
    			}
    		});
    	}
     
    	private void arrangeResourceDelta(IResourceDelta delta) {
    		IResource resource = delta.getResource();
    		arrangeResource(resource);
    		IResourceDelta[] children = delta.getAffectedChildren();
    		for (IResourceDelta child : children) {
    			arrangeResourceDelta(child);
    		}
    	}
     
    	private void arrangeResource(IResource resource) {
    		if (resource.getType() == IResource.FILE) {
    			IFile file = (IFile) resource;
    			if ("java".equals(file.getFileExtension())) {
    				new Thread(new FileUpdater(file)).start();
    			}
    		}
    	}
    Si ça peut intéresser quelqu'un

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    public class FileUpdater implements Runnable {
    	private IFile m_file;
     
    	public FileUpdater(IFile file) {
    		m_file = file;
    	}
     
    	public void run() {
    		try {
    			while (ResourcesPlugin.getWorkspace().isTreeLocked()) {
    				Thread.sleep(100);
    			}
    			try {
    				InputStream is = m_file.getContents();
    				int data;
    				boolean changed = false;
    				ByteArrayOutputStream baos = new ByteArrayOutputStream();
    				while ((data = is.read()) >= 0) {
    					baos.write(data);
    				}
    				baos.flush();
    				StringBuilder sb = new StringBuilder(baos.toString());
    				int indexOf_s_VERSION_DATE = sb.indexOf(s_VERSION_DATE);
    				if (indexOf_s_VERSION_DATE != -1) {
    					int indexOfTheRowBeginning = indexOf_s_VERSION_DATE;
    					StringBuilder tmp = new StringBuilder(sb.toString()).reverse();
    					indexOfTheRowBeginning = sb.length() - tmp.indexOf("\n", tmp.length() - indexOf_s_VERSION_DATE);
    					int indexOfTheRowEnd = sb.indexOf("\n", indexOf_s_VERSION_DATE);
    					if (indexOfTheRowBeginning < 0) {
    						indexOfTheRowBeginning = 0;
    					}
    					if (indexOfTheRowEnd > sb.length()) {
    						indexOfTheRowEnd = sb.length();
    					}
    					SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    					Date currDate = new Date();
    					Date date = new Date(0);
    					String row = sb.substring(indexOfTheRowBeginning, indexOfTheRowEnd);
    					if (row.indexOf("\"") != -1) {
    						String dateString = row.substring(row.indexOf("\""), row.lastIndexOf("\""));
    						if (dateString.startsWith("\"")) {
    							dateString = dateString.substring(1);
    						}
    						try {
    							date = sdf.parse(dateString);
    						} catch (Exception e) {
    							e.printStackTrace();
    						}
    					}
    					changed = date.after(currDate) || currDate.getTime() - date.getTime() > 10000;
     
    					sb.replace(indexOfTheRowBeginning, indexOfTheRowEnd, "\tstatic public final String " + s_VERSION_DATE + " = \"" + sdf.format(currDate) + "\";");
    					if (!sb.toString().endsWith("\n")) {
    						sb.append("\n");
    					}
    				}
    				ByteArrayInputStream bais = new ByteArrayInputStream(sb.toString().getBytes());
    				if (changed) {
    					m_file.setContents(bais, IFile.KEEP_HISTORY | IFile.FORCE, null);
    				}
     
    			} catch (CoreException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    Je marque le sujet comme résolu (puisque j'ai trouvé une solution, à tester plus en détails, mais ça a l'air de marcher), mais je reste preneur de conseils sur ce que j'ai fait.

    Merci à ceux qui ont pris du temps sur ce sujet.
    « Pourquoi faire simple quand on peut faire compliqué ? » (Deuxième principe fondamental de la logique Shadok)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/05/2010, 09h52
  2. Modifier une variable statique (membre d'une classe )
    Par riccco dans le forum Débuter
    Réponses: 5
    Dernier message: 19/09/2008, 22h25
  3. Réponses: 8
    Dernier message: 21/12/2006, 18h41
  4. Réponses: 5
    Dernier message: 23/11/2006, 13h55
  5. valeur d'un champ text modifié par une variable en parametre
    Par klimero dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 21/04/2006, 10h39

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