All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jobrunr.utils.mapper.jsonb.adapters.JobDetailsAdapter Maven / Gradle / Ivy

package org.jobrunr.utils.mapper.jsonb.adapters;

import jakarta.json.Json;
import jakarta.json.JsonArray;
import jakarta.json.JsonArrayBuilder;
import jakarta.json.JsonObject;
import jakarta.json.JsonValue;
import jakarta.json.bind.adapter.JsonbAdapter;
import org.jobrunr.jobs.JobDetails;
import org.jobrunr.jobs.JobParameter;
import org.jobrunr.jobs.JobParameterNotDeserializableException;
import org.jobrunr.jobs.context.JobContext;
import org.jobrunr.utils.mapper.JobParameterJsonMapperException;
import org.jobrunr.utils.mapper.jsonb.JobRunrJsonb;

import java.util.ArrayList;
import java.util.List;

import static org.jobrunr.utils.mapper.JsonMapperUtils.Json.FIELD_ACTUAL_CLASS_NAME;
import static org.jobrunr.utils.mapper.JsonMapperUtils.Json.FIELD_CACHEABLE;
import static org.jobrunr.utils.mapper.JsonMapperUtils.Json.FIELD_CLASS_NAME;
import static org.jobrunr.utils.mapper.JsonMapperUtils.Json.FIELD_JOB_PARAMETERS;
import static org.jobrunr.utils.mapper.JsonMapperUtils.Json.FIELD_METHOD_NAME;
import static org.jobrunr.utils.mapper.JsonMapperUtils.Json.FIELD_STATIC_FIELD_NAME;
import static org.jobrunr.utils.mapper.JsonMapperUtils.getActualClassName;
import static org.jobrunr.utils.mapper.jsonb.NullSafeJsonBuilder.nullSafeJsonObjectBuilder;
import static org.jobrunr.utils.reflection.ReflectionUtils.toClass;

public class JobDetailsAdapter implements JsonbAdapter {
    private final JobRunrJsonb jsonb;

    public JobDetailsAdapter(JobRunrJsonb jsonb) {
        this.jsonb = jsonb;
    }

    @Override
    public JsonObject adaptToJson(JobDetails jobDetails) throws Exception {
        final JsonArrayBuilder parametersJsonArray = Json.createArrayBuilder();
        try {
            for (JobParameter jobState : jobDetails.getJobParameters()) {
                final JsonObject object = nullSafeJsonObjectBuilder(jsonb, jobState).build();
                parametersJsonArray.add(object);
            }
        } catch (Exception e) {
            throw new JobParameterJsonMapperException("The job parameters are not serializable.", e);
        }

        return nullSafeJsonObjectBuilder()
                .add(FIELD_CACHEABLE, jobDetails.getCacheable())
                .add(FIELD_CLASS_NAME, jobDetails.getClassName())
                .add(FIELD_STATIC_FIELD_NAME, jobDetails.getStaticFieldName())
                .add(FIELD_METHOD_NAME, jobDetails.getMethodName())
                .add(FIELD_JOB_PARAMETERS, parametersJsonArray.build())
                .build();
    }

    @Override
    public JobDetails adaptFromJson(JsonObject jsonObject) throws Exception {
        final JobDetails jobDetails = new JobDetails(
                jsonObject.getString(FIELD_CLASS_NAME),
                jsonObject.containsKey(FIELD_STATIC_FIELD_NAME)
                        ? (jsonObject.isNull(FIELD_STATIC_FIELD_NAME) ? null : jsonObject.getString(FIELD_STATIC_FIELD_NAME))
                        : null,
                jsonObject.getString(FIELD_METHOD_NAME),
                getJobDetailsParameters(jsonObject.getJsonArray(FIELD_JOB_PARAMETERS))
        );
        jobDetails.setCacheable(jsonObject.getBoolean(FIELD_CACHEABLE));
        return jobDetails;
    }

    private List getJobDetailsParameters(JsonArray jobParameters) {
        List result = new ArrayList<>();
        for (JsonValue jsonValue : jobParameters) {
            final JsonObject jsonObject = jsonValue.asJsonObject();
            String methodClassName = jsonObject.getString(FIELD_CLASS_NAME);
            String actualClassName = jsonObject.getString(FIELD_ACTUAL_CLASS_NAME, null);
            try {
                Class objectClass = toClass(getActualClassName(methodClassName, actualClassName));
                if (JobContext.class.equals(objectClass)) {
                    result.add(new JobParameter(methodClassName, JobContext.Null));
                } else {
                    Object object = jsonb.fromJsonValue(jsonObject.get("object"), objectClass);
                    result.add(new JobParameter(methodClassName, object));
                }
            } catch (Exception e) {
                result.add(new JobParameter(new JobParameterNotDeserializableException(getActualClassName(methodClassName, actualClassName), e.getMessage())));
            }
        }
        return result;
    }
}