blob: bb3250d6cfd8f76d3e9855f9b0bc00893989892c [file] [log] [blame]
package de.ids_mannheim.korap.user;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
import de.ids_mannheim.korap.interfaces.EncryptionIface;
import de.ids_mannheim.korap.utils.JsonUtils;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import java.util.*;
/**
* @author hanl
* @date 22/01/2016
*/
@Data
public abstract class Userdata {
private Integer id;
@Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE)
private Map<String, Object> fields;
@Setter(AccessLevel.PRIVATE)
private Integer userID;
public Userdata (Integer userid) {
this.fields = new HashMap<>();
this.userID = userid;
this.id = -1;
}
public void setData (Map<String, Object> map) throws KustvaktException {
Set missing = missing(map);
if (!missing.isEmpty())
throw new KustvaktException(StatusCodes.MISSING_ARGUMENTS,
missing.toString());
this.fields.clear();
this.fields.putAll(map);
}
private Set<String> missing (Map<String, Object> map) {
Set<String> missing = new HashSet<>();
for (String key : requiredFields()) {
if (!map.containsKey(key))
missing.add(key);
}
return missing;
}
public int size () {
return this.fields.size();
}
public Object get (String key) {
return this.fields.get(key);
}
/**
*
* @return
*/
public boolean isValid () {
return missing().length == 0;
}
public String[] missing () {
StringBuilder b = new StringBuilder();
Set<String> m = missing(this.fields);
if (m.isEmpty())
return new String[0];
for (String k : m) {
b.append(k).append(";");
}
return b.toString().split(";");
}
public void checkRequired () throws KustvaktException {
if (!isValid()) {
String[] fields = missing();
throw new KustvaktException(StatusCodes.MISSING_ARGUMENTS,
"User data object not valid. Missing fields: "
+ Arrays.asList(fields));
}
}
public Set<String> keys () {
return this.fields.keySet();
}
public Collection<Object> values () {
return this.fields.values();
}
public Map<String, Object> fields () {
return new HashMap<>(this.fields);
}
public void setData (String data) {
Map m = JsonUtils.readSimple(data, Map.class);
if (m != null)
this.fields.putAll(m);
}
public void update (Userdata other) {
if (other != null && this.getClass().equals(other.getClass()))
this.fields.putAll(other.fields);
}
public String data () {
return JsonUtils.toJSON(this.fields);
}
public void setField (String key, Object value) {
this.fields.put(key, value);
}
public void validate (EncryptionIface crypto) throws KustvaktException {
this.fields = crypto.validateMap(this.fields);
}
public void readDefaults (Map<String, Object> map) throws KustvaktException {
for (String k : defaultFields()) {
Object o = map.get(k);
if (o != null)
this.fields.put(k, o);
}
this.checkRequired();
}
public abstract String[] requiredFields ();
public abstract String[] defaultFields ();
}