| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 1 | package de.ids_mannheim.korap.user; |
| 2 | |
| 3 | import de.ids_mannheim.korap.exceptions.KustvaktException; |
| 4 | import de.ids_mannheim.korap.exceptions.StatusCodes; |
| margaretha | 6cd27f3 | 2019-01-24 14:47:47 +0100 | [diff] [blame^] | 5 | import de.ids_mannheim.korap.validator.Validator; |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 6 | import lombok.AccessLevel; |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 7 | import lombok.Getter; |
| 8 | import lombok.Setter; |
| 9 | |
| 10 | import java.util.*; |
| 11 | |
| 12 | /** |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 13 | * @author hanl, margaretha |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 14 | * @date 22/01/2016 |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 15 | * |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 16 | */ |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 17 | public abstract class Userdata { |
| 18 | |
| margaretha | 0bcde4c | 2019-01-23 19:08:51 +0100 | [diff] [blame] | 19 | public DataFactory dataFactory = DataFactory.getFactory(); |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 20 | |
| margaretha | 0bcde4c | 2019-01-23 19:08:51 +0100 | [diff] [blame] | 21 | @Deprecated |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 22 | @Getter |
| 23 | @Setter |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 24 | private Integer id; |
| 25 | @Getter(AccessLevel.PRIVATE) |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 26 | private Object data; |
| margaretha | 0bcde4c | 2019-01-23 19:08:51 +0100 | [diff] [blame] | 27 | @Deprecated |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 28 | @Getter |
| Michael Hanl | c0ed00f | 2016-06-23 14:33:10 +0200 | [diff] [blame] | 29 | @Setter |
| 30 | private Integer userId; |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 31 | |
| Michael Hanl | c0ed00f | 2016-06-23 14:33:10 +0200 | [diff] [blame] | 32 | public Userdata () { |
| 33 | this(-1); |
| 34 | } |
| 35 | |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 36 | // EM: replace with username |
| 37 | @Deprecated |
| Michael Hanl | c0ed00f | 2016-06-23 14:33:10 +0200 | [diff] [blame] | 38 | public Userdata(Integer userid) { |
| 39 | this.userId = userid; |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 40 | this.id = -1; |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 41 | this.data = dataFactory.convertData(null); |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 42 | } |
| 43 | |
| margaretha | 0bcde4c | 2019-01-23 19:08:51 +0100 | [diff] [blame] | 44 | public Userdata (String data) { |
| 45 | this.data = dataFactory.convertData(data); |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 46 | } |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 47 | |
| 48 | public int size () { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 49 | return dataFactory.size(this.data); |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 50 | } |
| 51 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 52 | |
| 53 | public Object get (String key) { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 54 | return dataFactory.getValue(this.data, key); |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 55 | } |
| 56 | |
| Michael Hanl | 2de6411 | 2016-07-02 17:13:34 +0200 | [diff] [blame] | 57 | public Object filter(String ... keys) { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 58 | return dataFactory.filter(this.data, keys); |
| Michael Hanl | 2de6411 | 2016-07-02 17:13:34 +0200 | [diff] [blame] | 59 | } |
| 60 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 61 | |
| Michael Hanl | daf8660 | 2016-05-12 14:31:52 +0200 | [diff] [blame] | 62 | /** |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 63 | * |
| Michael Hanl | daf8660 | 2016-05-12 14:31:52 +0200 | [diff] [blame] | 64 | * @return |
| 65 | */ |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 66 | public boolean isValid () { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 67 | return findMissingFields().length == 0; |
| Michael Hanl | c2a9f62 | 2016-01-28 16:40:06 +0100 | [diff] [blame] | 68 | } |
| 69 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 70 | |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 71 | public String[] findMissingFields () { |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 72 | Set<String> missing = new HashSet<>(); |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 73 | Set<String> keys = dataFactory.keys(this.data); |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 74 | for (String key : requiredFields()) { |
| 75 | if (!keys.contains(key)) |
| 76 | missing.add(key); |
| Michael Hanl | c2a9f62 | 2016-01-28 16:40:06 +0100 | [diff] [blame] | 77 | } |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 78 | return missing.toArray(new String[0]); |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 79 | } |
| 80 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 81 | |
| 82 | public void checkRequired () throws KustvaktException { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 83 | String[] fields = findMissingFields(); |
| 84 | if (findMissingFields().length != 0) { |
| margaretha | 6374f72 | 2018-04-17 18:45:57 +0200 | [diff] [blame] | 85 | throw new KustvaktException(userId, StatusCodes.MISSING_PARAMETER, |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 86 | "User data object not valid. Object has missing fields!", |
| 87 | Arrays.asList(fields).toString()); |
| Michael Hanl | 5fac8ab | 2016-01-29 16:33:04 +0100 | [diff] [blame] | 88 | } |
| 89 | } |
| 90 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 91 | |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 92 | //fixme: if data array, return empty?! |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 93 | public Set<String> keys () { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 94 | return dataFactory.keys(this.data); |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 95 | } |
| 96 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 97 | |
| 98 | public Collection<Object> values () { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 99 | return dataFactory.values(this.data); |
| Michael Hanl | 5fac8ab | 2016-01-29 16:33:04 +0100 | [diff] [blame] | 100 | } |
| 101 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 102 | |
| 103 | public void setData (String data) { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 104 | this.data = dataFactory.convertData(data); |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 105 | } |
| 106 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 107 | |
| 108 | public void update (Userdata other) { |
| Michael Hanl | 5fac8ab | 2016-01-29 16:33:04 +0100 | [diff] [blame] | 109 | if (other != null && this.getClass().equals(other.getClass())) |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 110 | this.data = dataFactory.merge(this.data, other.data); |
| Michael Hanl | c2a9f62 | 2016-01-28 16:40:06 +0100 | [diff] [blame] | 111 | } |
| 112 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 113 | |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 114 | public String serialize () throws KustvaktException { |
| 115 | // to have consistency with required fields --> updates/deletion may cause required fields to be missing. |
| 116 | this.checkRequired(); |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 117 | return dataFactory.toStringValue(this.data); |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 118 | } |
| 119 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 120 | |
| 121 | public void setField (String key, Object value) { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 122 | dataFactory.addValue(this.data, key, value); |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 123 | } |
| 124 | |
| margaretha | 6cd27f3 | 2019-01-24 14:47:47 +0100 | [diff] [blame^] | 125 | // EM: de.ids_mannheim.korap.interfaces.defaults.ApacheValidator.validateMap(Map<String, Object>) |
| 126 | // is not reliable |
| Michael Hanl | c0ed00f | 2016-06-23 14:33:10 +0200 | [diff] [blame] | 127 | // todo: test |
| margaretha | 6cd27f3 | 2019-01-24 14:47:47 +0100 | [diff] [blame^] | 128 | public void validate (Validator validator) throws KustvaktException { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 129 | dataFactory.validate(this.data, validator); |
| Michael Hanl | 5fac8ab | 2016-01-29 16:33:04 +0100 | [diff] [blame] | 130 | } |
| 131 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 132 | |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 133 | public void read (Map<String, Object> map, boolean defaults_only) |
| 134 | throws KustvaktException { |
| 135 | this.readQuietly(map, defaults_only); |
| Michael Hanl | 25aac54 | 2016-02-01 18:16:44 +0100 | [diff] [blame] | 136 | this.checkRequired(); |
| Michael Hanl | 5fac8ab | 2016-01-29 16:33:04 +0100 | [diff] [blame] | 137 | } |
| 138 | |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 139 | |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 140 | public void readQuietly (Map<String, Object> map, boolean defaults_only) { |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 141 | 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 Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 148 | } |
| 149 | } |
| margaretha | 0866a53 | 2019-01-22 17:52:40 +0100 | [diff] [blame] | 150 | else { |
| 151 | for (String key : map.keySet()) |
| 152 | dataFactory.addValue(this.data, key, map.get(key)); |
| 153 | } |
| Michael Hanl | fb5bdd9 | 2016-06-08 11:29:47 +0200 | [diff] [blame] | 154 | } |
| 155 | } |
| 156 | |
| margaretha | 0bcde4c | 2019-01-23 19:08:51 +0100 | [diff] [blame] | 157 | // EM: added |
| 158 | public boolean removeField (String field) { |
| 159 | return dataFactory.removeValue(this.data, field); |
| 160 | } |
| 161 | |
| Michael Hanl | 8abaf9e | 2016-05-23 16:46:35 +0200 | [diff] [blame] | 162 | public abstract String[] requiredFields (); |
| 163 | |
| 164 | |
| 165 | public abstract String[] defaultFields (); |
| Michael Hanl | 5fac8ab | 2016-01-29 16:33:04 +0100 | [diff] [blame] | 166 | |
| Michael Hanl | 0320dca | 2016-01-27 21:08:25 +0100 | [diff] [blame] | 167 | } |