Hendrik Jungnitsch
2023-09-18 be053d7d5140b267dfc252d1c82161b6f9a593ca
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package de.gedoplan.seminar.sbt.di.exercise.domain;
 
import jakarta.persistence.*;
import java.text.Collator;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
 
@Entity
@Access(AccessType.FIELD)
@Table(name = Cocktail.TABLE_NAME)
public class Cocktail implements Comparable<Cocktail> {
  public static final String TABLE_NAME = "DI_COCKTAIL";
  public static final String TABLE_NAME_INGREDIENTS = "DI_COCKTAIL_INGREDIENT";
 
  public static final Comparator<Cocktail> NAME_COMPARATOR = new Comparator<Cocktail>() {
    @Override
    public int compare(Cocktail o1, Cocktail o2) {
      return Collator.getInstance().compare(o1.getName(), o2.getName());
    }
  };
 
  public static final Comparator<Cocktail> BASE_COMPARATOR = new Comparator<Cocktail>() {
    @Override
    public int compare(Cocktail o1, Cocktail o2) {
      String n1 = o1.getBase() != null ? o1.getBase().getName() : "";
      String n2 = o2.getBase() != null ? o2.getBase().getName() : "";
      return Collator.getInstance().compare(n1, n2);
    }
  };
 
  @Id
  private String id;
 
  private String name;
 
  @ElementCollection(fetch = FetchType.EAGER)
  @CollectionTable(name = TABLE_NAME_INGREDIENTS)
  @MapKeyJoinColumn(name = "BEVERAGE_ID")
  @Column(name = "AMOUNT")
  private Map<Beverage, Double> ingredients;
 
  @ManyToOne
  private Beverage base;
 
  public static CocktailBuilder builder(String id, String name) {
    return new CocktailBuilder(id, name);
  }
 
  public String getId() {
    return id;
  }
 
  public String getName() {
    return this.name;
  }
 
  public Beverage getBase() {
    return this.base;
  }
 
  public Map<Beverage, Double> getIngredients() {
    return Collections.unmodifiableMap(this.ingredients);
  }
 
  public boolean isAlcoholic() {
    for (Beverage zutat : this.ingredients.keySet()) {
      if (zutat.getAlcoholPercent() != 0) {
        return true;
      }
    }
    return false;
  }
 
  protected Cocktail() {
  }
 
  @Override
  public int compareTo(Cocktail o) {
    return NAME_COMPARATOR.compare(this, o);
  }
 
  private Cocktail(String id, String name) {
    this.id = id;
    this.name = name;
 
    this.ingredients = new HashMap<>();
  }
 
  public static class CocktailBuilder {
    private Cocktail cocktail;
 
    public CocktailBuilder(String id, String name) {
      this.cocktail = new Cocktail(id, name);
    }
 
    public CocktailBuilder ingredient(Beverage beverage, double amount) {
      if (this.cocktail.base == null) {
        this.cocktail.base = beverage;
      }
 
      this.cocktail.ingredients.put(beverage, amount);
 
      return this;
    }
 
    public Cocktail build() {
      return this.cocktail;
    }
  }
}