Skip to content

Package: ClassObjectMap

ClassObjectMap

nameinstructionbranchcomplexitylinemethod
ClassObjectMap()
M: 0 C: 8
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 3
100%
M: 0 C: 1
100%
copy()
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
equals(Object)
M: 4 C: 15
79%
M: 2 C: 2
50%
M: 2 C: 1
33%
M: 2 C: 4
67%
M: 0 C: 1
100%
get(Class)
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
getBySuperclass(Class)
M: 0 C: 17
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
hashCode()
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
isEmpty()
M: 0 C: 4
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
lambda$getBySuperclass$0(Class)
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
put(Object)
M: 0 C: 9
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
putAll(Object[])
M: 0 C: 6
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 2
100%
M: 0 C: 1
100%
putIfNotExists(Object)
M: 0 C: 17
100%
M: 0 C: 2
100%
M: 0 C: 2
100%
M: 0 C: 5
100%
M: 0 C: 1
100%
toString()
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
valueStream()
M: 0 C: 5
100%
M: 0 C: 0
100%
M: 0 C: 1
100%
M: 0 C: 1
100%
M: 0 C: 1
100%

Coverage

1: package util;
2:
3: import persist.Persistierer;
4:
5: import java.util.Arrays;
6: import java.util.HashMap;
7: import java.util.Map;
8: import java.util.Optional;
9: import java.util.Set;
10: import java.util.stream.Collectors;
11: import java.util.stream.Stream;
12:
13: /**
14: * eine Map, welche zu einer Klasse immer genau ein Objekt der Klasse halten kann.
15: *
16: * @param <T> Klasse, von welcher sämtliche Elemente in der Map erben müssen.
17: */
18: public class ClassObjectMap<T> {
19: private final Map<Class<? extends T>, T> map;
20:
21: /**
22: * erstellt eine neue {@link ClassObjectMap}.
23: */
24: public ClassObjectMap() {
25: this.map = new HashMap<>();
26: }
27:
28: /**
29: * fügt ein neues Element der {@link ClassObjectMap} hinzu. und ersetzt ggf. dabei das alte Element, falls es bereits eines derelben Klasse gab.
30: *
31: * @param element hinzuzufügendes Element.
32: * @return die {@link ClassObjectMap} selbst zum damit weiterarbeiten <3
33: */
34: public ClassObjectMap<T> put(final T element) {
35: this.map.put((Class<? extends T>) element.getClass(), element);
36: return this;
37: }
38:
39: /**
40: * {@link ClassObjectMap#put(Object)} für sämtliche übergegene Elemente.
41: *
42: * @param elements Übergebene Elemente in Form einer Liste.
43: */
44: @SafeVarargs
45: public final void putAll(final T... elements) {
46: Arrays.asList(elements).forEach(this::put);
47: }
48:
49: /**
50: * @param clazz Klasse deren Objekt geholt werden soll
51: * @param <E> Klasse deren Objekt geholt werden soll
52: * @return ein {@link java.util.Optional} des Objektes der Klasse clazz, welchem kein Element hinterlegt ist, wenn die Map kein Element der Klasse hinterlegt hat.
53: * ansonsten das hinterlegte Element.
54: */
55: public <E> Optional<E> get(final Class<E> clazz) {
56: return Optional.ofNullable((E) this.map.get(clazz));
57: }
58:
59: /**
60: * @return erstellt eine DeepCopy der {@link ClassObjectMap}.
61: */
62: public ClassObjectMap<T> copy() {
63: return (ClassObjectMap<T>) Persistierer.vonXML(Persistierer.zuXML(this));
64: }
65:
66: /**
67: * @param clazz Klasse bzw. Interface, zu welchem alle Objekte geholt werden sollen, die diese Klasse/ Interfacew sind, erweitern oder implementieren.
68: * @param <U> Klasse bzw. Interface, zu welchem alle Objekte geholt werden sollen, die diese Klasse/ Interfacew sind, erweitern oder implementieren.
69: * @return Set von Objekten, welche {@code clazz} sind, erweitern oder implementieren.
70: */
71: public <U> Set<U> getBySuperclass(final Class<U> clazz) {
72: return this.map.keySet().stream().filter(clazz::isAssignableFrom).map(key -> (U) this.map.get(key))
73: .collect(Collectors.toSet());
74: }
75:
76: /**
77: * Liefert true, wenn die Map keine Einträge besitzt.
78: *
79: * @return true, wenn die Map keine Einträge besitzt.
80: */
81: public boolean isEmpty() {
82: return this.map.isEmpty();
83: }
84:
85: @Override
86: public String toString() {
87: return this.map.values().toString();
88: }
89:
90: /**
91: * @return liefert einen Stream sämtlicher Werte aus der {@link ClassObjectMap}.
92: */
93: public Stream<T> valueStream() {
94: return this.map.values().stream();
95: }
96:
97: @Override
98: public boolean equals(final Object o) {
99:• if (this == o) {
100: return true;
101: }
102:• if (!(o instanceof ClassObjectMap)) {
103: return false;
104: }
105:
106: final ClassObjectMap<?> that = (ClassObjectMap<?>) o;
107:
108: return this.map.equals(that.map);
109: }
110:
111: @Override
112: public int hashCode() {
113: return this.map.hashCode();
114: }
115:
116: /**
117: * fügt das gegebene Element der {@link ClassObjectMap} hinzu, falls kein Element des Typen bereits in der Map ist.
118: *
119: * @param element
120: *                 ggfs. hinzuzufügendes Element.
121: * @param <U>
122: *                 Typ des Elements das hinzugefügt wird, bzw. schon drin ist.
123: *
124: * @return das Element, welches drin lag, falls schon eins da war, sonst das neu hinzugefügte.
125: */
126: public <U extends T> U putIfNotExists(final U element) {
127: final Optional<?> o = this.get(element.getClass());
128:• if (!o.isPresent()) {
129: this.put(element);
130: return element;
131: }
132: return (U) o.get();
133: }
134: }