// Copyright © 2016 HSL <https://www.hsl.fi>
// This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses.
package fi.hsl.parkandride.core.domain;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.google.common.base.MoreObjects;
import org.joda.time.DateTime;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.util.Objects;
import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
public class Utilization implements Cloneable {
@NotNull
@JsonInclude(NON_NULL)
public Long facilityId;
@NotNull
public CapacityType capacityType;
@NotNull
public Usage usage;
@NotNull
@JsonSerialize(using = DefaultTimeZoneDateTimeSerializer.class)
@JsonDeserialize(using = StrictIsoDateTimeDeserializer.class)
public DateTime timestamp;
@NotNull
@Min(0)
public Integer spacesAvailable;
@NotNull
@Min(0)
public Integer capacity;
@JsonIgnore
public UtilizationKey getUtilizationKey() {
return new UtilizationKey(facilityId, capacityType, usage);
}
public Utilization copy() {
try {
return (Utilization) clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Utilization)) {
return false;
}
Utilization that = (Utilization) obj;
return Objects.equals(this.facilityId, that.facilityId)
&& Objects.equals(this.capacityType, that.capacityType)
&& Objects.equals(this.usage, that.usage)
&& Objects.equals(this.timestamp, that.timestamp)
&& Objects.equals(this.spacesAvailable, that.spacesAvailable)
&& Objects.equals(this.capacity, that.capacity);
}
@Override
public int hashCode() {
return Objects.hash(facilityId, capacityType, usage, timestamp, spacesAvailable, capacity);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("facilityId", facilityId)
.add("capacityType", capacityType)
.add("usage", usage)
.add("timestamp", timestamp)
.add("spacesAvailable", spacesAvailable)
.add("capacity", capacity)
.toString();
}
}