Hallo zusammen,
ich möchte gerne für jedes Attribut in meiner Klasse weitere Infos speichern, sodass ich später darauf basierend Listen erstellen kann, die ich dann in der WebGUI verwenden kann. (z.B. alle Felder von der Klasse Kunde, inkl. Business Namen)
Das wären Infos wie:
Ich habe nun in meiner Klasse "Customer" ein Enum angelegt:
Die Frage ist auch, wie erstelle ich in einer Zeile eine String-Liste und hänge dann mehrere Strings ein?
Ist das mit dem Enum so korrekt?
Ich frage auch in anderen Klassen direkt diese Felder ab:
if(Customer.EntityField.CUSTOMER_NAME.equals(....)
_____________
Prinzipiell möchte ich ebenfalls eine Lösung finden, mit welcher ich folgende (derzeit aufwändigen) Abfragen pro Feld vereinfachen kann.
1) Prüfen, ob die Bedingung stimmt.
-> Hier prüfen ich, ob der Wert von ObjectForCheck und dem Wert von RuleConditionComponent stimmt.
-> ObjectForCheck enthält eine Referenz auf Customer, welches hier geprüft wird.
-> RuleConditionComponent enthält ein Feld: value (oder auch valueDate, wenn es ein Date ist)
-> Prinzipiell möchte ich nicht dauernd die gleiche Abfrage für jedes Feld haben, sondern bestmöglich eine Schleife, in der ich dann eben die Felder prüfe.
- Die Idee ist, eine Schleife über die Enum Liste zu machen.
- Der Getter des jeweiligen Felds müsste ich dann aber entsprechend bekommen (bspw.: objectForCheck.getCustomer().getAcademicTitle())
Die nächste Methode, die ich derzeit für jedes Feld abfrage, liest mir den DatenTyp des Felds hinzu und gibt dann ein RuleConditionComponent Objekt zurück. Auch diese Abfrage lässt sich vereinfachen, indem ich eine Schleife über das ENUM mache und dann eben den ValueType dem RuleConditionComponent hinzufüge?
Die letzte Methode ist das Hinzufügen des Operators (Contains, Equals...).
Auch hier wäre das Auslesen aus dem Enum die einfachste Möglichkeit...?
Am Ende soll sowas herauskommen:
-> Sobald man ein Feld wählt, wird die Liste von Operatoren aktualisiert, ebenfalls den Feldwert.
-> Feldwert ist i.d.R. NULL, kann aber zB bei einer Auswahl des Geschlechts vorbelegt sein (HERR, FRAU)

