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