Frage bzgl. Erstellung eines Datenmodells

Ducksoul

Mitglied
Hallo erstmal 🙂

Für ein Projekt lese ich aus einem XML-File verschiedene Werte aus. Unter anderem für verschiedene Policies den Wert "Action" welcher eine Kennung verschiedener Algorithmen enthält (siehe bpsw. OID description for 2.16.840.1.101.3.4.1 - aes).

Zum Beispiel könnte eine Action den Wert "2.16.840.1.101.3.4.1.24" enthalten. Aus diesem kann ich dann den Algorithmus (AES 192) und den Modus (Cipher Block Chaining) herausbekomme.

Nun ist die Frage wie ich das am besten in ein Model packe. Im Speziellen ist der Knackpunkt, dass ich wissen muss welcher Algorithmus welche Modi besitzen darf, da die Algorithmen später in einer ComboBox angezeigt werden und die dazugehörigen Modi in einer zweiten.

Idee bisher:
In der Klasse ActionModel 3 Variablen
1. id: String (mit der ausgelesenen Kennung)
2. algorithm (enum Algorithms = { AES, SHA, ..., UNKNOWN }
3. mode (enum Modes = {CBC, CFB, ... , UNKNOWN }
und für jeden Algorithmus eine enum, in welcher die erlaubten Modi für diesen Algorithmus stehen.

In der einen ComboBox würden dann später die Algorithmen stehen und wenn man einen Algorithmus gewählt hat, dann würden die dazugehörigen modi aus der enum für den algorithmus in der anderen CB angezeigt werden.


Geht das besser, bzw. wie geht es besser? 😛
Vielen Dank schonmal.
 
Das Modell würde ich mit EMF machen. Dem Enum Algorithms verpasst du eine Methode
Code:
public EnumSet getCompatibleModes()
. Bei Bedarf kannst du dann noch einen Validator hinzufügen der darauf achtet das der Mode in getCompatibleModes enthalten ist.
 
Hallo, das EMF kann ich nicht nutzen, da ich mit Eclipse arbeite. Soweit habe ich jetzt aber denke ich alles in UML untergebracht. Das mit den EnumSets war ein super Hinweis. Sobald ich es implementiert habe poste ich hier mal den Code.

Grüße und ein schönes Wochenende
Franz
 
Du hast Recht. Der Satz hat keinen Sinn gemacht. Ich wollte schreiben, dass ich das Plugin nicht nutzen kann, da ich nicht mit Eclipse arbeite, sondern mit Netbeans.
Ich habe eclipse allerdings installiert und werde mir den EMF doch mal anschauen. Man möchte sich ja ständig weiterbilden *g*
 
So, ich habe den Vorschlag jetzt denke ich umgesetzt. Getestet ist der Code zwar noch nicht, da noch einige Baustellen an anderen Teilen des Codes zu beheben sind, aber es sollte meiner Meinung nach laufen:

Die Enums:
Java:
    public static enum Algorithms {
        AES128(EnumSet.of(Modes.CBC, Modes.CFB)),
        AES192(EnumSet.of(Modes.CBC, Modes.CFB)),
        AES256(EnumSet.of(Modes.CBC, Modes.CFB)),
        DES, 
        SHA1, 
        SHA256, 
        SHA384, 
        SHA512,
        UNKNOWN;
        
        private EnumSet cModes;
        
        Algorithms(EnumSet cModes) {
            this.cModes = cModes;
        }
        
        Algorithms() {
            this.cModes = EnumSet.of(Modes.NONE);
        }
        
        public EnumSet getCompatibleModes() {
            return  cModes;
        }
    }
    
    public static enum Modes {
        CBC, CFB, NONE;
    }

Die Klasse ActionModel (ohne getter und setter):
Java:
public class ActionModel {
    private String id;
    private Algorithms algorithm;
    private Modes mode;
    private Hashtable actions; 
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    
    private ActionModel(Hashtable actions, String id) {
        this.actions = actions;
        this.id = id;
        setInitialValues();
    }
    
    private void setInitialValues() {
        if((id != null) && (!id.equals(""))) {
            if(actions.containsValue(id)) {
                Hashtable tempTable = new Hashtable();
                
                Enumeration e = actions.keys();
                while (e.hasMoreElements()) {
                    Object o = e.nextElement();
                    tempTable.put(actions.get(o), o);
                }     
                
                ActionTupel tupel = (ActionTupel) tempTable.get(id);
                setAlgorithm(tupel.getAlgorithm());
                setMode(tupel.getMode());
            } else {
                setAlgorithm(Algorithms.UNKNOWN);
                setMode(Modes.NONE);
            }
        }
    }
    
    private void createId() {
        ActionTupel aTupel = new ActionTupel(algorithm, mode);
               
        if(actions.containsKey(aTupel)) {
            id = (String) actions.get(aTupel);
        } else {
            // TODO Fehlerbehebung keine gültige Action
            System.out.println("Dies ist keine gültige Action");
        }
    } 
}

Aufbau der Hashtables, wovon eine beim Erzeugen des ActionModels übergeben wird:
Java:
    private void createHashTables() {
        cActions = new Hashtable();
        
        cActions.put(new ActionTupel(Algorithms.AES128, Modes.CBC), "2.16.840.1.101.3.4.1.2");
        cActions.put(new ActionTupel(Algorithms.AES128, Modes.CFB), "2.16.840.1.101.3.4.1.4");
        cActions.put(new ActionTupel(Algorithms.AES192, Modes.CBC), "2.16.840.1.101.3.4.1.22");
        cActions.put(new ActionTupel(Algorithms.AES192, Modes.CFB), "2.16.840.1.101.3.4.1.24");
        cActions.put(new ActionTupel(Algorithms.AES256, Modes.CBC), "2.16.840.1.101.3.4.1.42");
        cActions.put(new ActionTupel(Algorithms.AES256, Modes.CFB), "2.16.840.1.101.3.4.1.44");
        cActions.put(new ActionTupel(Algorithms.DES, Modes.NONE), "1.3.6.1.4.1.4929.1.6");  
        
        iActions = new Hashtable();
        
        iActions.put(new ActionTupel(Algorithms.SHA1, Modes.NONE), "1.3.14.3.2.26");
        iActions.put(new ActionTupel(Algorithms.SHA256, Modes.NONE), "2.16.840.1.101.3.4.2.1");
        iActions.put(new ActionTupel(Algorithms.SHA384, Modes.NONE), "2.16.840.1.101.3.4.2.2");
        iActions.put(new ActionTupel(Algorithms.SHA512, Modes.NONE), "2.16.840.1.101.3.4.2.3");
    }


Viele Grüße
Franz
 

Zurück
Oben