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

Eclipse Discussion :

Modifier automatiquement une variable statique lors de l'enregistrement du fichier


Sujet :

Eclipse

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 : 471
    Points
    471
    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 469
    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 469
    Points : 2 997
    Points
    2 997
    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 ).
    Pour du HTML, CSS, JavaScript, TypeScript, JSon, Yaml, Node... dans Eclipse IDE, installe Eclipse Wild Web Developer
    Pour du Rust dans Eclipse IDE, installe Eclipse Corrosion
    Follow me on twitter

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 : 471
    Points
    471
    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 confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 : 471
    Points
    471
    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. 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