DomainObject.java

package no.nav.data.common.storage.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;
import no.nav.data.common.rest.ChangeStampResponse;

import java.time.LocalDateTime;
import java.util.Comparator;
import java.util.UUID;
import java.util.stream.Stream;

public interface DomainObject {

    UUID getId();

    void setId(UUID id);

    @JsonIgnore
    ChangeStamp getChangeStamp();

    @JsonIgnore
    void setChangeStamp(ChangeStamp changeStamp);

    default String type() {
        return TypeRegistration.typeOf(getClass());
    }

    default ChangeStampResponse convertChangeStampResponse() {
        if (getChangeStamp() == null) {
            return null;
        }
        return ChangeStampResponse.builder()
                .lastModifiedBy(getChangeStamp().getLastModifiedBy())
                .lastModifiedDate(getChangeStamp().getLastModifiedDate() == null ? LocalDateTime.now() : getChangeStamp().getLastModifiedDate())
                .build();
    }

     static <T extends DomainObject> T max(T obj1, T obj2) {
         return Stream.of(obj1, obj2).max(Comparator.comparing(o -> o.getChangeStamp().getCreatedDate())).orElse(null);
    }
}