MoyaChangedFieldsOptimisticLockingPolicy.java 1.8 KB
package fi.codecrew.moya.database.eclipselink;

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

import org.eclipse.persistence.descriptors.ChangedFieldsLockingPolicy;
import org.eclipse.persistence.internal.helper.DatabaseField;
import org.eclipse.persistence.internal.helper.DatabaseTable;
import org.eclipse.persistence.internal.sessions.AbstractRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Filters out JSON fields from Optimistic Locking policy that checks changed
 * fields. JSON fields in PostgreSQL cannot be compared.
 * 
 * @author jkj
 * 
 */
public class MoyaChangedFieldsOptimisticLockingPolicy extends ChangedFieldsLockingPolicy {
	private static final long serialVersionUID = -1951931955910848024L;
	private static final Logger log = LoggerFactory.getLogger(MoyaChangedFieldsOptimisticLockingPolicy.class);

	/**
	 * Skip PGobject from ChangedFieldsLockingPolicy. PostgreSQL does not now
	 * how to compare JSON column, and this was the easiest way to work around
	 * it.
	 */
	@Override
	protected List<DatabaseField> getFieldsToCompare(DatabaseTable table, AbstractRecord transRow, AbstractRecord modifyRow) {
		// log.info("getFieldsToCompare({}, {}, {})", table, transRow,
		// modifyRow);

		List<DatabaseField> changedFields = super.getFieldsToCompare(table, transRow, modifyRow);
		ArrayList<DatabaseField> fieldsToCompare = new ArrayList<DatabaseField>(changedFields.size());

		// Filter out JSON fields because they cannot be compared
		for (DatabaseField f : changedFields) {
			// log.info("Field with typeName={}: {}", f.toString(),
			// f.getTypeName());
			if (!f.getTypeName().equals("org.postgresql.util.PGobject")) {
				log.debug("Ignoring a PGobject field from changed fields optimistic locking policy: {}", f);
				fieldsToCompare.add(f);
			}
		}

		return fieldsToCompare;
	}
}