Eclipse JDT: Syntaxprüfung wie Checkstyle

Nemos

Grünschnabel
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.
 
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/inde..._jdt_apt_core_annotationProcessorFactory.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:
Java:
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
    }
}

Java:
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();
                }
            }
        }
 
    }    
}

Java:
package de.tutorials.msg;
public enum ErrorMessages implements ResourceBundleAwareMessages {
    Error0
    ,Error1;
    static {
        MessageInitializer.initializeMessages(ErrorMessages.class);
    }
}

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

Gruß Tom
 
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!
 
Zurück