Codeoptimierung

Joe1903

Mitglied
Hallo,
ich habe folgenden Code implementiert, welches Spalten einer Tabelle befüllt. Jedoch gefällt mir nicht, dass ich unzählige if' s benutze.
Wie kann ich das anders machen? Ich bin Java-Neuling und bräuchte etwas Hilfe:
...

Java:
if (filter!=null)
            for (Object key:filter.keySet()) {
                String filterValue=filter.get(key).toString();
                if (key.toString().equals("ID")) resultData=resultData.stream().filter(t-> t.getId().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("State")) resultData=resultData.stream().filter(t-> t.getState().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("SWID")) resultData=resultData.stream().filter(t-> t.getSWID().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Runtime")) resultData=resultData.stream().filter(t-> t.getRuntime().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Key")) resultData=resultData.stream().filter(t-> t.getKey().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("NewSWID")) resultData=resultData.stream().filter(t-> t.getNewSWID().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("NewRuntime")) resultData=resultData.stream().filter(t-> t.getNewRuntime().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Errors")) resultData=resultData.stream().filter(t-> t.getErrors().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("CLog_Who")) resultData=resultData.stream().filter(t-> t.getCLog_Who().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("CLog_Date")) resultData=resultData.stream().filter(t-> t.getCLog_Date().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("CLog_Release")) resultData=resultData.stream().filter(t-> t.getCLog_Release().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("CLog_Task")) resultData=resultData.stream().filter(t-> t.getCLog_Task().equals(filterValue)).collect(Collectors.toList());
            }
        return resultData;
    }

...
 

mrBrown

Super-Moderator
Mitarbeiter
Spontan:

- eine zusätzliche Map<String, Funktion<T,String>>, die für den key den jeweiligen Getter liefert.
Java:
//Getter hinzufügen
getters.put("ID", T::getId)
//alle anderen...

//nutzen
if (filter!=null)
            for (Object key:filter.keySet()) {
                String filterValue=filter.get(key).toString();
                resultData=resultData.stream().filter(t-> getters.get(key).apply(t).equals(filterValue)).collect(Collectors.toList())
             }
             return resultData;
}

- Die filter nicht als Map<String,String>, sondern als Liste Predicate<Typ von t>. Muss man dann natürlich vorher umformen.
Java:
//filter-Liste anlegen
filter.add(new IdFilter(idFilterValue));

//nutzen
if (filter!=null)
            for (Predicate<T> test : filter) {
                resultData=resultData.stream().filter(test).collect(Collectors.toList())
             }
             return resultData;
}


- Reflection nutzen, um für den Key den jeweilen Getter zu bekommen, zumindest wenn Key und jeweiliger Getter immer übereinstimmen.



Ich würde Variante 2 nutzen, dürfte am schönsten umsetzbar sein.
 

White_Fox

Top Contributor
Ein Switch-Case-Statement ist auf jeden Fall besser lesbar als viele ifs.

In der Switch-Anweisung wird, wenn ein String drinsteht, die equals-Methode verwendet (und nicht ==):
 

Joe1903

Mitglied
Spontan:

- eine zusätzliche Map<String, Funktion<T,String>>, die für den key den jeweiligen Getter liefert.
Java:
//Getter hinzufügen
getters.put("ID", T::getId)
//alle anderen...

//nutzen
if (filter!=null)
            for (Object key:filter.keySet()) {
                String filterValue=filter.get(key).toString();
                resultData=resultData.stream().filter(t-> getters.get(key).apply(t).equals(filterValue)).collect(Collectors.toList())
             }
             return resultData;
}

- Die filter nicht als Map<String,String>, sondern als Liste Predicate<Typ von t>. Muss man dann natürlich vorher umformen.
Java:
//filter-Liste anlegen
filter.add(new IdFilter(idFilterValue));

//nutzen
if (filter!=null)
            for (Predicate<T> test : filter) {
                resultData=resultData.stream().filter(test).collect(Collectors.toList())
             }
             return resultData;
}


- Reflection nutzen, um für den Key den jeweilen Getter zu bekommen, zumindest wenn Key und jeweiliger Getter immer übereinstimmen.



Ich würde Variante 2 nutzen, dürfte am schönsten umsetzbar sein.

Super danke. Ich hab noch eine Frage :)
Wenn ich die Spaltenamen der Tabelle erstelle,hab ich folgendes gemacht:

