blob: d0135c8833c4656bb720a5282034fe4dafc58bd6 [file] [log] [blame]
Michael Hanl0320dca2016-01-27 21:08:25 +01001package de.ids_mannheim.korap.user;
2
3import de.ids_mannheim.korap.exceptions.KustvaktException;
4import de.ids_mannheim.korap.exceptions.StatusCodes;
Michael Hanlc0ed00f2016-06-23 14:33:10 +02005import de.ids_mannheim.korap.interfaces.ValidatorIface;
Michael Hanl0320dca2016-01-27 21:08:25 +01006import lombok.AccessLevel;
Michael Hanl0320dca2016-01-27 21:08:25 +01007import lombok.Getter;
8import lombok.Setter;
9
10import java.util.*;
11
12/**
margaretha0866a532019-01-22 17:52:40 +010013 * @author hanl, margaretha
Michael Hanl0320dca2016-01-27 21:08:25 +010014 * @date 22/01/2016
margaretha0866a532019-01-22 17:52:40 +010015 *
Michael Hanl0320dca2016-01-27 21:08:25 +010016 */
Michael Hanl0320dca2016-01-27 21:08:25 +010017public abstract class Userdata {
18
margaretha0866a532019-01-22 17:52:40 +010019 public static DataFactory dataFactory = DataFactory.getFactory();
20
Michael Hanlfb5bdd92016-06-08 11:29:47 +020021 @Getter
22 @Setter
Michael Hanl0320dca2016-01-27 21:08:25 +010023 private Integer id;
24 @Getter(AccessLevel.PRIVATE)
Michael Hanlfb5bdd92016-06-08 11:29:47 +020025 private Object data;
26 @Getter
Michael Hanlc0ed00f2016-06-23 14:33:10 +020027 @Setter
28 private Integer userId;
margaretha0866a532019-01-22 17:52:40 +010029
30 // EM: new
31 @Getter
32 @Setter
33 private String username;
34
Michael Hanlc0ed00f2016-06-23 14:33:10 +020035 public Userdata () {
36 this(-1);
37 }
38
margaretha0866a532019-01-22 17:52:40 +010039 // EM: replace with username
40 @Deprecated
Michael Hanlc0ed00f2016-06-23 14:33:10 +020041 public Userdata(Integer userid) {
42 this.userId = userid;
Michael Hanl0320dca2016-01-27 21:08:25 +010043 this.id = -1;
margaretha0866a532019-01-22 17:52:40 +010044 this.data = dataFactory.convertData(null);
Michael Hanl0320dca2016-01-27 21:08:25 +010045 }
46
margaretha0866a532019-01-22 17:52:40 +010047 // EM: new
48 public Userdata (String username) {
49 this.username = username;
50 this.id = -1;
51 this.data = dataFactory.convertData(null);
52 }
Michael Hanl8abaf9e2016-05-23 16:46:35 +020053
54 public int size () {
margaretha0866a532019-01-22 17:52:40 +010055 return dataFactory.size(this.data);
Michael Hanl0320dca2016-01-27 21:08:25 +010056 }
57
Michael Hanl8abaf9e2016-05-23 16:46:35 +020058
59 public Object get (String key) {
margaretha0866a532019-01-22 17:52:40 +010060 return dataFactory.getValue(this.data, key);
Michael Hanl0320dca2016-01-27 21:08:25 +010061 }
62
Michael Hanl2de64112016-07-02 17:13:34 +020063 public Object filter(String ... keys) {
margaretha0866a532019-01-22 17:52:40 +010064 return dataFactory.filter(this.data, keys);
Michael Hanl2de64112016-07-02 17:13:34 +020065 }
66
Michael Hanl8abaf9e2016-05-23 16:46:35 +020067
Michael Hanldaf86602016-05-12 14:31:52 +020068 /**
Michael Hanl8abaf9e2016-05-23 16:46:35 +020069 *
Michael Hanldaf86602016-05-12 14:31:52 +020070 * @return
71 */
Michael Hanl8abaf9e2016-05-23 16:46:35 +020072 public boolean isValid () {
margaretha0866a532019-01-22 17:52:40 +010073 return findMissingFields().length == 0;
Michael Hanlc2a9f622016-01-28 16:40:06 +010074 }
75
Michael Hanl8abaf9e2016-05-23 16:46:35 +020076
margaretha0866a532019-01-22 17:52:40 +010077 public String[] findMissingFields () {
Michael Hanlfb5bdd92016-06-08 11:29:47 +020078 Set<String> missing = new HashSet<>();
margaretha0866a532019-01-22 17:52:40 +010079 Set<String> keys = dataFactory.keys(this.data);
Michael Hanlfb5bdd92016-06-08 11:29:47 +020080 for (String key : requiredFields()) {
81 if (!keys.contains(key))
82 missing.add(key);
Michael Hanlc2a9f622016-01-28 16:40:06 +010083 }
Michael Hanlfb5bdd92016-06-08 11:29:47 +020084 return missing.toArray(new String[0]);
Michael Hanl0320dca2016-01-27 21:08:25 +010085 }
86
Michael Hanl8abaf9e2016-05-23 16:46:35 +020087
88 public void checkRequired () throws KustvaktException {
margaretha0866a532019-01-22 17:52:40 +010089 String[] fields = findMissingFields();
90 if (findMissingFields().length != 0) {
margaretha6374f722018-04-17 18:45:57 +020091 throw new KustvaktException(userId, StatusCodes.MISSING_PARAMETER,
Michael Hanlfb5bdd92016-06-08 11:29:47 +020092 "User data object not valid. Object has missing fields!",
93 Arrays.asList(fields).toString());
Michael Hanl5fac8ab2016-01-29 16:33:04 +010094 }
95 }
96
Michael Hanl8abaf9e2016-05-23 16:46:35 +020097
Michael Hanlfb5bdd92016-06-08 11:29:47 +020098 //fixme: if data array, return empty?!
Michael Hanl8abaf9e2016-05-23 16:46:35 +020099 public Set<String> keys () {
margaretha0866a532019-01-22 17:52:40 +0100100 return dataFactory.keys(this.data);
Michael Hanl0320dca2016-01-27 21:08:25 +0100101 }
102
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200103
104 public Collection<Object> values () {
margaretha0866a532019-01-22 17:52:40 +0100105 return dataFactory.values(this.data);
Michael Hanl5fac8ab2016-01-29 16:33:04 +0100106 }
107
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200108
109 public void setData (String data) {
margaretha0866a532019-01-22 17:52:40 +0100110 this.data = dataFactory.convertData(data);
Michael Hanl0320dca2016-01-27 21:08:25 +0100111 }
112
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200113
114 public void update (Userdata other) {
Michael Hanl5fac8ab2016-01-29 16:33:04 +0100115 if (other != null && this.getClass().equals(other.getClass()))
margaretha0866a532019-01-22 17:52:40 +0100116 this.data = dataFactory.merge(this.data, other.data);
Michael Hanlc2a9f622016-01-28 16:40:06 +0100117 }
118
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200119
Michael Hanlfb5bdd92016-06-08 11:29:47 +0200120 public String serialize () throws KustvaktException {
121 // to have consistency with required fields --> updates/deletion may cause required fields to be missing.
122 this.checkRequired();
margaretha0866a532019-01-22 17:52:40 +0100123 return dataFactory.toStringValue(this.data);
Michael Hanl0320dca2016-01-27 21:08:25 +0100124 }
125
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200126
127 public void setField (String key, Object value) {
margaretha0866a532019-01-22 17:52:40 +0100128 dataFactory.addValue(this.data, key, value);
Michael Hanl0320dca2016-01-27 21:08:25 +0100129 }
130
margaretha0866a532019-01-22 17:52:40 +0100131 // EM: not reliable
Michael Hanlc0ed00f2016-06-23 14:33:10 +0200132 // todo: test
133 public void validate (ValidatorIface validator) throws KustvaktException {
margaretha0866a532019-01-22 17:52:40 +0100134 dataFactory.validate(this.data, validator);
Michael Hanl5fac8ab2016-01-29 16:33:04 +0100135 }
136
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200137
Michael Hanlfb5bdd92016-06-08 11:29:47 +0200138 public void read (Map<String, Object> map, boolean defaults_only)
139 throws KustvaktException {
140 this.readQuietly(map, defaults_only);
Michael Hanl25aac542016-02-01 18:16:44 +0100141 this.checkRequired();
Michael Hanl5fac8ab2016-01-29 16:33:04 +0100142 }
143
Michael Hanl0320dca2016-01-27 21:08:25 +0100144
Michael Hanlfb5bdd92016-06-08 11:29:47 +0200145 public void readQuietly (Map<String, Object> map, boolean defaults_only) {
margaretha0866a532019-01-22 17:52:40 +0100146 if (map != null){
147 if (defaults_only) {
148 for (String k : defaultFields()) {
149 Object o = map.get(k);
150 if (o != null) {
151 dataFactory.addValue(this.data, k, o);
152 }
Michael Hanlfb5bdd92016-06-08 11:29:47 +0200153 }
154 }
margaretha0866a532019-01-22 17:52:40 +0100155 else {
156 for (String key : map.keySet())
157 dataFactory.addValue(this.data, key, map.get(key));
158 }
Michael Hanlfb5bdd92016-06-08 11:29:47 +0200159 }
160 }
161
162
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200163 public abstract String[] requiredFields ();
164
165
166 public abstract String[] defaultFields ();
Michael Hanl5fac8ab2016-01-29 16:33:04 +0100167
Michael Hanl0320dca2016-01-27 21:08:25 +0100168}