blob: e735776a32fd42d117f715fc72f8588a3d2788ce [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;
margaretha6cd27f32019-01-24 14:47:47 +01005import de.ids_mannheim.korap.validator.Validator;
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
margaretha0bcde4c2019-01-23 19:08:51 +010019 public DataFactory dataFactory = DataFactory.getFactory();
margaretha0866a532019-01-22 17:52:40 +010020
margaretha0bcde4c2019-01-23 19:08:51 +010021 @Deprecated
Michael Hanlfb5bdd92016-06-08 11:29:47 +020022 @Getter
23 @Setter
Michael Hanl0320dca2016-01-27 21:08:25 +010024 private Integer id;
25 @Getter(AccessLevel.PRIVATE)
Michael Hanlfb5bdd92016-06-08 11:29:47 +020026 private Object data;
margaretha0bcde4c2019-01-23 19:08:51 +010027 @Deprecated
Michael Hanlfb5bdd92016-06-08 11:29:47 +020028 @Getter
Michael Hanlc0ed00f2016-06-23 14:33:10 +020029 @Setter
30 private Integer userId;
margaretha0866a532019-01-22 17:52:40 +010031
Michael Hanlc0ed00f2016-06-23 14:33:10 +020032 public Userdata () {
33 this(-1);
34 }
35
margaretha0866a532019-01-22 17:52:40 +010036 // EM: replace with username
37 @Deprecated
Michael Hanlc0ed00f2016-06-23 14:33:10 +020038 public Userdata(Integer userid) {
39 this.userId = userid;
Michael Hanl0320dca2016-01-27 21:08:25 +010040 this.id = -1;
margaretha0866a532019-01-22 17:52:40 +010041 this.data = dataFactory.convertData(null);
Michael Hanl0320dca2016-01-27 21:08:25 +010042 }
43
margaretha0bcde4c2019-01-23 19:08:51 +010044 public Userdata (String data) {
45 this.data = dataFactory.convertData(data);
margaretha0866a532019-01-22 17:52:40 +010046 }
Michael Hanl8abaf9e2016-05-23 16:46:35 +020047
48 public int size () {
margaretha0866a532019-01-22 17:52:40 +010049 return dataFactory.size(this.data);
Michael Hanl0320dca2016-01-27 21:08:25 +010050 }
51
Michael Hanl8abaf9e2016-05-23 16:46:35 +020052
53 public Object get (String key) {
margaretha0866a532019-01-22 17:52:40 +010054 return dataFactory.getValue(this.data, key);
Michael Hanl0320dca2016-01-27 21:08:25 +010055 }
56
Michael Hanl2de64112016-07-02 17:13:34 +020057 public Object filter(String ... keys) {
margaretha0866a532019-01-22 17:52:40 +010058 return dataFactory.filter(this.data, keys);
Michael Hanl2de64112016-07-02 17:13:34 +020059 }
60
Michael Hanl8abaf9e2016-05-23 16:46:35 +020061
Michael Hanldaf86602016-05-12 14:31:52 +020062 /**
Michael Hanl8abaf9e2016-05-23 16:46:35 +020063 *
Michael Hanldaf86602016-05-12 14:31:52 +020064 * @return
65 */
Michael Hanl8abaf9e2016-05-23 16:46:35 +020066 public boolean isValid () {
margaretha0866a532019-01-22 17:52:40 +010067 return findMissingFields().length == 0;
Michael Hanlc2a9f622016-01-28 16:40:06 +010068 }
69
Michael Hanl8abaf9e2016-05-23 16:46:35 +020070
margaretha0866a532019-01-22 17:52:40 +010071 public String[] findMissingFields () {
Michael Hanlfb5bdd92016-06-08 11:29:47 +020072 Set<String> missing = new HashSet<>();
margaretha0866a532019-01-22 17:52:40 +010073 Set<String> keys = dataFactory.keys(this.data);
Michael Hanlfb5bdd92016-06-08 11:29:47 +020074 for (String key : requiredFields()) {
75 if (!keys.contains(key))
76 missing.add(key);
Michael Hanlc2a9f622016-01-28 16:40:06 +010077 }
Michael Hanlfb5bdd92016-06-08 11:29:47 +020078 return missing.toArray(new String[0]);
Michael Hanl0320dca2016-01-27 21:08:25 +010079 }
80
Michael Hanl8abaf9e2016-05-23 16:46:35 +020081
82 public void checkRequired () throws KustvaktException {
margaretha0866a532019-01-22 17:52:40 +010083 String[] fields = findMissingFields();
84 if (findMissingFields().length != 0) {
margaretha6374f722018-04-17 18:45:57 +020085 throw new KustvaktException(userId, StatusCodes.MISSING_PARAMETER,
Michael Hanlfb5bdd92016-06-08 11:29:47 +020086 "User data object not valid. Object has missing fields!",
87 Arrays.asList(fields).toString());
Michael Hanl5fac8ab2016-01-29 16:33:04 +010088 }
89 }
90
Michael Hanl8abaf9e2016-05-23 16:46:35 +020091
Michael Hanlfb5bdd92016-06-08 11:29:47 +020092 //fixme: if data array, return empty?!
Michael Hanl8abaf9e2016-05-23 16:46:35 +020093 public Set<String> keys () {
margaretha0866a532019-01-22 17:52:40 +010094 return dataFactory.keys(this.data);
Michael Hanl0320dca2016-01-27 21:08:25 +010095 }
96
Michael Hanl8abaf9e2016-05-23 16:46:35 +020097
98 public Collection<Object> values () {
margaretha0866a532019-01-22 17:52:40 +010099 return dataFactory.values(this.data);
Michael Hanl5fac8ab2016-01-29 16:33:04 +0100100 }
101
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200102
103 public void setData (String data) {
margaretha0866a532019-01-22 17:52:40 +0100104 this.data = dataFactory.convertData(data);
Michael Hanl0320dca2016-01-27 21:08:25 +0100105 }
106
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200107
108 public void update (Userdata other) {
Michael Hanl5fac8ab2016-01-29 16:33:04 +0100109 if (other != null && this.getClass().equals(other.getClass()))
margaretha0866a532019-01-22 17:52:40 +0100110 this.data = dataFactory.merge(this.data, other.data);
Michael Hanlc2a9f622016-01-28 16:40:06 +0100111 }
112
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200113
Michael Hanlfb5bdd92016-06-08 11:29:47 +0200114 public String serialize () throws KustvaktException {
115 // to have consistency with required fields --> updates/deletion may cause required fields to be missing.
116 this.checkRequired();
margaretha0866a532019-01-22 17:52:40 +0100117 return dataFactory.toStringValue(this.data);
Michael Hanl0320dca2016-01-27 21:08:25 +0100118 }
119
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200120
121 public void setField (String key, Object value) {
margaretha0866a532019-01-22 17:52:40 +0100122 dataFactory.addValue(this.data, key, value);
Michael Hanl0320dca2016-01-27 21:08:25 +0100123 }
124
margaretha6cd27f32019-01-24 14:47:47 +0100125 // EM: de.ids_mannheim.korap.interfaces.defaults.ApacheValidator.validateMap(Map<String, Object>)
126 // is not reliable
Michael Hanlc0ed00f2016-06-23 14:33:10 +0200127 // todo: test
margaretha6cd27f32019-01-24 14:47:47 +0100128 public void validate (Validator validator) throws KustvaktException {
margaretha0866a532019-01-22 17:52:40 +0100129 dataFactory.validate(this.data, validator);
Michael Hanl5fac8ab2016-01-29 16:33:04 +0100130 }
131
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200132
Michael Hanlfb5bdd92016-06-08 11:29:47 +0200133 public void read (Map<String, Object> map, boolean defaults_only)
134 throws KustvaktException {
135 this.readQuietly(map, defaults_only);
Michael Hanl25aac542016-02-01 18:16:44 +0100136 this.checkRequired();
Michael Hanl5fac8ab2016-01-29 16:33:04 +0100137 }
138
Michael Hanl0320dca2016-01-27 21:08:25 +0100139
Michael Hanlfb5bdd92016-06-08 11:29:47 +0200140 public void readQuietly (Map<String, Object> map, boolean defaults_only) {
margaretha0866a532019-01-22 17:52:40 +0100141 if (map != null){
142 if (defaults_only) {
143 for (String k : defaultFields()) {
144 Object o = map.get(k);
145 if (o != null) {
146 dataFactory.addValue(this.data, k, o);
147 }
Michael Hanlfb5bdd92016-06-08 11:29:47 +0200148 }
149 }
margaretha0866a532019-01-22 17:52:40 +0100150 else {
151 for (String key : map.keySet())
152 dataFactory.addValue(this.data, key, map.get(key));
153 }
Michael Hanlfb5bdd92016-06-08 11:29:47 +0200154 }
155 }
156
margaretha0bcde4c2019-01-23 19:08:51 +0100157 // EM: added
158 public boolean removeField (String field) {
159 return dataFactory.removeValue(this.data, field);
160 }
161
Michael Hanl8abaf9e2016-05-23 16:46:35 +0200162 public abstract String[] requiredFields ();
163
164
165 public abstract String[] defaultFields ();
Michael Hanl5fac8ab2016-01-29 16:33:04 +0100166
Michael Hanl0320dca2016-01-27 21:08:25 +0100167}