Skip to contentMethod: contains(String)
1: /*
2: * JOPA
3: * Copyright (C) 2023 Czech Technical University in Prague
4: *
5: * This library is free software; you can redistribute it and/or
6: * modify it under the terms of the GNU Lesser General Public
7: * License as published by the Free Software Foundation; either
8: * version 3.0 of the License, or (at your option) any later version.
9: *
10: * This library is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: * Lesser General Public License for more details.
14: *
15: * You should have received a copy of the GNU Lesser General Public
16: * License along with this library.
17: */
18: package cz.cvut.kbss.jopa.adapters;
19:
20: import cz.cvut.kbss.jopa.model.MultilingualString;
21: import cz.cvut.kbss.jopa.sessions.UnitOfWorkImpl;
22:
23: import java.lang.reflect.Field;
24: import java.util.Map;
25: import java.util.Objects;
26: import java.util.Set;
27:
28: /**
29: * Wraps a {@link MultilingualString} so that calls to modifying operations are intercepted and reported to the
30: * persistence context (if necessary).
31: */
32: public class IndirectMultilingualString extends MultilingualString implements IndirectWrapper {
33:
34: private final transient Object owner;
35: private final transient Field field;
36: private final transient UnitOfWorkImpl persistenceContext;
37:
38: private final MultilingualString referencedString;
39:
40: protected IndirectMultilingualString() {
41: this.owner = null;
42: this.field = null;
43: this.persistenceContext = null;
44: this.referencedString = new MultilingualString();
45: }
46:
47: /**
48: * Create new indirect multilingual string backed by the specified referenced {@link MultilingualString}.
49: *
50: * @param owner Owner of the string
51: * @param f The field holding this string
52: * @param uow Persistence context the owner belongs to
53: * @param referencedString The string to reference
54: * @throws NullPointerException If the {@code referencedString} is null
55: */
56: public IndirectMultilingualString(Object owner, Field f, UnitOfWorkImpl uow, MultilingualString referencedString) {
57: this.owner = owner;
58: this.field = f;
59: this.persistenceContext = Objects.requireNonNull(uow);
60: this.referencedString = Objects.requireNonNull(referencedString);
61: }
62:
63: private void notifyPersistenceContext() {
64: assert persistenceContext != null;
65: if (persistenceContext.isInTransaction() && !persistenceContext.isInCommit()) {
66: persistenceContext.attributeChanged(owner, field);
67: }
68: }
69:
70: @Override
71: public MultilingualString set(String language, String value) {
72: referencedString.set(language, value);
73: notifyPersistenceContext();
74: return this;
75: }
76:
77: @Override
78: public MultilingualString set(String value) {
79: referencedString.set(value);
80: notifyPersistenceContext();
81: return this;
82: }
83:
84: @Override
85: public String get(String language) {
86: return referencedString.get(language);
87: }
88:
89: @Override
90: public String get() {
91: return referencedString.get();
92: }
93:
94: @Override
95: public boolean contains(String language) {
96: return referencedString.contains(language);
97: }
98:
99: @Override
100: public boolean containsSimple() {
101: return referencedString.containsSimple();
102: }
103:
104: @Override
105: public boolean isEmpty() {
106: return referencedString.isEmpty();
107: }
108:
109: @Override
110: public void remove(String language) {
111: referencedString.remove(language);
112: notifyPersistenceContext();
113: }
114:
115: @Override
116: public Set<String> getLanguages() {
117: return referencedString.getLanguages();
118: }
119:
120: @Override
121: public Map<String, String> getValue() {
122: return referencedString.getValue();
123: }
124:
125: @Override
126: public boolean equals(Object o) {
127: if (o instanceof MultilingualString) {
128: if (o instanceof IndirectMultilingualString) {
129: return referencedString.equals(((IndirectMultilingualString) o).referencedString);
130: }
131: return referencedString.equals(o);
132: }
133: return false;
134: }
135:
136: @Override
137: public int hashCode() {
138: return referencedString.hashCode();
139: }
140:
141: @Override
142: public String toString() {
143: return referencedString.toString();
144: }
145:
146: @Override
147: public MultilingualString unwrap() {
148: return referencedString;
149: }
150: }