net.bhl.cdt.paxelerate.ui.commands.GeneratePassengersCommand.java Source code

Java tutorial

Introduction

Here is the source code for net.bhl.cdt.paxelerate.ui.commands.GeneratePassengersCommand.java

Source

/*******************************************************************************
 * <copyright> Copyright (c) 2014-2016 Bauhaus Luftfahrt e.V.. All rights reserved. This program and the accompanying
 * materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html </copyright>
 ***************************************************************************************/
package net.bhl.cdt.paxelerate.ui.commands;

import java.util.ArrayList;
import java.util.Collections;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.emf.ecp.core.util.ECPUtil;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.swt.widgets.Display;

import net.bhl.cdt.commands.CDTCommand;
import net.bhl.cdt.model.util.ModelHelper;
import net.bhl.cdt.paxelerate.model.Cabin;
import net.bhl.cdt.paxelerate.model.CabinFactory;
import net.bhl.cdt.paxelerate.model.Door;
import net.bhl.cdt.paxelerate.model.DoorOption;
import net.bhl.cdt.paxelerate.model.Passenger;
import net.bhl.cdt.paxelerate.model.Seat;
import net.bhl.cdt.paxelerate.model.TravelClass;
import net.bhl.cdt.paxelerate.model.util.PassengerGenerator;
import net.bhl.cdt.paxelerate.model.util.PassengerPropertyGenerator;
import net.bhl.cdt.paxelerate.ui.preferences.PAXeleratePreferencePage;
import net.bhl.cdt.paxelerate.ui.views.CabinViewPart;
import net.bhl.cdt.paxelerate.ui.views.ViewPartHelper;
import net.bhl.cdt.paxelerate.util.input.Input;
import net.bhl.cdt.paxelerate.util.input.Input.WindowType;
import net.bhl.cdt.paxelerate.util.string.StringHelper;
import net.bhl.cdt.paxelerate.util.toOpenCDT.Log;

/**
 * 
 * This command creates the passengers.
 * 
 * @author marc.engelmann, michael.schmidt
 * @version 1.0
 * @since 0.5
 *
 */

public class GeneratePassengersCommand extends CDTCommand {

    /** The cabin. */
    private Cabin cabin;

    /** The total count. */
    private int totalCount = 1;

    /** The cabinview. */
    private CabinViewPart cabinview;

    /**
     * This method submits the cabin to be used in the file.
     * 
     * @param cabin
     *            is the input parameter
     */
    public GeneratePassengersCommand(final Cabin cabin) {
        this.cabin = cabin;
    }

    /**
     * Instantiates a new generate passengers command.
     */
    public GeneratePassengersCommand() {
        if (ECPUtil.getECPProjectManager().getProjects() != null) {
            this.cabin = (Cabin) ECPUtil.getECPProjectManager()
                    .getProject(PAXeleratePreferencePage.DEFAULT_PROJECT_NAME).getContents().get(0);
        }
    }

    /**
     * This method applies a door to a passenger.
     *
     * @param pass
     *            is the passenger to whom the door is assigned to.
     * @return the door
     */
    private Door getDoor(final Passenger pass) {

        ArrayList<Door> sdoorage = new ArrayList<Door>();

        if (cabin.getDoors().size() == 0) {
            Log.add(this, "No doors found. Please add a least one door!");
            return null;

        } else {
            for (Door door : cabin.getDoors()) {
                if (door.isIsActive()) {
                    sdoorage.add(door);
                }
            }
            /* Check if active doors exist */
            if (sdoorage.size() == 0) {
                Log.add(this, "No active door is found. First available main door is activated.");
                for (Door door : cabin.getDoors()) {
                    if (door.getDoorOption() == DoorOption.MAIN_DOOR) {
                        door.setIsActive(true);
                        sdoorage.add(door);
                        break;
                    }
                }
            }

            int seatPos = pass.getSeat().getXPosition();

            int current = Integer.MAX_VALUE;
            Door bestDoor = null;

            for (Door door : sdoorage) {
                int diff = Math.abs(door.getXPosition() - seatPos);
                if (diff < current) {
                    current = diff;
                    bestDoor = door;
                }
            }
            return bestDoor;
        }

    }

    /**
     * This method gets the seat which is connected to a specific passenger.
     * 
     * @param passenger
     *            the passenger
     * @return the seat which is linked to the passenger
     */
    private Seat getSeat(final Passenger passenger) {

        for (Seat seat : ModelHelper.getChildrenByClass(cabin, Seat.class)) {
            if ((seat.getId() == passenger.getSeatID())) {
                seat.setPassenger(passenger);
                return seat;
            }
        }

        Log.add(this, "No seat found!");

        return null;
    }

    /**
     * This method generates the passengers.
     *
     * @param tc
     *            the tc
     */
    private synchronized void generatePassengers(final TravelClass tc) {

        int numberOfPassengers = tc.getPassengers();
        int numberOfSeats = tc.getAvailableSeats();

        if (numberOfPassengers != 0) {
            if (numberOfPassengers <= numberOfSeats) {

                int firstSeatNumber = ModelHelper.getChildrenByClass(tc, Seat.class).get(0).getId();

                /* Create random list */

                ArrayList<Integer> randomSeatId = new ArrayList<Integer>();

                for (int i = 0; i < numberOfSeats; i++) {
                    randomSeatId.add(firstSeatNumber + i);
                }

                Collections.shuffle(randomSeatId);

                Map<Integer, Double> delays = new HashMap<>();

                for (int i = 0; i < numberOfPassengers; i++) {
                    synchronized (this) {
                        try {
                            Passenger passenger = CabinFactory.eINSTANCE.createPassenger();

                            cabin.getPassengers().add(passenger);

                            passenger.setId(totalCount);
                            passenger.setSeatID(randomSeatId.get(i));
                            passenger.setName(passenger.getId() + " (" + getSeat(passenger).getName() + ")");
                            passenger.setSeat(getSeat(passenger));
                            passenger.setTravelClass(passenger.getSeat().getTravelClass());

                            if (!(getDoor(passenger) == null)) {
                                passenger.setDoor(getDoor(passenger));
                            } else {
                                throw new NullPointerException();
                            }

                            PassengerGenerator.applyDelay(passenger, delays);

                            PassengerPropertyGenerator generator = new PassengerPropertyGenerator(passenger);
                            passenger = generator.getPassenger();

                            totalCount++;

                        } catch (ConcurrentModificationException e) {
                            e.printStackTrace();
                        } catch (NullPointerException e) {
                            e.printStackTrace();
                            Log.add(this, "Passenger generation aborted!");
                        }

                    }
                }
                Log.add(this, "successfully created " + numberOfPassengers + " passengers in " + tc.getName());
            } else {
                Log.add(this, "Too many passengers in " + StringHelper.splitCamelCase(tc.getName()));
            }
        }
    }

    /**
     * This method runs the passenger generation command.
     */
    @Override
    protected final void doRun() {
        /* Create separate thread */

        Job job = new Job("Generate Passengers Thread") {
            @Override
            protected IStatus run(final IProgressMonitor monitor) {

                Log.add(this, "Passenger generation started...");

                if (cabin.getDoors().isEmpty()) {
                    new Input(WindowType.WARNING,
                            "You can not continue without generating and activating at least one door!",
                            IMessageProvider.ERROR);
                    Log.add(this, "Passenger generation aborted");
                    return Status.CANCEL_STATUS;
                } else {

                    Display.getDefault().syncExec(new Runnable() {
                        @Override
                        public void run() {
                            cabinview = ViewPartHelper.getCabinView();
                            cabinview.unsyncViewer();

                            cabin.getPassengers().clear();
                        }
                    });

                    for (TravelClass travelclass : cabin.getClasses()) {
                        generatePassengers(travelclass);
                    }
                    for (Door door : cabin.getDoors()) {
                        door.getWaitingPassengers().clear();
                    }

                    /* PUBLISH */
                    Log.add(this, "Updating GUI...");
                    Display.getDefault().syncExec(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                ViewPartHelper.getPropertyView().updateUI(cabin);
                            } catch (NullPointerException e) {
                                Log.add(this, "No property view is visible!");
                                e.printStackTrace();
                            }

                            try {
                                cabinview.syncViewer();
                                cabinview.setCabin(cabin);
                            } catch (NullPointerException e) {
                                Log.add(this, "Cabin View not visible!");
                                e.printStackTrace();
                            }

                            try {
                                new DrawCabinCommand(cabin).doRun();
                            } catch (NullPointerException e) {
                                Log.add(this, "Cabin View could not be refreshed");
                                e.printStackTrace();
                            }
                        }
                    });
                }
                /* report finished */
                return Status.OK_STATUS;
            }
        };

        /* report job status to console */
        job.addJobChangeListener(new JobChangeAdapter() {
            public void done(final IJobChangeEvent event) {
                if (event.getResult().isOK()) {
                    Log.add(this, "Passenger generation completed");
                } else {
                    Log.add(this, "Passenger generation failed!");
                }
            }
        });

        /* Start the Job */
        job.schedule();
        try {
            /* schedule job after previous is finished */
            job.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
            System.out.println("InterruptedException @ thread " + Thread.currentThread().getName());
            Thread.currentThread().interrupt();
        }
    }
}