TVShowTimelineMaker.timeConstraints.SameTimeOfYearConstraint.java Source code

Java tutorial

Introduction

Here is the source code for TVShowTimelineMaker.timeConstraints.SameTimeOfYearConstraint.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package TVShowTimelineMaker.timeConstraints;

import TVShowTimelineMaker.timeConstraints.core.AbstractTwoEventTimeConstraint;
import TVShowTimelineMaker.timeConstraints.interfaces.DayAcceptorTimeConstraint;
import TVShowTimelineMaker.timeConstraints.dayAcceptors.DayAcceptor;
import TVShowTimelineMaker.timeConstraints.dayAcceptors.SameTimeAsDayAcceptor;
import TVShowTimelineMaker.timeline.DateTimeDayEvent;
import TVShowTimelineMaker.timeline.DayEvent;
import TVShowTimelineMaker.timeline.DayEvent.DayPlacement;
import TVShowTimelineMaker.timeline.DayOfYearDayEvent;
import TVShowTimelineMaker.timeline.Event;
import TVShowTimelineMaker.timeline.EventImp;
import TVShowTimelineMaker.timeline.OnceDayEvent;
import TVShowTimelineMaker.timeline.PlacementEvent.Placement;
import TVShowTimelineMaker.timeline.YearlyDayEvent;
import TVShowTimelineMaker.util.DayOfYear;
import TVShowTimelineMaker.util.MyLittePonyMaps;
import TVShowTimelineMaker.util.XML.XMLWriterImp;
import java.util.Iterator;
import java.util.logging.Logger;
import org.jdom2.Element;
import org.joda.time.DateTime;