Java:
 private void createColumns(final Composite parent, final TableViewer viewer) {
        List<String> titles=getFields(new TableModel());
        TableViewerColumn col = createTableViewerColumn(titles.get(0), 100, 0);
        col.setLabelProvider(new ColumnLabelProvider() {
            public String getText(Object element) {
                TableModel p = (TableModel) element;
                return p.getActive();
            }
        });
        
        col = createTableViewerColumn(titles.get(1), 100, 1);
        col.setLabelProvider(new ColumnLabelProvider() {
            public String getText(Object element) {
                TableModel p = (TableModel) element;
                return p.getRuntime();
            }
        });
        col = createTableViewerColumn(titles.get(2), 100, 2);
        col.setLabelProvider(new ColumnLabelProvider() {
            public String getText(Object element) {
                TableModel p = (TableModel) element;
                return p.getSWID();
            }
        });
        String coltit = titles.get(3);
        col = createTableViewerColumn(coltit, 100, 3);
        col.setLabelProvider(new ColumnLabelProvider() {
            public String getText(Object element) {
                TableModel p = (TableModel) element;
                return p.getType();
            }
            
            ...

Nun benutze ich auch hier 6-mal denselben Code eigentlich (habe hier nur 3 gepastet, sind aber 6 insgesamt). Wie kann ich das optimieren?
 

CSHW89

Bekanntes Mitglied
Meistens kann man doppelten Code in eine Methode auslagern. Hier z.b. so:
Java:
private void setLabelProvider(List<String> titles, int index, Function<TableModel, String> mapper) {
    TableViewerColumn col = createTableViewerColumn(titles.get(index), 100, index);
    col.setLabelProvider(new ColumnLabelProvider() {
        public String getText(Object element) {
            TableModel p = (TableModel) element;
            return mapper.apply(p);
        }
    });
}
private void createColumns(final Composite parent, final TableViewer viewer) {
    List<String> titles=getFields(new TableModel());
    setLabelProvider(titles, 0, TableModel::getActive);
    setLabelProvider(titles, 1, TableModel::getRuntime);
    setLabelProvider(titles, 2, TableModel::getType);
    ...
}

PS: Nachtrag dazu, wenn ich mir doppelten Code anschaue, nehme ich mir immer die Unterschiede vor, und untersuche, wie ich sie vereinheitlichen kann. Ein einfacher Wert, wie hier der Index kann als einfacher Parameter an eine Methode mitgegeben werden. Verschiedene "Logik" kann seit Java 8 mit Lambdas häufig gut abgebindet werden. Der return-Wert der getText-Methode ist hier ein gutes Beispiel. Welche get-Methode nun benutzt wird, signalisiert hier der mapper-Parameter mit Funktionsreferenzen der TableModel-Klasse.
 
Zuletzt bearbeitet:

Joe1903

Mitglied
Meistens kann man doppelten Code in eine Methode auslagern. Hier z.b. so:
Java:
private void setLabelProvider(List<String> titles, int index, Function<TableModel, String> mapper) {
    TableViewerColumn col = createTableViewerColumn(titles.get(index), 100, index);
    col.setLabelProvider(new ColumnLabelProvider() {
        public String getText(Object element) {
            TableModel p = (TableModel) element;
            return mapper.apply(p);
        }
    });
}
private void createColumns(final Composite parent, final TableViewer viewer) {
    List<String> titles=getFields(new TableModel());
    setLabelProvider(titles, 0, TableModel::getActive);
    setLabelProvider(titles, 1, TableModel::getRuntime);
    setLabelProvider(titles, 2, TableModel::getType);
    ...
}

PS: Nachtrag dazu, wenn ich mir doppelten Code anschaue, nehme ich mir immer die Unterschiede vor, und untersuche, wie ich sie vereinheitlichen kann. Ein einfacher Wert, wie hier der Index kann als einfacher Parameter an eine Methode mitgegeben werden. Verschiedene "Logik" kann seit Java 8 mit Lambdas häufig gut abgebindet werden. Der return-Wert der getText-Methode ist hier ein gutes Beispiel. Welche get-Methode nun benutzt wird, signalisiert hier der mapper-Parameter mit Funktionsreferenzen der TableModel-Klasse.
Danke. Ich bin mir nicht sicher,aber kann man in Java die Funktionen so durchgeben (getActive etc.)? Oder müsste ich das Objekt durchgeben?
 

Joe1903

Mitglied
Ich habe noch eine Frage. Ich versuche eine GUI zu erstellen,die eine MS Access darstellen soll. Hierfür habe ich Models angelegt für die jeweiligen Tabellen:

Java:
package test1.model;

//import java.util.LinkedHashMap;

public class TableModel {

    String Active;
    String Runtime;
    String SWID;
    String Type;
    String Member;
    String BlockType;
    String BlockName;
    String Content;
    String Q_Src_SWID;
    String Q_Src_RT;
    String Q_Targ_SWID;
    String Q_Targ_RT;
    String Q_QueueType;
    String Q_QueueEntity;
    String Q_QueueSuffix;
    String Q_QueueNeutral;
    String CommonEntity;
    String CommonProcess;
    String CommonAddrpar;
    String DDName;
    
//    LinkedHashMap<String, String> fields = new LinkedHashMap<String, String>();
    
    
    public TableModel(String active, String runtime, String sWID, String type, String member, String blockType,
            String blockName, String content, String q_Src_SWID, String q_Src_RT, String q_Targ_SWID, String q_Targ_RT,
            String q_QueueType, String q_QueueEntity, String q_QueueSuffix, String q_QueueNeutral, String commonEntity,
            String commonProcess, String commonAddrpar, String dDName) {

//        fields.put("Active", active);
        
        Active = active;
        Runtime = runtime;
        SWID = sWID;
        Type = type;
        Member = member;
        BlockType = blockType;
        BlockName = blockName;
        Content = content;
        Q_Src_SWID = q_Src_SWID;
        Q_Src_RT = q_Src_RT;
        Q_Targ_SWID = q_Targ_SWID;
        Q_Targ_RT = q_Targ_RT;
        Q_QueueType = q_QueueType;
        Q_QueueEntity = q_QueueEntity;
        Q_QueueSuffix = q_QueueSuffix;
        Q_QueueNeutral = q_QueueNeutral;
        CommonEntity = commonEntity;
        CommonProcess = commonProcess;
        CommonAddrpar = commonAddrpar;
        DDName = dDName;
    }
    public TableModel() {
        super();
    }

    public String getActive() {
        return Active;
    }

    public void setActive(String active) {
        Active = active;
    }

    public String getRuntime() {
        return Runtime;
    }

    public void setRuntime(String runtime) {
        Runtime = runtime;
    }

    public String getSWID() {
        return SWID;
    }

    public void setSWID(String sWID) {
        SWID = sWID;
    }

    public String getType() {
        return Type;
    }

    public void setType(String type) {
        Type = type;
    }

    public String getMember() {
        return Member;
    }

    public void setMember(String member) {
        Member = member;
    }

    public String getBlockType() {
        return BlockType;
    }

    public void setBlockType(String blockType) {
        BlockType = blockType;
    }

    public String getBlockName() {
        return BlockName;
    }

    public void setBlockName(String blockName) {
        BlockName = blockName;
    }

    public String getContent() {
        return Content;
    }

    public void setContent(String content) {
        Content = content;
    }

    public String getQ_Src_SWID() {
        return Q_Src_SWID;
    }

    public void setQ_Src_SWID(String q_Src_SWID) {
        Q_Src_SWID = q_Src_SWID;
    }

    public String getQ_Src_RT() {
        return Q_Src_RT;
    }

    public void setQ_Src_RT(String q_Src_RT) {
        Q_Src_RT = q_Src_RT;
    }

    public String getQ_Targ_SWID() {
        return Q_Targ_SWID;
    }

    public void setQ_Targ_SWID(String q_Targ_SWID) {
        Q_Targ_SWID = q_Targ_SWID;
    }

    public String getQ_Targ_RT() {
        return Q_Targ_RT;
    }

    public void setQ_Targ_RT(String q_Targ_RT) {
        Q_Targ_RT = q_Targ_RT;
    }

    public String getQ_QueueType() {
        return Q_QueueType;
    }

    public void setQ_QueueType(String q_QueueType) {
        Q_QueueType = q_QueueType;
    }

    public String getQ_QueueEntity() {
        return Q_QueueEntity;
    }

    public void setQ_QueueEntity(String q_QueueEntity) {
        Q_QueueEntity = q_QueueEntity;
    }

    public String getQ_QueueSuffix() {
        return Q_QueueSuffix;
    }

    public void setQ_QueueSuffix(String q_QueueSuffix) {
        Q_QueueSuffix = q_QueueSuffix;
    }

    public String getQ_QueueNeutral() {
        return Q_QueueNeutral;
    }

    public void setQ_QueueNeutral(String q_QueueNeutral) {
        Q_QueueNeutral = q_QueueNeutral;
    }

    public String getCommonEntity() {
        return CommonEntity;
    }

    public void setCommonEntity(String commonEntity) {
        CommonEntity = commonEntity;
    }

    public String getCommonProcess() {
        return CommonProcess;
    }

    public void setCommonProcess(String commonProcess) {
        CommonProcess = commonProcess;
    }

    public String getCommonAddrpar() {
        return CommonAddrpar;
    }

    public void setCommonAddrpar(String commonAddrpar) {
        CommonAddrpar = commonAddrpar;
    }

    public String getDDName() {
        return DDName;
    }
    
    public void setDDName(String dDName) {
        DDName = dDName;
    }
    
    @Override
    public String toString() {
        return Active + "," + Runtime + "," + SWID + "," + Type
                + "," + Member + "," + BlockType + "," + BlockName + ","
                + Content + "," + Q_Src_SWID + "," + Q_Src_RT + "," + Q_Targ_SWID
                + "," + Q_Targ_RT + "," + Q_QueueType + "," + Q_QueueEntity
                + "," + Q_QueueSuffix + "," + Q_QueueNeutral + ","
                + CommonEntity + "," + CommonProcess + "," + CommonAddrpar + ","
                + DDName;
    }

//    public String get(String fieldName) {
//        return fields.get(fieldName);
//    }   

}



package test1.model;

public class TaskTableModel {

    String Id;
    String State;
    String SWID;
    String Runtime;
    String Key;
    String NewSWID;
    String NewRuntime;
    String Errors;
    String CLog_Who;
    String CLog_Date;
    String CLog_Release;
    String CLog_Task;

    public TaskTableModel(String x, String id, String state, String sWID, String runtime, String key, String newSWID,
            String newRuntime, String errors, String cLog_Who, String cLog_Date, String cLog_Release, String cLog_Task) {
        super();
        Id = id;
        State = state;
        SWID = sWID;
        Runtime = runtime;
        Key = key;
        NewSWID = newSWID;
        NewRuntime = newRuntime;
        Errors = errors;
        CLog_Who = cLog_Who;
        CLog_Date = cLog_Date;
        CLog_Release = cLog_Release;
        CLog_Task = cLog_Task;

    }
    public TaskTableModel() {
        super();
    }
    public String getId() {
        return Id;
    }
    public void setId(String id) {
        Id = id;
    }

    public String getState() {
        return State;
    }
    public void setState(String state) {
        State = state;
    }

    public String getCLog_Who() {
        return CLog_Who;
    }
    public void setCLog_New(String clog_who) {
        CLog_Who = clog_who;
    }
    
    public String getCLog_Date() {
        return CLog_Date;
    }
    public void setCLog_Date(String clog_date) {
        CLog_Date = clog_date;
    }
    
    public String getCLog_Release() {
        return CLog_Release;
    }
    public void setCLog_Release(String clog_release) {
        CLog_Release = clog_release;
    }
    
    public String getCLog_Task() {
        return CLog_Task;
    }
    public void setCLog_Task(String clog_task) {
        CLog_Task = clog_task;
    }

    public String getRuntime() {
        return Runtime;
    }
    public void setRuntime(String runtime) {
        Runtime = runtime;
    }

    public String getSWID() {
        return SWID;
    }
    public void setSWID(String sWID) {
        SWID = sWID;
    }

    public String getNewRuntime() {
        return NewRuntime;
    }
    public void setNewRuntime(String newruntime) {
        NewRuntime = newruntime;
    }

    public String getNewSWID() {
        return NewSWID;
    }
    public void setNewSWID(String newSWID) {
        SWID = newSWID;
    }

    public String getErrors() {
        return Errors;
    }
    public void setErrors(String errors) {
        Errors = errors;
    }

    public String getKey() {
        return Key;
    }
    public void setKey(String key) {
        Key = key;
    }

    @Override
    public String toString() {
        return Id + "," + State + "," + SWID + "," + Runtime
                + "," + Key + "," + NewSWID + "," + NewRuntime + ","
                + Errors + "," + CLog_Who +"," + CLog_Date+ "," + CLog_Release+ "," + CLog_Task;
    }   

}





package test1.model;

public class ChangeTaskTableModel {

    String TaskID;
    String Key;
    String QKey;
    String QValue;
    String NewValue;

    public ChangeTaskTableModel(String taskID, String key, String qKey, String qValue, String newValue) {
        super();
        TaskID = taskID;
        Key = key;
        QKey = qKey;
        QValue = qValue;
        NewValue = newValue;

    }
    public ChangeTaskTableModel() {
        super();
    }
    public String getTaskID() {
        return TaskID;
    }
    public void setTaskID(String taskID) {
        TaskID = taskID;
    }

    public String getKey() {
        return Key;
    }
    public void setKey(String key) {
        Key = key;
    }

    public String getQKey() {
        return QKey;
    }
    public void setQKey(String qkey) {
        QKey = qkey;
    }

    public String getQValue() {
        return QKey;
    }
    public void setQValue(String qvalue) {
        QKey = qvalue;
    }

    public String getNewValue() {
        return NewValue;
    }
    public void setNewValue(String newValue) {
        NewValue = newValue;
    }

    @Override
    public String toString() {
        return TaskID + "," + Key + "," + QKey + "," + QValue + "," + NewValue;
    }   

}

Des Weiteren habe ich jeweils Datasource-files angelegt

Java:
package test1.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class TaskTable_DataSource {
    
    public ResultSet DBinterfaceT() {

        String sqlquer;
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
    
    
        try {
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        }
        catch(ClassNotFoundException cnfex) {

            System.out.println("Problem in loading or registering MS Access JDBC driver");
            cnfex.printStackTrace();
        }

        // Step 1: Opening database connection
        try {
            String msAccDB = "C:/UBS/Dev/Data/WMP Unification.accdb";
            String dbURL = "jdbc:ucanaccess://" + msAccDB;
            // Step 1.1: Create connection using class DriverManager
            connection = DriverManager.getConnection(dbURL);
            // Step 1.2: Create JDBC statement for the connected DB
            statement = connection.createStatement();
            // Step 1.3: Execute SQL query
            sqlquer = "SELECT * FROM Tasks";
            resultSet = statement.executeQuery(sqlquer);
        }

        catch(SQLException sqlex){
            sqlex.printStackTrace();
        }

        finally {

            System.out.println("\nclose ttask db");     
//          System.out.println("\nclose ttask db" + contentstr1);     
            // Step 2: Close database connection
            try {
                if(null != connection) {

                    // cleanup resources, once after processing
//                    resultSet.close();
                    statement.close();
                    connection.close();
// TODO               myObj.close();
                }
            }
            catch (SQLException sqlex) {
                sqlex.printStackTrace();
            }
        }
    
        return resultSet;
    }

}





package test1.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ChangeTaskTable_DataSource {
    
    public ResultSet DBinterfaceT() {

        String sqlquer;
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
    
    
        try {
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        }
        catch(ClassNotFoundException cnfex) {

            System.out.println("Problem in loading or registering MS Access JDBC driver");
            cnfex.printStackTrace();
        }

        // Step 1: Opening database connection
        try {
            String msAccDB = "C:/UBS/Dev/Data/WMP Unification.accdb";
            String dbURL = "jdbc:ucanaccess://" + msAccDB;
            // Step 1.1: Create connection using class DriverManager
            connection = DriverManager.getConnection(dbURL);
            // Step 1.2: Create JDBC statement for the connected DB
            statement = connection.createStatement();
            // Step 1.3: Execute SQL query
            sqlquer = "SELECT * FROM Task_Changes";
            resultSet = statement.executeQuery(sqlquer);
        }

        catch(SQLException sqlex){
            sqlex.printStackTrace();
        }

        finally {

            // Step 2: Close database connection
            try {
                if(null != connection) {

                    // cleanup resources, once after processing
//                    resultSet.close();
                    statement.close();
                    connection.close();
// TODO               myObj.close();
                }
            }
            catch (SQLException sqlex) {
                sqlex.printStackTrace();
            }
        }
    
        return resultSet;
    }

}

auf die ich über ein Interface zugreife:

Java:
package com.ubs.FYC.Config.Cloner.utils;

import java.sql.SQLException;
import java.util.List;

import com.ubs.FYC.Config.Cloner.model.TableModel;

public interface FYC_DataSource {
    List<TableModel> getData() throws SQLException;
}

Nun Weiss ich, dass das nicht ganz optimial bzw. OO ist. Ich möchte ein "übergeordentes Objekt" erstellen mit einem allgemeinen Fields-Collection und bei den obigen Models lediglich die spezifischen Fields und SQL Statements drinhaben. Wie kann ich das machen? Ich Weiss zwar was ich machen will, aber nicht genau wie ich das anstellen kann.
 

mihe7

Top Contributor
Ich Weiss zwar was ich machen will, aber nicht genau wie ich das anstellen kann.
Könntest Du das mal so beschreiben, dass auch ich es verstehe?

BTW: Du tätest Dir und uns einen Gefallen, wenn Du Dich an die Java-Namenskonventionen halten würdest. Paketnamen klein, Typnamen (Interface, Klasse, ...) in UpperCamelCase und Bezeichner für Variablen, Parameter und Methoden in lowerCamelCase. In der Regel keine Unterstriche (Ausnahme: Konstanten) und auch keine Buchstaben an die Namen hängen bzw. diesen voranstellen.
 

Joe1903

Mitglied
Könntest Du das mal so beschreiben, dass auch ich es verstehe?

BTW: Du tätest Dir und uns einen Gefallen, wenn Du Dich an die Java-Namenskonventionen halten würdest. Paketnamen klein, Typnamen (Interface, Klasse, ...) in UpperCamelCase und Bezeichner für Variablen, Parameter und Methoden in lowerCamelCase. In der Regel keine Unterstriche (Ausnahme: Konstanten) und auch keine Buchstaben an die Namen hängen bzw. diesen voranstellen.

Mein Code geht momentan davon aus,dass es die DB (und Tabellen) kennt. Das möchte ich nicht. Ich möchte quasi eine zusätzliche Abstraktionsstufe hinzufügen (z.B. AbstractTableModel) bei dem die Tabellefelder dynamisch gesammelt bzw. aufgebaut warden und in den obigen Models lediglich die SQL Statements auf diese Felder gemacht warden. Die Namenskonventionen werde ich einbauen,danke für den Hinweis.
 

lam_tr

Top Contributor
Super danke. Ich hab noch eine Frage :)
Wenn ich die Spaltenamen der Tabelle erstelle,hab ich folgendes gemacht:

Java:
 private void createColumns(final Composite parent, final TableViewer viewer) {
        List<String> titles=getFields(new TableModel());
        TableViewerColumn col = createTableViewerColumn(titles.get(0), 100, 0);
        col.setLabelProvider(new ColumnLabelProvider() {
            public String getText(Object element) {
                TableModel p = (TableModel) element;
                return p.getActive();
            }
        });
       
        col = createTableViewerColumn(titles.get(1), 100, 1);
        col.setLabelProvider(new ColumnLabelProvider() {
            public String getText(Object element) {
                TableModel p = (TableModel) element;
                return p.getRuntime();
            }
        });
        col = createTableViewerColumn(titles.get(2), 100, 2);
        col.setLabelProvider(new ColumnLabelProvider() {
            public String getText(Object element) {
                TableModel p = (TableModel) element;
                return p.getSWID();
            }
        });
        String coltit = titles.get(3);
        col = createTableViewerColumn(coltit, 100, 3);
        col.setLabelProvider(new ColumnLabelProvider() {
            public String getText(Object element) {
                TableModel p = (TableModel) element;
                return p.getType();
            }
           
            ...

Nun benutze ich auch hier 6-mal denselben Code eigentlich (habe hier nur 3 gepastet, sind aber 6 insgesamt). Wie kann ich das optimieren?

Hi ich sehe du benutzt JFace / SWT, an der stelle kannst du auch direkt eine neue Klasse für den LabelProvider schreiben der von ITableLableProvider erbt, im Anschluss direkt an dem TableViewer#setLabelProvider setzen. Kannst somit in eine separate Klasse auslagern. Hier ein Beispiel dazu http://www.java2s.com/Code/JavaAPI/org.eclipse.jface.viewers/implementsITableLabelProvider.htm
 

Joe1903

Mitglied
Fehlte noch oben für DataSource:

Java:
package test1.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.ubs.FYC.Config.Cloner.model.TableModel;
import com.ubs.FYC.Config.Cloner.view.FycConfigTable;


public class MSAccess_DataSource implements FYC_DataSource {

    private FycConfigTable fycConfigTable;

    public MSAccess_DataSource(FycConfigTable fycConfigTable) {
        this.fycConfigTable = fycConfigTable;
    }

    @Override
    public List<TableModel> getData() throws SQLException {

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        }
        catch(ClassNotFoundException cnfex) {

            System.out.println("Problem in loading or registering MS Access JDBC driver");
            cnfex.printStackTrace();
        }

        try {
            String msAccDB = "C:\\UBS\\Dev\\Data\\WMP Unification.accdb";
            String dbURL = "jdbc:ucanaccess://" + msAccDB;
            connection = DriverManager.getConnection(dbURL);
            statement = connection.createStatement();
            resultSet = statement.executeQuery(fycConfigTable.getSql());
        }

        catch(SQLException sqlex){
            sqlex.printStackTrace();
        }
        finally {

            try {
                if(null != connection) {

                    statement.close();
                    connection.close();
                    // TODO               myObj.close();
                }
            }
            catch (SQLException sqlex) {
                sqlex.printStackTrace();
            }
        }

        List<TableModel> result = new ArrayList<TableModel>();

        while (resultSet.next()) {
            result.add(new TableModel(resultSet.getString("Active"),resultSet.getString("Runtime"),resultSet.getString("SWID"),resultSet.getString("Type"),resultSet.getString("Member"),
                    resultSet.getString("BlockType"),resultSet.getString("BlockName"),resultSet.getString("Content"),resultSet.getString("Q_Src_SWID"),resultSet.getString("Q_Src_RT"),
                    resultSet.getString("Q_Targ_SWID"),resultSet.getString("Q_Targ_RT"),resultSet.getString("Q_QueueType"),resultSet.getString("Q_QueueEntity"),resultSet.getString("Q_QueueSuffix"),
                    resultSet.getString("Q_QueueNeutral"),resultSet.getString("CommonEntity"),resultSet.getString("CommonProcess"),resultSet.getString("CommonAddrpar"),resultSet.getString("DDName")));
        }

        return result;
    }

}


package com.ubs.FYC.Config.Cloner.utils;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.ubs.FYC.Config.Cloner.model.TableModel;

public class TestData_DataSource implements FYC_DataSource {

 @Override
 public List<TableModel> getData() throws SQLException {

  List<TableModel> result = new ArrayList<TableModel>();
  result.add(new TableModel("ON","C1", "GD5", "BulkTrigger", "GD5CC1", "6", "GD5C1.GD500.LF00.TRANSMIT", "<Group Key='AllQueues'>\n<define Key='BulkAgentTransactionId' Value=G503\n</Group>", "", "", "", "", "", "", "","", "", "", "", "FYCLIBPX"));
  result.add(new TableModel("ON","CA", "FYC", "BulkAgent", "FYCBCA", "1", "CVSHeader", "*\n*RCSFile\n*CVS Author: M.Tugan\n*", "", "", "", "", "", "", "","", "", "", "", "FYCLIBPX"));
  result.add(new TableModel("ON","P0", "ABC", "Trigger", "ABCTP0", "5", "Default", "<Group Key='AllQueues'>\n<define Key='BulkAgentTransactionId' Value=G503\n</Group>", "", "", "", "", "", "", "","", "", "", "", "FYCLIBPX"));
  result.add(new TableModel("ON","I4", "XYZ", "Listener", "ED1BI4", "5", "Default", "<Group Key='AllQueues'>\n<define Key='BulkAgentTransactionId' Value=G503\n</Group>", "", "", "", "", "", "", "","", "", "", "", "FYCLIBPX"));
 
  return result;
 }
}

Im TableModelController, TaskTableController bzw. ChangeTaskTableController greife ich darauf wie folgt zu:

Java:
test1.controller;

import java.sql.SQLException;
import java.util.ArrayList;
//import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.ubs.FYC.Config.Cloner.model.TableModel;
import com.ubs.FYC.Config.Cloner.utils.FYC_DataSource;

public class TableModelController {

    List<TableModel> resultData = new ArrayList<TableModel>();

    private FYC_DataSource dataSource;

    public TableModelController(FYC_DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public List<TableModel> loadData(Map<String,String> filter) {

        try {
            resultData.clear();
            resultData = dataSource.getData();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //TODO
        if (filter!=null)
            for (Object key:filter.keySet()) {
                String filterValue=filter.get(key).toString();


                //                List<String> fieldNames = Arrays.asList("Active", "Runtime");
                //                fieldNames.forEach(fieldName -> {                   
                //                    if (key.toString().equals(fieldName)) resultData=resultData.stream().filter(t-> t.get(fieldName).equals(filterValue)).collect(Collectors.toList());
                //                });

                if (key.toString().equals("Active")) resultData=resultData.stream().filter(t-> t.getActive().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Runtime")) resultData=resultData.stream().filter(t-> t.getRuntime().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("SWID")) resultData=resultData.stream().filter(t-> t.getSWID().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Type")) resultData=resultData.stream().filter(t-> t.getType().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Member")) resultData=resultData.stream().filter(t-> t.getMember().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("BlockType")) resultData=resultData.stream().filter(t-> t.getBlockType().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("BlockName")) resultData=resultData.stream().filter(t-> t.getBlockName().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Content")) resultData=resultData.stream().filter(t-> t.getContent().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Q_Src_SWID")) resultData=resultData.stream().filter(t-> t.getQ_Src_SWID().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Q_Src_RT")) resultData=resultData.stream().filter(t-> t.getQ_Src_RT().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Q_Targ_SWID")) resultData=resultData.stream().filter(t-> t.getQ_Targ_SWID().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Q_Targ_RT")) resultData=resultData.stream().filter(t-> t.getQ_Targ_RT().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Q_QueueType")) resultData=resultData.stream().filter(t-> t.getQ_QueueType().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Q_QueueEntity")) resultData=resultData.stream().filter(t-> t.getQ_QueueEntity().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Q_QueueSuffix")) resultData=resultData.stream().filter(t-> t.getQ_QueueSuffix().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("Q_QueueNeutral")) resultData=resultData.stream().filter(t-> t.getQ_QueueNeutral().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("CommonEntity")) resultData=resultData.stream().filter(t-> t.getCommonEntity().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("CommonProcess")) resultData=resultData.stream().filter(t-> t.getCommonProcess().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("CommonAddrpar")) resultData=resultData.stream().filter(t-> t.getCommonAddrpar().equals(filterValue)).collect(Collectors.toList());
                if (key.toString().equals("DDName")) resultData=resultData.stream().filter(t-> t.getDDName().equals(filterValue)).collect(Collectors.toList());
            }
        return resultData;
    }

}


package test1.controller;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.ubs.FYC.Config.Cloner.model.TaskTableModel;
import com.ubs.FYC.Config.Cloner.utils.TaskTable_DataSource;

public class TaskTableController {
 
 List<TaskTableModel> testData = new ArrayList<TaskTableModel>();
 List<TaskTableModel> resultData = new ArrayList<TaskTableModel>();
 
 Map<String, String> filterMap= new HashMap<String,String>();
 
 public void generateTestData() {
 
//  for (int i=0;i<10;++i) {
//   testData.add(new TableModel(String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i)));
//  }
//  testData.add(new TaskTableModel("ON","C1", "GD5", "BulkTrigger", "GD5CC1", "6", "GD5C1.GD500.LF00.TRANSMIT", "Paloma", "FYCLIBPX"));
//  testData.add(new TaskTableModel("ON","CA", "FYC", "BulkAgent", "FYCBC1", "1", "CVSHeader", "*\n*Potzblitz Author: M.Tugan\n*", "FYCLIBPX"));
 }
 
 public List<TaskTableModel> loadData(Map<String,String> filter) {
  resultData.clear();
  TaskTable_DataSource ttdata= new TaskTable_DataSource();
  ResultSet rs=ttdata.DBinterfaceT();
  try {
   while (rs.next()) {
    resultData.add(new TaskTableModel(" X ",rs.getString("ID"),rs.getString("State"),rs.getString("SWID"),rs.getString("Runtime"),rs.getString("Key"),
      rs.getString("NewSWID"),rs.getString("NewRuntime"),rs.getString("Errors"),rs.getString("CLog_Who"),rs.getString("CLog_Date"),rs.getString("CLog_Release"),rs.getString("CLog_Task")));
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
  //testData.clear();
//  generateTestData();
  //resultData=testData;
  //if (!filter.equals("")) resultData= testData.stream().filter(t -> t.getActive().equals(filter)).collect(Collectors.toList());
  if (filter!=null)
   for (Object key:filter.keySet()) {
    String filterValue=filter.get(key).toString();
    if (key.toString().equals("ID")) resultData=resultData.stream().filter(t-> t.getId().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("State")) resultData=resultData.stream().filter(t-> t.getState().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("SWID")) resultData=resultData.stream().filter(t-> t.getSWID().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("Runtime")) resultData=resultData.stream().filter(t-> t.getRuntime().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("Key")) resultData=resultData.stream().filter(t-> t.getKey().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("NewSWID")) resultData=resultData.stream().filter(t-> t.getNewSWID().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("NewRuntime")) resultData=resultData.stream().filter(t-> t.getNewRuntime().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("Errors")) resultData=resultData.stream().filter(t-> t.getErrors().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("CLog_Who")) resultData=resultData.stream().filter(t-> t.getCLog_Who().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("CLog_Date")) resultData=resultData.stream().filter(t-> t.getCLog_Date().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("CLog_Release")) resultData=resultData.stream().filter(t-> t.getCLog_Release().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("CLog_Task")) resultData=resultData.stream().filter(t-> t.getCLog_Task().equals(filterValue)).collect(Collectors.toList());
   }
  return resultData;
 }

}


package test1.controller;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.ubs.FYC.Config.Cloner.model.ChangeTaskTableModel;
//import com.ubs.FYC.Config.Cloner.model.TableModel;
//import com.ubs.FYC.Config.Cloner.model.TaskTableModel;
import com.ubs.FYC.Config.Cloner.utils.ChangeTaskTable_DataSource;
//import com.ubs.FYC.Config.Cloner.utils.MSAccess_DataSource;
//import com.ubs.FYC.Config.Cloner.utils.TaskTable_DataSource;

public class ChangeTaskTableController {

 static List<ChangeTaskTableModel> testData = new ArrayList<ChangeTaskTableModel>();
 static List<ChangeTaskTableModel> resultData = new ArrayList<ChangeTaskTableModel>();

 Map<String, String> filterMap= new HashMap<String,String>();

 public static void generateTestData() {
  //  for (int i=0;i<10;++i) {
  //   testData.add(new TableModel(String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i), String.valueOf(i)));
  //  }
  //  testData.add(new ChngTaskTableModel("ON","C1", "GD5", "BulkTrigger", "GD5CC1"));
  //  testData.add(new ChngTaskTableModel("ON","CA", "FYC", "BulkAgent", "FYCBC1"));
 }

 public List<ChangeTaskTableModel> loadData(Map<String,String> filter) {
  resultData.clear();
  ChangeTaskTable_DataSource ttdata= new ChangeTaskTable_DataSource();
  ResultSet rs=ttdata.DBinterfaceT();
  try {
   while (rs.next()) {
    resultData.add(new ChangeTaskTableModel(rs.getString("TaskID"),rs.getString("Key"),rs.getString("QKey"),rs.getString("QValue"),rs.getString("NewValue")));
   }
  } catch (SQLException e) {
   e.printStackTrace();
  }
  //testData.clear();
  //generateTestData();
  //resultData=testData;
  //if (!filter.equals("")) resultData= testData.stream().filter(t -> t.getActive().equals(filter)).collect(Collectors.toList());
  if (filter!=null)
   for (Object key:filter.keySet()) {
    String filterValue=filter.get(key).toString();
    if (key.toString().equals("TaskID")) resultData=resultData.stream().filter(t-> t.getTaskID().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("Key")) resultData=resultData.stream().filter(t-> t.getKey().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("Key")) resultData=resultData.stream().filter(t-> t.getQKey().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("QValue")) resultData=resultData.stream().filter(t-> t.getQValue().equals(filterValue)).collect(Collectors.toList());
    if (key.toString().equals("NewValue")) resultData=resultData.stream().filter(t-> t.getNewValue().equals(filterValue)).collect(Collectors.toList());
   }
  return resultData;
 }

}
 

Neue Themen


Oben