Resource.java

package no.nav.data.team.resource.domain;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import no.nav.data.common.storage.domain.ChangeStamp;
import no.nav.data.common.storage.domain.DomainObject;
import no.nav.data.team.resource.dto.NomRessurs;
import no.nav.data.team.resource.dto.ResourceResponse;
import no.nav.data.team.shared.dto.Links;
import org.apache.commons.lang3.BooleanUtils;

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.time.Duration;
import java.time.LocalDate;
import java.time.ZonedDateTime;
import java.util.UUID;

import static java.util.Objects.isNull;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Resource implements DomainObject {

    private static final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
    private static final long MIN_UPTIME_BEFORE_STALE = Duration.ofMinutes(10).toMillis();

    private UUID id;
    private ChangeStamp changeStamp;

    private int resourceHashCode;
    private int partition;
    private long offset;
    private ZonedDateTime readTime;
    @JsonIgnore
    private boolean stale;

    private String navIdent;
    private String givenName;
    private String familyName;
    private String fullName;
    private String email;
    private boolean onLeave;
    private ResourceType resourceType;
    private String originalResourceType;
    private LocalDate startDate;
    private LocalDate endDate;

    public Resource(NomRessurs nomRessurs) {
        cloneFrom(nomRessurs);
    }

    private void cloneFrom(NomRessurs nomRessurs) {
        resourceHashCode = nomRessurs.hashCode();
        partition = nomRessurs.getPartition();
        offset = nomRessurs.getOffset();
        readTime = ZonedDateTime.now();

        navIdent = nomRessurs.getNavident().toUpperCase();
        givenName = nomRessurs.getFornavn();
        familyName = nomRessurs.getEtternavn();
        fullName = nomRessurs.getFullName();
        email = nomRessurs.getEpost();
        onLeave = BooleanUtils.isTrue(nomRessurs.getPermisjon());
        resourceType = ResourceType.fromRessursType(nomRessurs.getRessurstype());
        originalResourceType = resourceType == ResourceType.OTHER ? nomRessurs.getRessurstype() : resourceType.name();
        startDate = nomRessurs.getStartdato();
        endDate = nomRessurs.getSluttdato();
    }

    public Resource stale() {
        stale = runtime.getUptime() > MIN_UPTIME_BEFORE_STALE;
        return this;
    }

    public boolean isInactive() {
        return endDate != null && endDate.isBefore(LocalDate.now());
    }

    public ResourceResponse convertToResponse() {
        return ResourceResponse.builder()
                .navIdent(navIdent)
                .givenName(givenName)
                .familyName(familyName)
                .fullName(fullName)
                .email(email)
                .onLeave(onLeave)
                .resourceType(resourceType)
                .startDate(startDate)
                .endDate(shouldHideEndDateIfBeforeNow())
                .stale(stale)
                .links(Links.getFor(this))
                .build();
    }

    private LocalDate shouldHideEndDateIfBeforeNow() {
        if (isNull(this.endDate) || !this.endDate.isBefore(LocalDate.now())) return null;
        else return this.endDate;
    }
}