Hat jemand Tipps? Sorry, falls es zu viel Text ist
Danke für die Hilfe
ich möchte gerne für jedes Attribut in meiner Klasse weitere Infos speichern, sodass ich später darauf basierend Listen erstellen kann, die ich dann in der WebGUI verwenden kann. (z.B. alle Felder von der Klasse Kunde, inkl. Business Namen)
Das wären Infos wie:
- fieldName; -> "CUSTOMER_NUMBER"
- languageName -> "Kundennummer" (kommt später von einer message.property)
- uniqueFieldName; -> "CUSTOMER_CUSTOMER_NUMBER"
- ruleRelevant; -> true
- List<EnumOpertor> operatorList; -> "NOT_EQUAL, CONTAINS"
- String valueType; -> "TEXT"
Ich habe nun in meiner Klasse "Customer" ein Enum angelegt:
Java:
public class Customer {
.....
public enum EntityField {
ACADEMIC_TITLE("ACADEMIC_TITLE", "Akademischer Titel", "ACADEMIC_TITLE", ValueType.TEXT, true), //
private String fieldName;
private Object fieldValue;
private String languageName;
/////////////////////////
private String uniqueFieldName;
private boolean ruleRelevant;
private List<String> operatorList;
private String valueType;
private EntityField(String fieldName, Object fieldValue, String languageName, String uniqueFieldName, String valueType,
boolean ruleRelevant, List<String> operatorList) {
this.fieldName = fieldName;
this.fieldValue = fieldValue;
this.languageName = languageName;
this.uniqueFieldName = uniqueFieldName;
this.ruleRelevant = ruleRelevant;
this.operatorList = operatorList;
this.valueType = valueType;
}
}
}
Die Frage ist auch, wie erstelle ich in einer Zeile eine String-Liste und hänge dann mehrere Strings ein?
Ist das mit dem Enum so korrekt?
Ich frage auch in anderen Klassen direkt diese Felder ab:
if(Customer.EntityField.CUSTOMER_NAME.equals(....)
_____________
Prinzipiell möchte ich ebenfalls eine Lösung finden, mit welcher ich folgende (derzeit aufwändigen) Abfragen pro Feld vereinfachen kann.
1) Prüfen, ob die Bedingung stimmt.
-> Hier prüfen ich, ob der Wert von ObjectForCheck und dem Wert von RuleConditionComponent stimmt.
-> ObjectForCheck enthält eine Referenz auf Customer, welches hier geprüft wird.
-> RuleConditionComponent enthält ein Feld: value (oder auch valueDate, wenn es ein Date ist)
-> Prinzipiell möchte ich nicht dauernd die gleiche Abfrage für jedes Feld haben, sondern bestmöglich eine Schleife, in der ich dann eben die Felder prüfe.
- Die Idee ist, eine Schleife über die Enum Liste zu machen.
- Der Getter des jeweiligen Felds müsste ich dann aber entsprechend bekommen (bspw.: objectForCheck.getCustomer().getAcademicTitle())
Java:
public static boolean customerCondition(ObjectForCheck objectForCheck, RuleConditionComponent ruleConditionComponent) {
LOGGER.info("START customerCondition");
if (objectForCheck.getCustomer() == null)
return false;
///////////////////
// ACADEMIC_TITLE
///////////////////
if (ruleConditionComponent.getFieldName()
.equals(Customer.ENTITY_NAME_SPACE + Customer.EntityField.ACADEMIC_TITLE.getFieldName())) {
if (objectForCheck.getCustomer().getAcademicTitle() == null)
return false;
if (ruleConditionComponent.getState().equals(RuleConditionComponent.ConditionState.EQUAL.toString())) {
if (objectForCheck.getCustomer().getAcademicTitle()
.equalsIgnoreCase(ruleConditionComponent.getValue())) {
return true;
}
}
if (ruleConditionComponent.getState().equals(RuleConditionComponent.ConditionState.NOT_EQUAL.toString())) {
if (!objectForCheck.getCustomer().getAcademicTitle()
.equalsIgnoreCase(ruleConditionComponent.getValue())) {
return true;
}
}
if (ruleConditionComponent.getState().equals(RuleConditionComponent.ConditionState.CONTAINS.toString())) {
if (objectForCheck.getCustomer().getAcademicTitle().toLowerCase()
.contains(ruleConditionComponent.getValue().toLowerCase())) {
return true;
}
}
if (!ruleConditionComponent.getState()
.equals(RuleConditionComponent.ConditionState.NOT_CONTAINS.toString())) {
if (!objectForCheck.getCustomer().getAcademicTitle().toLowerCase()
.contains(ruleConditionComponent.getValue().toLowerCase())) {
return true;
}
}
}
Die nächste Methode, die ich derzeit für jedes Feld abfrage, liest mir den DatenTyp des Felds hinzu und gibt dann ein RuleConditionComponent Objekt zurück. Auch diese Abfrage lässt sich vereinfachen, indem ich eine Schleife über das ENUM mache und dann eben den ValueType dem RuleConditionComponent hinzufüge?
Java:
/**
* CUSTOMER
*/
public static Object createCustomerRuleCondition(Object object) {
LOGGER.info("START createCustomerRuleCondition");
RuleConditionComponent ruleConditionComponent = null;
String fieldName = null;
if (object instanceof RuleConditionComponent) {
ruleConditionComponent = (RuleConditionComponent) object;
if (ruleConditionComponent.getFieldName() == null)
return null;
else
fieldName = ruleConditionComponent.getFieldName();
}
///////////////////
// ACADEMIC_TITLE
///////////////////
if (fieldName.equals(Customer.ENTITY_NAME_SPACE + Customer.EntityField.ACADEMIC_TITLE.getFieldName())) {
if (object instanceof RuleConditionComponent) {
ruleConditionComponent.setValueType(RuleConditionComponent.ValueType.TEXT.toString());
ruleConditionComponent.setValueDate(null);
ruleConditionComponent.setValue(null);
return ruleConditionComponent;
}
}
Die letzte Methode ist das Hinzufügen des Operators (Contains, Equals...).
Auch hier wäre das Auslesen aus dem Enum die einfachste Möglichkeit...?
Java:
/**
* CUSTOMER
*/
public static List<ObjectForSearchList> createCustomerOperator(Object object, String languageCode) {
List<ObjectForSearchList> list = new ArrayList<ObjectForSearchList>();
if (object == null)
return null;
RuleConditionComponent ruleConditionComponent = null;
String fieldName = null;
if (object instanceof RuleConditionComponent) {
ruleConditionComponent = (RuleConditionComponent) object;
if (ruleConditionComponent.getFieldName() == null)
return null;
else
fieldName = ruleConditionComponent.getFieldName();
}
///////////////////
// ACADEMIC_TITLE
///////////////////
if (fieldName.equals(Customer.ENTITY_NAME_SPACE + Customer.EntityField.ACADEMIC_TITLE.getFieldName())) {
if (object instanceof RuleConditionComponent) {
list.add(new ObjectForSearchList("Enthält", RuleConditionComponent.ConditionState.CONTAINS.toString()));
list.add(new ObjectForSearchList("Enthält nicht",
RuleConditionComponent.ConditionState.NOT_CONTAINS.toString()));
list.add(new ObjectForSearchList("Gleich", RuleConditionComponent.ConditionState.EQUAL.toString()));
list.add(new ObjectForSearchList("Ist nicht gleich",
RuleConditionComponent.ConditionState.NOT_EQUAL.toString()));
return list;
}
}
Am Ende soll sowas herauskommen:
-> Sobald man ein Feld wählt, wird die Liste von Operatoren aktualisiert, ebenfalls den Feldwert.
-> Feldwert ist i.d.R. NULL, kann aber zB bei einer Auswahl des Geschlechts vorbelegt sein (HERR, FRAU)

Hat jemand Tipps? Sorry, falls es zu viel Text ist
Danke für die Hilfe
Zuletzt bearbeitet: