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

net.intelie.pipes.time.SimplePeriod Maven / Gradle / Ivy

There is a newer version: 0.25.5
Show newest version
package net.intelie.pipes.time;

import net.intelie.pipes.util.Preconditions;

import java.io.ObjectStreamException;
import java.time.ZoneId;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class SimplePeriod implements Period {
    private static final long serialVersionUID = 1L;
    private final int amount;
    private final PeriodUnit unit;
    private final ZoneId zone;
    private final transient PeriodBase adder;

    public SimplePeriod(int amount, String unit) {
        this(amount, PeriodUnit.fromName(unit));
    }

    public SimplePeriod(int amount, String unit, ZoneId zone) {
        this(amount, PeriodUnit.fromName(unit), zone);
    }

    public SimplePeriod(int amount, PeriodUnit unit) {
        this(amount, unit, null);
    }

    public SimplePeriod(int amount, PeriodUnit unit, ZoneId zone) {
        Preconditions.checkArgument(amount > 0, "Period can not have non-positive amount: %s", amount);

        if (zone == null)
            zone = ZoneId.systemDefault();
        this.zone = zone;
        this.unit = unit;
        this.amount = amount;
        this.adder = unit.create(amount, zone);
    }

    @Override
    public SimplePeriod forceZone(ZoneId zone) {
        return new SimplePeriod(amount, unit, zone);
    }

    private Object readResolve() throws ObjectStreamException {
        return new SimplePeriod(amount, unit, zone);
    }

    @Override
    public Map simple() {
        Map map = new HashMap<>();
        map.put("amount", (double) amount);
        map.put("unit", unit.name());
        map.put("zone", zone.getId());
        return map;
    }

    public int amount() {
        return amount;
    }

    public PeriodUnit unit() {
        return unit;
    }

    public ZoneId zone() {
        return zone;
    }

    @Override
    public SimplePeriod multiply(int amount) {
        return new SimplePeriod(this.amount * amount, unit, zone);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof SimplePeriod)) return false;

        SimplePeriod that = (SimplePeriod) o;

        return Objects.equals(this.amount, that.amount) &&
                Objects.equals(this.unit, that.unit) &&
                Objects.equals(this.zone, that.zone);
    }

    @Override
    public int hashCode() {
        return Objects.hash(amount, unit, zone);
    }

    @Override
    public String toString() {
        return toString(true);
    }

    public String toString(boolean includeOne) {
        return unit.toString(amount, includeOne);
    }

    @Override
    public long add(long timestamp) {
        return adder.add(timestamp);
    }

    @Override
    public long sub(long timestamp) {
        return adder.sub(timestamp);
    }

    @Override
    public long floor(long timestamp) {
        return adder.floor(timestamp);
    }

    @Override
    public boolean supportsFloor() {
        return true;
    }

    @Override
    public long estimateMillis() {
        return adder.estimateMillis();
    }

    public SimplePeriod unitary() {
        return new SimplePeriod(1, unit, zone);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy