playground.johannes.gsv.synPop.invermo.SplitPlanTask.java Source code

Java tutorial

Introduction

Here is the source code for playground.johannes.gsv.synPop.invermo.SplitPlanTask.java

Source

/* *********************************************************************** *
 * project: org.matsim.*
 *                                                                         *
 * *********************************************************************** *
 *                                                                         *
 * copyright       : (C) 2014 by the members listed in the COPYING,        *
 *                   LICENSE and WARRANTY file.                            *
 * email           : info at matsim dot org                                *
 *                                                                         *
 * *********************************************************************** *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *   See also COPYING, LICENSE and WARRANTY file                           *
 *                                                                         *
 * *********************************************************************** */

package playground.johannes.gsv.synPop.invermo;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.iterators.ProxyIterator;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import playground.johannes.gsv.synPop.CommonKeys;
import playground.johannes.gsv.synPop.ProxyObject;
import playground.johannes.gsv.synPop.ProxyPerson;
import playground.johannes.gsv.synPop.ProxyPersonTask;
import playground.johannes.gsv.synPop.ProxyPlan;
import playground.johannes.gsv.synPop.mid.MIDKeys;

/**
 * @author johannes
 * 
 */
public class SplitPlanTask implements ProxyPersonTask {

    private static final Logger logger = Logger.getLogger(SplitPlanTask.class);

    public static DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm");

    @Override
    public void apply(ProxyPerson person) {
        List<ProxyPlan> newPlans = new ArrayList<ProxyPlan>();

        for (ProxyPlan plan : person.getPlans()) {
            splitPlan(plan, newPlans);
        }

        person.getPlans().clear();

        for (ProxyPlan plan : newPlans)
            person.addPlan(plan);
    }

    private void splitPlan(ProxyPlan plan, List<ProxyPlan> newPlans) {
        ProxyPlan subPlan = new ProxyPlan();

        DateTime prev = getDate(plan.getLegs().get(0));
        if (prev == null) {
            logger.warn("Cannot split plan. Neither start nor end time specified.");
            return;
        }

        for (int i = 0; i < plan.getLegs().size(); i++) {
            ProxyObject leg = plan.getLegs().get(i);
            ProxyObject act = plan.getActivities().get(i);

            DateTime current = getDate(leg);
            if (current == null) {
                logger.warn("Cannot split plan. Neither start nor end time specified.");
                return;
            }

            int currentDays = current.dayOfYear().get() + (365 * current.year().get());
            int prevDays = prev.dayOfYear().get() + (365 * prev.year().get());
            int nights = currentDays - prevDays;

            //         if (current.dayOfYear().get() != prev.dayOfYear().get()) {
            if (nights > 0) {
                subPlan.setAttribute(MIDKeys.JOURNEY_DAYS, String.valueOf(nights + 1));

                subPlan.addActivity(act.clone());
                newPlans.add(subPlan);

                subPlan = new ProxyPlan();
                subPlan.addActivity(act.clone());
                subPlan.addLeg(leg.clone());
            } else {
                subPlan.setAttribute(MIDKeys.JOURNEY_DAYS, String.valueOf(nights + 1));

                subPlan.addActivity(act.clone());
                subPlan.addLeg(leg.clone());
            }

            prev = current;
        }

        int size = plan.getActivities().size();
        subPlan.addActivity(plan.getActivities().get(size - 1).clone());
        newPlans.add(subPlan);
    }

    private DateTime getDate(ProxyObject leg) {
        String time = leg.getAttribute(CommonKeys.LEG_START_TIME);
        if (time == null) {
            /*
             * This may have undesired effects in the case of over night trips.
             */
            time = leg.getAttribute(CommonKeys.LEG_END_TIME);
        }

        if (time != null) {
            return formatter.parseDateTime(time);
        } else {
            return null;
        }
    }

}