tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
697
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Nemos Nemos ist offline Grünschnabel
    Registriert seit
    Dec 2009
    Beiträge
    4
    Hallo,

    Ich möchte gerne eine Automatische Prüfung in plugin Einbauen.
    Ich habe Nachrichtendefinition in enum:

    public enum MYMESSAGES{
    MESSAGE1,
    MESSAGE2;...}
    und Eigentliche Nachrichten sind in messages_x.properties

    Ich möchte eine Prüfung Einbauen, sobald ich eine enum Wert MYMESSAGES eintrage ob eine .properties disen Wert als Key enthält.

    Wie kann ich dieser Prüfung in eclipse Einbauen!?

    Danke.
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo Nemos,

    interessante Aufgabe die du da hast...
    Ich würde hier ein eigenes kleines Eclipse Plugin schreiben, dass die JDT Infrastruktur benutzt. Dazu würde ich mir eine Annotation @MessageBundle oder @Messages definieren. Damit würde ich die enums Annotieren, welche die Message-Keys enthalten. Nun kann das Plugin diese Enums per Reflection analysiseren und dann prüfen ob das dazugehörige Ressource-Bundle auch die entsprechenden Werte enthält.

    Die Prüfung könntest du dann beispielsweise über APT (Annotation Processing Tool) realisieren...
    Du könntest dann über diesen ExtensionPoint:
    http://help.eclipse.org/helios/index...orFactory.html
    Eine eigene AnnoationProcessingFactory registrieren. Dort erzeugst du dann deinen AnnotationProcessor der automatisch beim Compile-Lauf von Eclipse (beispielsweise beim Speichern des
    gerade editierten enums aufgerufen wird. Wenn dann ein Schlüssel fehlt, kannst du sogar direkt in Eclipse Warn-/Fehlermeldungen erzeugen lassen


    Eine Möglichkeit für den generellen Mechanismus wie du ihn beschreibst wäre übirgens:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    
    package de.tutorials.msg;
    public class MessageEnumExample {
        public static void main(String[] args) {
            System.out.println(ErrorMessages.Error0); //toString liefert Fehler 0
            System.out.println(ErrorMessages.Error1); //toString liefert Error1
        }
    }

    Code java:
    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
    
    package de.tutorials.msg;
    import java.lang.reflect.Field;
    import java.util.ResourceBundle;
    public interface ResourceBundleAwareMessages {
        public static class MessageInitializer {
            public static void initializeMessages(Class<? extends ResourceBundleAwareMessages> clazz) {
                ResourceBundle bundle = ResourceBundle.getBundle(clazz.getName());
                for (Field field : clazz.getFields()) {
                    String fieldName = field.getName();
                    if (bundle.containsKey(fieldName)) {
                        try {
                            String value = bundle.getString(fieldName);
                            Object o = field.get(null);
                            Field nameField = o.getClass().getSuperclass().getDeclaredField("name");
                            nameField.setAccessible(true);
                            nameField.set(o, value);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }else{
                        //logger
                        String bundleName = clazz.getSimpleName()+"_"+bundle.getLocale()+".properties";
                        System.err.printf("Missing resource-key %s in bundle %s",fieldName,bundleName).println();
                    }
                }
            }
     
        }    
    }

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    
    package de.tutorials.msg;
    public enum ErrorMessages implements ResourceBundleAwareMessages {
        Error0
        ,Error1;
        static {
            MessageInitializer.initializeMessages(ErrorMessages.class);
        }
    }

    Unsere ErrorMessages_de_DE.properties
    Code :
    1
    
    Error0=Fehler 0
    Ausgabe:
    Code :
    1
    2
    3
    
    Missing resource-key Error1 in bundle ErrorMessages_de_DE.properties
    Fehler 0
    Error1

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    Nemos Nemos ist offline Grünschnabel
    Registriert seit
    Dec 2009
    Beiträge
    4
    Hallo Thomas,

    danke für deinen Vorschlag!

    I habe eine Lösung basierend auf ..jdt.core.compilationpatisipant extention Point gemacht,
    so kann ich alle Änderungen aus workspace abfangen, nach benötigte Ressource filtern.

    Ich kann alle enum Werte die ich brauche über CompilationUnt->types() (cust to org.eclipse.jdt.core.dom.EnumDeclaration )
    abfragen etc.

    Danke noch mal für deinen Vorschlag!
     

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 29.07.10, 15:06
  2. Checkstyle in Eclipse
    Von vogella im Forum Java Technology News
    Antworten: 0
    Letzter Beitrag: 09.08.09, 17:45
  3. Antworten: 0
    Letzter Beitrag: 11.05.09, 12:46
  4. Eclipse basierte JSF Tools / Eclipse Visual JSF Page Designer
    Von Thomas Darimont im Forum Java Technology News
    Antworten: 0
    Letzter Beitrag: 07.03.07, 00:20
  5. Antworten: 0
    Letzter Beitrag: 23.11.06, 23:34

Stichworte