diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/Constraint.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/Constraint.java index 719e8c7ce..1e72d939e 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/Constraint.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/Constraint.java @@ -53,6 +53,24 @@ public abstract class Constraint { return result; } + private static final Constraint VOID_CONSTRAINT = new Constraint() { + + @Override + protected Object applyConstraintTo(Object currentValue) { + return currentValue; + } + + @Override + public boolean isSatisfiedBy(Object value) { + return true; + } + }; + + @SuppressWarnings("unchecked") + public static Constraint voidConstraint() { + return (Constraint) VOID_CONSTRAINT; + } + private WeakReferencedListeners> weakListeners = WeakReferencedListeners .create(); diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/DateConstraint.java b/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/DateConstraint.java new file mode 100644 index 000000000..97cbeec50 --- /dev/null +++ b/ganttzk/src/main/java/org/zkoss/ganttz/data/constraint/DateConstraint.java @@ -0,0 +1,87 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.zkoss.ganttz.data.constraint; + +import java.util.Date; + +/** + * A constraint applied to {@link Date dates}
+ * @author Óscar González Fernández + */ +public abstract class DateConstraint extends Constraint { + + public static Constraint biggerOrEqualThan(Date date) { + if (date == null) { + return Constraint.voidConstraint(); + } + return new BiggerOrEqualThan(date); + } + + private long value; + + protected long getValue() { + return value; + } + + protected DateConstraint(Date date) { + this.value = asMilliseconds(date); + } + + @Override + protected Date applyConstraintTo(Date currentValue) { + return new Date(applyConstraintTo(asMilliseconds(currentValue))); + } + + private Long asMilliseconds(Date date) { + return date != null ? date.getTime() : null; + } + + protected abstract long applyConstraintTo(Long time); + + @Override + public boolean isSatisfiedBy(Date value) { + return isSatisfiedBy(asMilliseconds(value)); + } + + protected abstract boolean isSatisfiedBy(Long time); + + static class BiggerOrEqualThan extends DateConstraint { + + protected BiggerOrEqualThan(Date date) { + super(date); + } + + @Override + protected long applyConstraintTo(Long time) { + if (time == null) { + return getValue(); + } + return Math.max(getValue(), time); + } + + @Override + protected boolean isSatisfiedBy(Long time) { + return time >= getValue(); + } + + } + +} + diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/ConstraintTest.java b/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/ConstraintTest.java index ef50d5142..de40d5578 100644 --- a/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/ConstraintTest.java +++ b/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/ConstraintTest.java @@ -112,6 +112,7 @@ public class ConstraintTest { assertThat(result, equalTo(4)); } + @SuppressWarnings("unchecked") @Test public void theViolatedConstraintsNotifiesItsListeners() { final Constraint[] constraintViolated = new Constraint[1]; diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/DateConstraintTest.java b/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/DateConstraintTest.java new file mode 100644 index 000000000..e22173b5e --- /dev/null +++ b/ganttzk/src/test/java/org/zkoss/ganttz/data/constraint/DateConstraintTest.java @@ -0,0 +1,56 @@ +/* + * This file is part of ###PROJECT_NAME### + * + * Copyright (C) 2009 Fundación para o Fomento da Calidade Industrial e + * Desenvolvemento Tecnolóxico de Galicia + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.zkoss.ganttz.data.constraint; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +import java.util.Date; + +import org.junit.Test; + +public class DateConstraintTest { + + private Date now = new Date(); + + private Constraint biggerOrEqualThanNow = DateConstraint + .biggerOrEqualThan(now); + + @Test + public void canCreateConstraintBiggerThan() { + assertThat(biggerOrEqualThanNow.applyTo(now), equalTo(new Date(now + .getTime()))); + } + + @Test + public void biggerOrEqualThanNullLeaveValuesUnmodified() { + Constraint biggerThanNull = DateConstraint.biggerOrEqualThan(null); + Date eraStart = new Date(0); + assertThat(biggerThanNull.applyConstraintTo(new Date(0)), + equalTo(eraStart)); + } + + @Test + public void applyingBiggerOrEqualThanConstraintToNullNotFails() { + assertThat(biggerOrEqualThanNow.applyTo(null), equalTo(new Date(now + .getTime()))); + } + +}