//TODO:change to new xml reader model
public class SameTimeOfYearConstraint<T extends DayPlacement<?>, S extends DayPlacement<?>>
        extends AbstractTwoEventTimeConstraint<T, S> implements DayAcceptorTimeConstraint {

    private static final long serialVersionUID = 1211L;
    private static final Logger LOG = Logger.getLogger(SameTimeOfYearConstraint.class.getName());

    @com.civprod.dynamicClassLoading.ClassInitalizer
    public static final void init() {
        MyLittePonyMaps.putConstraint("SameTimeOfYearConstraint", SameTimeOfYearConstraint.class);
    }

    private final DayEvent<?, T> firstEpisode;
    private final DayEvent<?, S> secondEpisode;
    private final Event rConstrainedEvents[];

    private DayAcceptor curWorkDayAcceptor;

    public SameTimeOfYearConstraint(DayEvent<?, T> inFirstEpisode, DayEvent<?, S> inSecondEpisode) {
        this(false, inFirstEpisode, inSecondEpisode);
    }

    public SameTimeOfYearConstraint(boolean isSynthetic, DayEvent<?, T> inFirstEpisode,
            DayEvent<?, S> inSecondEpisode) {
        super(isSynthetic);
        this.firstEpisode = inFirstEpisode;
        this.secondEpisode = inSecondEpisode;
        this.rConstrainedEvents = new DayEvent[2];
        this.rConstrainedEvents[0] = this.firstEpisode;
        this.rConstrainedEvents[1] = this.secondEpisode;
        this.curWorkDayAcceptor = new SameTimeAsDayAcceptor();
    }

    @Override
    public boolean inBeta() {
        return false;
    }

    @Override
    public boolean isStrictlyBefore() {
        return false;
    }

    /**
     * @return the firstEpisode
     */
    @Override
    public Event getFirstEvent() {
        return this.firstEpisode;
    }

    /**
     * @return the secondEpisode
     */
    @Override
    public Event getSecondEvent() {
        return this.secondEpisode;
    }

    @Override
    public Event[] getConstrainedEvents() {
        return this.rConstrainedEvents;
    }

    @Override
    public boolean applyConstraint() {
        boolean changed = false;
        DayEvent<?, T> firstEpisodeDayEvent = this.firstEpisode;
        DayEvent<?, S> secondEpisodeDayEvent = this.secondEpisode;
        SameTimeAsDayAcceptor mSameTimeAsDayAcceptor1 = firstEpisodeDayEvent.getDayAcceptor()
                .getDayAcceptorOfKind(SameTimeAsDayAcceptor.class);
        SameTimeAsDayAcceptor mSameTimeAsDayAcceptor2 = secondEpisodeDayEvent.getDayAcceptor()
                .getDayAcceptorOfKind(SameTimeAsDayAcceptor.class);
        SameTimeAsDayAcceptor workSameTimeAsDayAcceptor;
        if (mSameTimeAsDayAcceptor1 != null) {
            workSameTimeAsDayAcceptor = mSameTimeAsDayAcceptor1;
            if (mSameTimeAsDayAcceptor1 == mSameTimeAsDayAcceptor2) {

            } else if (mSameTimeAsDayAcceptor2 != null) {
                workSameTimeAsDayAcceptor.addAll(mSameTimeAsDayAcceptor2);
                secondEpisodeDayEvent.getDayAcceptor().remove(mSameTimeAsDayAcceptor2);
                secondEpisodeDayEvent.getDayAcceptor().add(workSameTimeAsDayAcceptor);
            } else {
                workSameTimeAsDayAcceptor.add(secondEpisodeDayEvent);
                secondEpisodeDayEvent.getDayAcceptor().add(workSameTimeAsDayAcceptor);
            }
        } else if (mSameTimeAsDayAcceptor2 != null) {
            workSameTimeAsDayAcceptor = mSameTimeAsDayAcceptor2;
            workSameTimeAsDayAcceptor.add(firstEpisodeDayEvent);
            firstEpisodeDayEvent.getDayAcceptor().add(workSameTimeAsDayAcceptor);
        } else {
            workSameTimeAsDayAcceptor = new SameTimeAsDayAcceptor();
            workSameTimeAsDayAcceptor.add(firstEpisodeDayEvent);
            workSameTimeAsDayAcceptor.add(secondEpisodeDayEvent);
            firstEpisodeDayEvent.getDayAcceptor().add(workSameTimeAsDayAcceptor);
            secondEpisodeDayEvent.getDayAcceptor().add(workSameTimeAsDayAcceptor);
        }
        this.curWorkDayAcceptor = workSameTimeAsDayAcceptor;
        return changed;
    }

    @Override
    public boolean complexApplyConstraint() {
        boolean changed = this.applyConstraint();
        if ((!this.firstEpisode.isMarkedForComplexEval()) && this.secondEpisode.isMarkedForComplexEval()) {
            this.firstEpisode.setUpForComplexEval();
        }
        if (this.firstEpisode.isMarkedForComplexEval() && (!this.secondEpisode.isMarkedForComplexEval())) {
            this.secondEpisode.setUpForComplexEval();
        }
        if (this.firstEpisode.isMarkedForComplexEval() && this.secondEpisode.isMarkedForComplexEval()) {
            SameTimeAsDayAcceptor mSameTimeAsDayAcceptor1 = this.firstEpisode.getDayAcceptor()
                    .getDayAcceptorOfKind(SameTimeAsDayAcceptor.class);
            SameTimeAsDayAcceptor mSameTimeAsDayAcceptor2 = this.secondEpisode.getDayAcceptor()
                    .getDayAcceptorOfKind(SameTimeAsDayAcceptor.class);
            SameTimeAsDayAcceptor workSameTimeAsDayAcceptor;
            if (mSameTimeAsDayAcceptor1 != null) {
                workSameTimeAsDayAcceptor = mSameTimeAsDayAcceptor1;
                if (mSameTimeAsDayAcceptor1 == mSameTimeAsDayAcceptor2) {

                } else if (mSameTimeAsDayAcceptor2 != null) {
                    workSameTimeAsDayAcceptor.addAll(mSameTimeAsDayAcceptor2);
                    this.secondEpisode.getDayAcceptor().remove(mSameTimeAsDayAcceptor2);
                    this.secondEpisode.getDayAcceptor().add(workSameTimeAsDayAcceptor);
                } else {
                    workSameTimeAsDayAcceptor.add(this.secondEpisode);
                    this.secondEpisode.getDayAcceptor().add(workSameTimeAsDayAcceptor);
                }
            } else if (mSameTimeAsDayAcceptor2 != null) {
                workSameTimeAsDayAcceptor = mSameTimeAsDayAcceptor2;
                workSameTimeAsDayAcceptor.add(this.firstEpisode);
                this.firstEpisode.getDayAcceptor().add(workSameTimeAsDayAcceptor);
            } else {
                workSameTimeAsDayAcceptor = new SameTimeAsDayAcceptor();
                workSameTimeAsDayAcceptor.add(this.firstEpisode);
                workSameTimeAsDayAcceptor.add(this.secondEpisode);
                this.firstEpisode.getDayAcceptor().add(workSameTimeAsDayAcceptor);
                this.secondEpisode.getDayAcceptor().add(workSameTimeAsDayAcceptor);
            }

            if (this.firstEpisode instanceof DateTimeDayEvent) {
                Iterator<DateTime> iterator = ((DateTimeDayEvent<?>) this.firstEpisode).getPossibleDays()
                        .iterator();
                while (iterator.hasNext()) {
                    DateTime next = iterator.next();
                    if (!workSameTimeAsDayAcceptor.accept(next)) {
                        iterator.remove();
                        changed = true;
                    } else if (!workSameTimeAsDayAcceptor.accept2(next)) {
                        iterator.remove();
                        changed = true;
                    }
                }
            } else if (this.firstEpisode instanceof DayOfYearDayEvent) {
                Iterator<DayOfYear> iterator = ((DayOfYearDayEvent<?>) this.firstEpisode).getPossibleDays()
                        .iterator();
                while (iterator.hasNext()) {
                    DayOfYear next = iterator.next();
                    if (!workSameTimeAsDayAcceptor.accept(next)) {
                        iterator.remove();
                        changed = true;
                    } else if (!workSameTimeAsDayAcceptor.accept2(next)) {
                        iterator.remove();
                        changed = true;
                    }
                }
            }
            if (this.secondEpisode instanceof DateTimeDayEvent) {
                Iterator<DateTime> iterator = ((DateTimeDayEvent<?>) this.secondEpisode).getPossibleDays()
                        .iterator();
                while (iterator.hasNext()) {
                    DateTime next = iterator.next();
                    if (!workSameTimeAsDayAcceptor.accept(next)) {
                        iterator.remove();
                        changed = true;
                    } else if (!workSameTimeAsDayAcceptor.accept2(next)) {
                        iterator.remove();
                        changed = true;
                    }
                }
            } else if (this.secondEpisode instanceof DayOfYearDayEvent) {
                Iterator<DayOfYear> iterator = ((DayOfYearDayEvent<?>) this.secondEpisode).getPossibleDays()
                        .iterator();
                while (iterator.hasNext()) {
                    DayOfYear next = iterator.next();
                    if (!workSameTimeAsDayAcceptor.accept(next)) {
                        iterator.remove();
                        changed = true;
                    } else if (!workSameTimeAsDayAcceptor.accept2(next)) {
                        iterator.remove();
                        changed = true;
                    }
                }
            }
        }
        return changed;
    }

    @Override
    public boolean ConstraintSatisfied() {
        boolean satisfied = true;
        SameTimeAsDayAcceptor mSameTimeAsDayAcceptor1 = this.firstEpisode.getDayAcceptor()
                .getDayAcceptorOfKind(SameTimeAsDayAcceptor.class);
        SameTimeAsDayAcceptor mSameTimeAsDayAcceptor2 = this.secondEpisode.getDayAcceptor()
                .getDayAcceptorOfKind(SameTimeAsDayAcceptor.class);
        satisfied = (mSameTimeAsDayAcceptor1 != null) && (mSameTimeAsDayAcceptor2 != null)
                && (mSameTimeAsDayAcceptor1 == mSameTimeAsDayAcceptor2);
        return satisfied;
    }

    public boolean consistentWithConstraint(DateTime inFirstDay, DateTime inSecondDay) {
        return (inFirstDay.getMonthOfYear() == inSecondDay.getMonthOfYear())
                && (inFirstDay.getDayOfMonth() == inSecondDay.getDayOfMonth());
    }

    @Override
    public boolean consistentWithConstraint(T inFirstPlacement, S inSecondPlacement) {
        int monthOfYear1;
        int monthOfYear2;
        int dayOfMonth1;
        int dayOfMonth2;
        if (this.firstEpisode instanceof OnceDayEvent) {
            OnceDayEvent.OnceDayEventPlacement curOnceDayEventPlacement = (OnceDayEvent.OnceDayEventPlacement) inFirstPlacement;
            monthOfYear1 = curOnceDayEventPlacement.day.getMonthOfYear();
            dayOfMonth1 = curOnceDayEventPlacement.day.getDayOfMonth();
        } else {
            YearlyDayEvent.YearlyDayEventPlacement curYearlyDayEventPlacement = (YearlyDayEvent.YearlyDayEventPlacement) inFirstPlacement;
            monthOfYear1 = curYearlyDayEventPlacement.day.getMonth();
            dayOfMonth1 = curYearlyDayEventPlacement.day.getMonth();
        }
        if (this.secondEpisode instanceof OnceDayEvent) {
            OnceDayEvent.OnceDayEventPlacement curOnceDayEventPlacement = (OnceDayEvent.OnceDayEventPlacement) inSecondPlacement;
            monthOfYear2 = curOnceDayEventPlacement.day.getMonthOfYear();
            dayOfMonth2 = curOnceDayEventPlacement.day.getDayOfMonth();
        } else {
            YearlyDayEvent.YearlyDayEventPlacement curYearlyDayEventPlacement = (YearlyDayEvent.YearlyDayEventPlacement) inSecondPlacement;
            monthOfYear2 = curYearlyDayEventPlacement.day.getMonth();
            dayOfMonth2 = curYearlyDayEventPlacement.day.getMonth();
        }
        return (monthOfYear1 == monthOfYear2) && (dayOfMonth1 == dayOfMonth2);
    }

    @Override
    public Event[] increaseWhat(Placement<?>[] inValues) {
        int monthOfYear1;
        int monthOfYear2;
        int dayOfMonth1;
        int dayOfMonth2;
        if (this.firstEpisode instanceof OnceDayEvent) {
            OnceDayEvent.OnceDayEventPlacement curOnceDayEventPlacement = (OnceDayEvent.OnceDayEventPlacement) inValues[0];
            monthOfYear1 = curOnceDayEventPlacement.day.getMonthOfYear();
            dayOfMonth1 = curOnceDayEventPlacement.day.getDayOfMonth();
        } else {
            YearlyDayEvent.YearlyDayEventPlacement curYearlyDayEventPlacement = (YearlyDayEvent.YearlyDayEventPlacement) inValues[0];
            monthOfYear1 = curYearlyDayEventPlacement.day.getMonth();
            dayOfMonth1 = curYearlyDayEventPlacement.day.getMonth();
        }
        if (this.secondEpisode instanceof OnceDayEvent) {
            OnceDayEvent.OnceDayEventPlacement curOnceDayEventPlacement = (OnceDayEvent.OnceDayEventPlacement) inValues[1];
            monthOfYear2 = curOnceDayEventPlacement.day.getMonthOfYear();
            dayOfMonth2 = curOnceDayEventPlacement.day.getDayOfMonth();
        } else {
            YearlyDayEvent.YearlyDayEventPlacement curYearlyDayEventPlacement = (YearlyDayEvent.YearlyDayEventPlacement) inValues[1];
            monthOfYear2 = curYearlyDayEventPlacement.day.getMonth();
            dayOfMonth2 = curYearlyDayEventPlacement.day.getMonth();
        }
        if ((monthOfYear1 != monthOfYear2) || (dayOfMonth1 != dayOfMonth2)) {
            return new Event[] { this.firstEpisode, this.secondEpisode };
        } else {
            return new Event[] {};
        }
    }

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

    @Override
    public String toString() {
        String rString = this.firstEpisode.toString();
        rString += " same time of year as ";
        rString += this.secondEpisode.toString();
        return rString;
    }

    @Override
    public DayAcceptor getDayAcceptor() {
        return this.curWorkDayAcceptor;
    }

    public static class SameTimeOfYearConstraintXMLWriter extends XMLWriterImp<SameTimeOfYearConstraint> {

        @com.civprod.dynamicClassLoading.ClassInitalizer
        public static final void init() {
            XMLWriterImp.addXMLWriter(SameTimeOfYearConstraint.class, new SameTimeOfYearConstraintXMLWriter());
        }

        @Override
        public Element writeElements(SameTimeOfYearConstraint ObjectToWrite) {
            Element newElement = new Element("Relation");
            Element firstEpisodeElement = new Element("firstEventByID");
            EventImp.EventIDXMLWriter.instance.writeElements(ObjectToWrite.firstEpisode, firstEpisodeElement);
            newElement.addContent(firstEpisodeElement);
            Element secondEpisodeElement = new Element("secondEventByID");
            EventImp.EventIDXMLWriter.instance.writeElements(ObjectToWrite.secondEpisode, secondEpisodeElement);
            newElement.addContent(secondEpisodeElement);
            return newElement;
        }

        @Override
        public SameTimeOfYearConstraint readElements(org.jdom2.Element root) {
            Element firstEpisodeElement = root.getChild("firstEventByID");
            OnceDayEvent firstEpisode = (OnceDayEvent) EventImp.EventIDXMLWriter.instance
                    .readElements(firstEpisodeElement);
            Element secondEpisodeElement = root.getChild("secondEventByID");
            OnceDayEvent secondEpisode = (OnceDayEvent) EventImp.EventIDXMLWriter.instance
                    .readElements(secondEpisodeElement);
            SameTimeOfYearConstraint newSameTimeOfYearConstraint = new SameTimeOfYearConstraint(firstEpisode,
                    secondEpisode);
            return newSameTimeOfYearConstraint;
        }
    }
}