package com.constellio.app.modules.tasks.model.wrappers.structures;
import com.constellio.model.entities.schemas.ModifiableStructure;
import com.constellio.model.entities.schemas.StructureFactory;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.joda.time.LocalDate;
import static com.constellio.model.entities.records.wrappers.structure.StructureFactoryUtils.newLocalDateJsonSerializerDeserializer;
import java.io.IOException;
public class TaskReminderFactory implements StructureFactory {
transient private GsonBuilder gsonBuilder;
transient private Gson gson;
public TaskReminderFactory() {
initTransientObjects();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
initTransientObjects();
}
private void initTransientObjects() {
ExclusionStrategy strategy = new ExclusionStrategy() {
@Override
public boolean shouldSkipField(FieldAttributes f) {
if (f.getName().equals("dirty")) {
return true;
}
return false;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
};
gsonBuilder = new GsonBuilder().setExclusionStrategies(strategy)
.registerTypeAdapter(LocalDate.class, newLocalDateJsonSerializerDeserializer());
gson = gsonBuilder.create();
}
@Override
public String toString(ModifiableStructure structure) {
return gson.toJson(structure);
}
@Override
public ModifiableStructure build(String serializedCriterion) {
TaskReminder returnReminder = new TaskReminder();
if (StringUtils.isNotBlank(serializedCriterion)) {
returnReminder = gson.fromJson(serializedCriterion, TaskReminder.class);
returnReminder = rebuildTaskReminder(returnReminder);
}
return returnReminder;
}
public TaskReminder rebuildTaskReminder(TaskReminder taskReminder) {
LocalDate fixedDate = taskReminder.getFixedDate();
Integer numberOfDaysInFlexibleDate = taskReminder.getNumberOfDaysToRelativeDate();
Boolean beforeFlexibleDate = taskReminder.isBeforeRelativeDate();
String flexibleDateMetadataCode = taskReminder.getRelativeDateMetadataCode();
boolean processed = taskReminder.isProcessed();
return new TaskReminder().setBeforeRelativeDate(beforeFlexibleDate).setFixedDate(fixedDate)
.setRelativeDateMetadataCode(flexibleDateMetadataCode)
.setNumberOfDaysToRelativeDate(numberOfDaysInFlexibleDate).setProcessed(processed)
.setDirty(false);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}