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

com.xlrit.gears.engine.flowable.GearsObjectSerializer Maven / Gradle / Ivy

package com.xlrit.gears.engine.flowable;

import static com.google.common.base.Preconditions.*;

import com.xlrit.gears.engine.meta.PrintOptions;
import org.flowable.variable.api.types.ValueFields;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xlrit.gears.engine.meta.MetaManager;
import com.xlrit.gears.engine.meta.TypeInfo;

public class GearsObjectSerializer extends AbstractGearsSerializer {
	public static final String NAME = "gears-object";

	private final MetaManager metaManager;

	public GearsObjectSerializer(MetaManager metaManager, ObjectMapper objectMapper) {
		super(NAME, objectMapper);
		this.metaManager = checkNotNull(metaManager);
	}

	@Override
	protected boolean canWriteObject(Object value) {
		// needs to be able to store anything that's not handled by the previous serializers
		return !(
			value == null
			|| value instanceof String
			|| value instanceof Boolean
			|| value instanceof Number
			|| value instanceof JsonNode
		);
	}

	@Override
	protected void writeObject(Object obj, ValueFields valueFields) {
		// always reset the previous values
		valueFields.setTextValue(null);
		valueFields.setTextValue2(null);
		valueFields.setBytes(null);
		if (obj == null) return;

		TypeInfo typeInfo = metaManager.requireTypeInfo(obj);
		valueFields.setTextValue(typeInfo.getTypeName());

		String id = typeInfo.getId(obj);
		if (id != null) {
			valueFields.setTextValue2(id);
		}
		else {
			JsonNode json = typeInfo.serialize(obj, objectMapper, PrintOptions.NONE);
			valueFields.setBytes(jsonToBytes(json));
		}
	}

	@Override
	protected Object readObject(ValueFields valueFields) {
		String typeName = valueFields.getTextValue();
		if (typeName == null) return null;

		TypeInfo typeInfo = metaManager.requireTypeInfo(typeName);
		String id = valueFields.getTextValue2();
		if (id != null) {
			return typeInfo.getInstance(id);
		}
		else {
			JsonNode json = bytesToJson(valueFields.getBytes());
			return typeInfo.deserialize(json, objectMapper);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy