dk.dma.arcticweb.service.AppDataServiceBean.java Source code

Java tutorial

Introduction

Here is the source code for dk.dma.arcticweb.service.AppDataServiceBean.java

Source

/* Copyright (c) 2011 Danish Maritime Authority.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package dk.dma.arcticweb.service;

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import dk.dma.arcticweb.reporting.model.GreenPosDeviationReport;
import dk.dma.arcticweb.reporting.model.GreenPosFinalReport;
import dk.dma.arcticweb.reporting.model.GreenPosPositionReport;
import dk.dma.arcticweb.reporting.model.GreenPosReport;
import dk.dma.arcticweb.reporting.model.GreenPosSailingPlanReport;
import dk.dma.embryo.common.configuration.Property;
import dk.dma.embryo.common.persistence.IEntity;
import dk.dma.embryo.common.util.DateTimeConverter;
import dk.dma.embryo.user.model.AdministratorRole;
import dk.dma.embryo.user.model.ReportingAuthorityRole;
import dk.dma.embryo.user.model.Role;
import dk.dma.embryo.user.model.SailorRole;
import dk.dma.embryo.user.model.SecuredUser;
import dk.dma.embryo.user.model.ShoreRole;
import dk.dma.embryo.user.persistence.RealmDao;
import dk.dma.embryo.user.security.SecurityUtil;
import dk.dma.embryo.vessel.component.RouteParserComponent;
import dk.dma.embryo.vessel.component.RouteSaver;
import dk.dma.embryo.vessel.model.Berth;
import dk.dma.embryo.vessel.model.Position;
import dk.dma.embryo.vessel.model.Route;
import dk.dma.embryo.vessel.model.Vessel;
import dk.dma.embryo.vessel.model.Voyage;
import dk.dma.embryo.vessel.persistence.ScheduleDao;
import dk.dma.embryo.vessel.persistence.VesselDao;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Duration;
import org.slf4j.Logger;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Singleton
@Startup
public class AppDataServiceBean {

    private static final String EXCLUDE_EXACT_EARTH = "ExcludeExactEarth";

    @Inject
    private RealmDao realmDao;

    @EJB
    private VesselDao vesselDao;

    @EJB
    private ScheduleDao scheduleDao;

    @Inject
    private Logger logger;

    @Inject
    private EntityManagerFactory emf;

    @Inject
    private EntityManager em;

    private List<Berth> berthList = new ArrayList<>(200);

    @Property("embryo.users.admin.initial.pw")
    @Inject
    private String dmaInitialPw;

    @Property("embryo.users.admin.initial.email")
    @Inject
    private String dmainitialEmail;

    @Property("embryo.users.test.password")
    @Inject
    private String testPassword;

    @Property("embryo.users.test.email")
    @Inject
    private String testEmail;

    @PostConstruct
    public void startup() {
        Map<String, Object> props = emf.getProperties();

        String hbm2dllAuto = (String) props.get("hibernate.hbm2ddl.auto");
        logger.info("Detected database auto update setting: {}", hbm2dllAuto);

        setupBerthList();

        if ("create-drop".equals(hbm2dllAuto)) {
            createAdmin();
            resetBaseData();
            resetTestData();
        } else if ("update".equals(hbm2dllAuto)) {
            createAdmin();
            resetBaseData();
        } else if ("validate".equals(hbm2dllAuto)) {
            createAdmin();
            resetBaseData();
        }
    }

    private void setupBerthList() {

        berthList.add(
                new Berth("Ikerasassuaq Vejrstation", "Prins Christian Sund Vejrstation", "60 03.5N", "043 10.5W"));
        berthList.add(new Berth("Aappilattoq", null, "60 09.6N", "044 17.2W"));
        berthList.add(new Berth("Narsaq Kujalleq", "Frederiksdal", "60 00.4N", "044 40.0W"));
        berthList.add(new Berth("Tasiusaq", null, "60 11.8N", "044 49.5W"));
        berthList.add(new Berth("Nanortalik", null, "60 08.3N", "045 14.5W"));
        berthList.add(new Berth("Alluitsup Paa", "Sydprven", "60 27.8N", "045 34.2W"));
        berthList.add(new Berth("Alluitsoq", "Lichtenau", "60 30.6N", "045 32.5W"));
        berthList.add(new Berth("Ammassivik", "Sletten", "60 35.8N", "045 23.7W"));
        berthList.add(new Berth("Qallimiut", null, "60 42.5N", "045 22.0W"));
        berthList.add(new Berth("Saarloq", null, "60 32.3N", "046 01.9W"));
        berthList.add(new Berth("Eqalugaarsuit", null, "60 37.4N", "045 54.8W"));
        berthList.add(new Berth("Qaqortoq", "Julianehb", "60 43.1N", "046 02.4W"));
        berthList.add(new Berth("Upernaviarsuk", null, "60 45.0N", "045 53.8W"));
        berthList.add(new Berth("Qassimiut", null, "60 46.9N", "047 09.8W"));
        berthList.add(new Berth("Igaliku", null, "60 59.6N", "045 25.4W"));
        berthList.add(new Berth("Narsaq", null, "60 54.5N", "046 03.0W"));
        berthList.add(new Berth("Narsarsuaq", null, "61 08.8N", "045 26.2W"));
        berthList.add(new Berth("Qassiarsuk", null, "61 09.3N", "045 31.0W"));
        berthList.add(new Berth("Kangilinnguit", "Grnnedal", "61 14.3N", "48 06.1W"));
        berthList.add(new Berth("Arsuk", null, "61 10.5N", "048 27.2W"));
        berthList.add(new Berth("Paamiut", "Frederikshb", "61 59.8N", "049 40.8W"));
        berthList.add(new Berth("Qeqertarsuatsiaat", "Fiskensset", "63 05.4N", "050 41.0W"));
        berthList.add(new Berth("Orsiivik", "Polaroil", "63 41.1N", "051 30.6W"));
        berthList.add(new Berth("Nordafar", null, "63 42.0N", "051 29.6W"));
        berthList.add(new Berth("Nuuk", "Godthb", "64 10.4N", "051 43.5W"));
        berthList.add(new Berth("Kapisillit", null, "64 26.0N", "050 16.0W"));
        berthList.add(new Berth("Atammik", null, "64 48.3N", "052 11.0W"));
        berthList.add(new Berth("Napasoq", null, "65 02.7N", "052 23.1W"));
        berthList.add(new Berth("Maniitsoq", "Sukkertoppen", "65 24.8N", "052 54.3W"));
        berthList.add(new Berth("Kangaamiut", null, "65 49.6N", "053 20.9W"));
        berthList.add(new Berth("Kangerlussuup Umiarsualivia", null, "66 58.2N", "050 57.2W"));
        berthList.add(new Berth("Itilleq", null, "66 34.6N", "053 30.2W"));
        berthList.add(new Berth("Sarfannguit", null, "66 54.0N", "052 52.0W"));
        berthList.add(new Berth("Sisimiut", "Holsteinsborg", "66 56.5N", "053 40.5W"));
        berthList.add(new Berth("Attu", null, "67 56.5N", "053 38.0W"));
        berthList.add(new Berth("Ikerasaarsuk", null, "68 08.4N", "053 27.2W"));
        berthList.add(new Berth("Iginniarfik", null, "68 09.0N", "053 10.8W"));
        berthList.add(new Berth("Niaqornaarsuk", null, "68 14.0N", "052 52.0W"));
        berthList.add(new Berth("Kangaatsiaq", null, "68 18.5N", "053 28.0W"));
        berthList.add(new Berth("Aasiaat", "Egedesminde", "68 42.6N", "052 53.0W"));
        berthList.add(new Berth("Kitsissuarsuit", "Hunde Ejland", "68 51.5N", "053 07.8W"));
        berthList.add(new Berth("Akunnaaq", null, "68 44.7N", "052 20.2W"));
        berthList.add(new Berth("Qeqertarsuaq", "Godhavn", "69 15.0N", "053 33.0W"));
        berthList.add(new Berth("Kangerluk", "Diskofjord", "69 29.0N", "053 57.0W"));
        berthList.add(new Berth("Ikamiut", null, "68 38.1N", "051 50.0W"));
        berthList.add(new Berth("Qasigiannguit", "Christianshb", "68 49.0N", "051 12.0W"));
        berthList.add(new Berth("Ilimanaq", "Claushavn", "69 05.0N", "051 07.3W"));
        berthList.add(new Berth("Ilulissat", "Jakobshavn", "69 13.5N", "051 06.0W"));
        berthList.add(new Berth("Oqaatsut", "Rodebay", "69 20.7N", "051 00.7W"));
        berthList.add(new Berth("Qeqertaq", null, "70 00.0N", "051 19.0W"));
        berthList.add(new Berth("Saqqaq", null, "70 01.0N", "051 57.0W"));
        berthList.add(new Berth("Niaqornat", null, "70 47.6N", "053 40.0W"));
        berthList.add(new Berth("Qaarsut", null, "70 44.0N", "052 38.5W"));
        berthList.add(new Berth("Uummannaq", null, "70 40.5N", "052 08.0W"));
        berthList.add(new Berth("Ikerasak", null, "70 30.0N", "051 19.0W"));
        berthList.add(new Berth("Saattut", null, "70 48.8N", "051 38.2W"));
        berthList.add(new Berth("Ukkusissat", null, "71 03.0N", "051 53.8W"));
        berthList.add(new Berth("Illorsuit", null, "71 14.3N", "053 30.5W"));
        berthList.add(new Berth("Nuugaatsiaq", null, "71 32.5N", "053 13.0W"));
        berthList.add(new Berth("Upernavik Kujalleq", "Sndre Upernavik", "72 09.2N", "055 32.0W"));
        berthList.add(new Berth("Kangersuatsiaq", "Prven", "72 22.7N", "055 33.5W"));
        berthList.add(new Berth("Upernavik", null, "72 47.5N", "056 09.4W"));
        berthList.add(new Berth("Aappilattoq", null, "72 53.0N", "055 36.6W"));
        berthList.add(new Berth("Naajaat", null, "73 09.0N", "055 48.0W"));
        berthList.add(new Berth("Innaarsuit", null, "73 12.0N", "056 02.0W"));
        berthList.add(new Berth("Tasiusaq", null, "73 22.0N", "056 04.0W"));
        berthList.add(new Berth("Nutaarmiut", null, "73 31.8N", "056 26.0W"));
        berthList.add(new Berth("Nuussuaq", "Kraulshavn", "74 07.0N", "057 06.0W"));
        berthList.add(new Berth("Kullorsuaq", null, "74 34.8N", "057 13.0W"));
        berthList.add(new Berth("Savissivik", null, "76 01.0N", "065 06.0W"));
        berthList.add(new Berth("Pituffik", "Thule Air Base", "76 32.6N", "068 52.5W"));
        berthList.add(new Berth("Moriusaq", null, "76 45.0N", "069 53.0W"));
        berthList.add(new Berth("Qeqertarsuaq", "Herbert ", "77 25.3N", "070 09.0W"));
        berthList.add(new Berth("Qaanaaq", "Thule", "77 27.8N", "069 14.0W"));
        berthList.add(new Berth("Qeqertat", null, "77 29.8N", "066 43.0W"));
        berthList.add(new Berth("Siorapaluk", null, "77 47.0N", "070 37.0W"));
        berthList.add(new Berth("Danmarkshavn", null, "76 46.0N", "018 45.0W"));
        berthList.add(new Berth("Daneborg", null, "74 18.2N", "020 14.7W"));
        berthList.add(new Berth("Ella ", null, "72 53.0N", "025 06.0W"));
        berthList.add(new Berth("Nyhavn", null, "72 16.0N", "023 57.0W"));
        berthList.add(new Berth("Illoqqortoormiut", "Scoresbysund", "70 28.0N", "021 58.0W"));
        berthList.add(new Berth("Ittaajimmiut", "Kap Hope", "70 27.5N", "022 22.0W"));
        berthList.add(new Berth("Uunarteq", "Kap Tobin", "70 24.5N", "021 58.0W"));
        berthList.add(new Berth("Nerlerit Inaat", "Constable Pynt", "70 44.0N", "022 38.0W"));
        berthList.add(new Berth("Sermiligaaq", null, "65 54.0N", "036 22.0W"));
        berthList.add(new Berth("Tiniteqilaaq", null, "65 52.9N", "037 46.9W"));
        berthList.add(new Berth("Kuummiut", null, "65 51.5N", "037 00.5W"));
        berthList.add(new Berth("Ikkatteq", null, "65 37.8N", "037 57.2W"));
        berthList.add(new Berth("Tasiilaq", null, "65 36.5N", "037 37.5W"));
        berthList.add(new Berth("Kulusuk", "Kap Dan", "65 34.3N", "037 11.0W"));
        berthList.add(new Berth("Kulusuk Mittarfik", "Kulusuk Flyveplads", "65 34.7N", "037 08.7W"));
        berthList.add(new Berth("Isortoq", null, "65 32.4N", "038 58.5W"));
        berthList.add(new Berth("Saqqisikuik", "Skjoldungen", "63 13.0N", "041 24.0W"));
        berthList.add(new Berth("Seqinnersuusaq", null, "64 58.7N", "051 34.9W"));
        berthList.add(new Berth("Maarmorilik", null, "71 07.6N", "051 16.5W"));
        berthList.add(new Berth("Zackenberg Forskningsstation", null, "74 28.0N", "020 34.0W"));
        berthList.add(new Berth("Aalborg", null, "57 02.9N", "010 03.3E"));
        berthList.add(new Berth("Sorgfjorden", null, "79 54.3N", "016 48.5E"));

        addBerthsFromFiles(berthList);
    }

    private void addBerthsFromFiles(List<Berth> berthList) {
        if (berthList == null) {
            berthList = new ArrayList<>();
        }
        InputStream berthStream = getClass().getResourceAsStream("/berths/berths_no.json");
        try {
            JsonParser jsonParser = new JsonFactory().createParser(berthStream);
            String currentName = null;
            double currentLat = 0;
            double currentLon = 0;
            while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
                String name = jsonParser.getCurrentName();
                JsonToken currentToken = jsonParser.getCurrentToken();
                if ("name".equals(name)) {
                    jsonParser.nextToken();
                    currentName = jsonParser.getText();
                }
                if ("lat".equals(name)) {
                    jsonParser.nextToken();
                    currentLat = jsonParser.getDoubleValue();
                }
                if ("lon".equals(name)) {
                    jsonParser.nextToken();
                    currentLon = jsonParser.getDoubleValue();
                }
                if (currentToken == JsonToken.END_OBJECT) {
                    Position position = new Position(currentLat, currentLon);
                    Berth berth = new Berth(currentName, position.getLatitudeAsString(),
                            position.getLongitudeAsString());
                    berthList.add(berth);
                    currentName = null;
                    currentLat = 0;
                    currentLon = 0;
                }
            }
            berthStream.close();
        } catch (JsonParseException e) {
            logger.error("JSON parsing exception when importing berths from file", e);
        } catch (IOException e) {
            logger.error("I/O exception when importing berths from file", e);
        }
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void resetBaseData() {
        deleteAll(Berth.class);
        createBerths();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void createAdmin() {
        SecuredUser user = realmDao.findByUsername("dma");
        logger.debug("looked up admin user: {}", user);
        if (user == null) {
            createDmaAccount();
        } else {
            logger.info("Admin user (dma) already exists in database");
        }
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void resetTestData() {
        internalResetTestData();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void clearTestData() {
        logger.info("Deleting existing test data entries");

        // delete any other voyages
        deleteAll(Voyage.class);
        deleteAll(Vessel.class);
        deleteAll(Route.class);
        clearTestUsers();
        deleteAll(Vessel.class);
        deleteAll(GreenPosReport.class);

        logger.info("AFTER DELETION");
    }

    private void internalResetTestData() {
        clearTestData();

        createOrasilaTestData();
        uploadOrasilaRoutes();
        createOraTankTestData();
        uploadOraTankRoutes();
        createSarfaqTestData();
        createSarfaqSchedule();
        //uploadSarfaqRoutes();
        createNajaArcticaTestData();
        createArinaArcticaTestData();

        createSilverExplorerTestData();
        createArtaniaTestData();
        createEmeraldPrincessTestData();
        // createCarnivalLegendTestData();
        // uploadCarnivalLegendRoutes();
        createDmiLogin();
        createArcticCommandLogin();
        createAasiaatLogin();
        createNanoqLogin();
        createGreenposReports();
    }

    private <E extends IEntity<K>, K extends Serializable> void deleteAll(Class<E> type) {
        try {
            logger.info("Deleting entities of type {}", type.getName());
            List<E> entities = vesselDao.getAll(type);
            for (E entity : entities) {
                logger.info("Deleting entities with id {}", entity.getId());
                vesselDao.remove(entity);
            }
            em.flush();
            em.clear();
        } catch (RuntimeException e) {
            logger.error("Error deleting existing entries", e);
            throw e;
        }
    }

    public void clearTestUsers() {
        clearUsers(false);
    }

    private void clearUsers(boolean dma) {
        try {
            logger.info("Deleting test users (entities of type{})", SecuredUser.class.getName());

            List<SecuredUser> entities = vesselDao.getAll(SecuredUser.class);
            for (SecuredUser user : entities) {
                if (dma && "dma".equals(user.getUserName()) || !(dma || "dma".equals(user.getUserName()))) {
                    logger.info("Deleting entities with id {}", user.getId());
                    vesselDao.remove(user);
                }
            }
            em.flush();
            em.clear();
        } catch (RuntimeException e) {
            logger.error("Error deleting existing entries", e);
            throw e;
        }
    }

    private void createDmaAccount() {
        logger.info("BEFORE CREATION - DMA");

        AdministratorRole auth = new AdministratorRole();
        realmDao.saveEntity(auth);

        SecuredUser user = SecurityUtil.createUser("dma", dmaInitialPw, dmainitialEmail, null);
        user.setRole(auth);
        SecuredUser saved = realmDao.saveEntity(user);

        em.flush();
        em.clear();
        logger.info("SAVED DMA: " + saved);
    }

    private void createBerths() {
        logger.info("BEFORE CREATION - Berths");

        for (Berth berth : berthList) {
            vesselDao.saveEntity(berth);
        }

        em.flush();
        em.clear();
    }

    private void createOrasilaTestData() {
        logger.info("BEFORE CREATION - ORASILA");

        // Create vessel and user
        Vessel newVessel = new Vessel();
        newVessel.setMmsi(220443000L);
        newVessel.setCommCapabilities("Sat C 0581 422044310, GMDSS A1+A2+A3");
        newVessel.setMaxSpeed(BigDecimal.valueOf(12.6));
        newVessel.setGrossTonnage(2194);
        newVessel.setIceClass("A1");
        newVessel.setHelipad(Boolean.FALSE);
        newVessel.getAisData().setImoNo(9336725L);
        newVessel.getAisData().setName("ORASILA");
        newVessel.getAisData().setCallsign("OYDK2");

        newVessel = vesselDao.saveEntity(newVessel);

        SailorRole sailorRole = new SailorRole();
        sailorRole.setVessel(newVessel);

        vesselDao.saveEntity(sailorRole);

        SecuredUser user = SecurityUtil.createUser("orasila", testPassword, testEmail, null);
        user.setRole(sailorRole);

        vesselDao.saveEntity(user);

        DateTime now = DateTime.now(DateTimeZone.UTC);

        newVessel.addVoyageEntry(new Voyage("Is never shown", "25 47.16N", "080 22.410W", null,
                now.minusDays(6).withTime(17, 0, 0, 0), 0, 0, false));
        newVessel.addVoyageEntry(new Voyage("Miami", "25 47.16N", "080 13.27W",
                now.minusDays(4).withTime(9, 30, 0, 0), now.minusDays(3).withTime(17, 0, 0, 0), 12, 0, true));
        newVessel.addVoyageEntry(new Voyage("Nuuk", "64 10.4N", "051 43.5W", now.plusDays(3).withTime(10, 30, 0, 0),
                now.plusDays(5).withTime(9, 0, 0, 0), 12, 0, true));
        newVessel.addVoyageEntry(new Voyage("Thule", "77 27.8N", "069 14.0W",
                now.plusDays(9).withTime(13, 15, 0, 0), now.plusDays(11).withTime(9, 0, 0, 0)));
        newVessel.addVoyageEntry(new Voyage("Upernavik", "72 47.5N", "056 09.4W",
                now.plusDays(13).withTime(10, 45, 0, 0), now.plusDays(14).withTime(9, 30, 0, 0)));

        for (Voyage v : newVessel.getSchedule()) {
            vesselDao.saveEntity(v);
        }
    }

    private void uploadOrasilaRoutes() {
        logger.info("BEFORE UPLOAD - ORASILA");

        List<Voyage> schedule = scheduleDao.getSchedule(220443000L);
        insertDemoRoute(schedule.get(0).getEnavId(), "/demo/routes/Miami-Nuuk.txt", true);
        insertDemoRoute(schedule.get(1).getEnavId(), "/demo/routes/Nuuk-Thule.txt", false);
        insertDemoRoute(schedule.get(2).getEnavId(), "/demo/routes/Thule-Upernavik.txt", false);
    }

    private void createOraTankTestData() {
        logger.info("BEFORE CREATION - ORATANK");

        // Create vessel and user
        Vessel newVessel = new Vessel();
        newVessel.getAisData().setName("ORATANK");
        newVessel.setMmsi(220516000L);
        newVessel.getAisData().setCallsign("OXPJ2");
        newVessel = vesselDao.saveEntity(newVessel);

        SailorRole sailorRole = new SailorRole();
        sailorRole.setVessel(newVessel);

        vesselDao.saveEntity(sailorRole);

        SecuredUser user = SecurityUtil.createUser("oratank", testPassword, testEmail, null);
        user.setRole(sailorRole);

        vesselDao.saveEntity(user);

        DateTime now = DateTime.now(DateTimeZone.UTC);

        newVessel.addVoyageEntry(new Voyage("Nuuk", "64 10.4N", "051 43.5W", now.plusDays(3).withTime(10, 30, 0, 0),
                now.plusDays(5).withTime(9, 0, 0, 0)));
        newVessel.addVoyageEntry(new Voyage("X", "63 41.81N", "051 29.00W", now.minusDays(4).withTime(9, 30, 0, 0),
                now.minusDays(3).withTime(17, 0, 0, 0)));

        for (Voyage v : newVessel.getSchedule()) {
            vesselDao.saveEntity(v);
        }
    }

    private void uploadOraTankRoutes() {
        logger.info("BEFORE UPLOAD - ORATANK");

        List<Voyage> schedule = scheduleDao.getSchedule(220516000L);
        insertDemoRoute(schedule.get(0).getEnavId(), "/demo/routes/Oratank-Nuuk.txt", true);
    }

    private void createSarfaqTestData() {
        logger.info("BEFORE CREATION - SARFAQ ITTUK");

        // Create vessel and user
        Vessel newVessel = new Vessel();
        newVessel.setMmsi(331037000L);
        newVessel = vesselDao.saveEntity(newVessel);

        SailorRole sailorRole = new SailorRole();
        sailorRole.setVessel(newVessel);

        vesselDao.saveEntity(sailorRole);

        SecuredUser user = SecurityUtil.createUser("sarfaq", testPassword, testEmail, null);
        user.setRole(sailorRole);

        vesselDao.saveEntity(user);

    }

    private void createSarfaqSchedule() {
        logger.info("BEFORE SCHEDULE - SARFAQ");

        Vessel sarfaq = vesselDao.getVessel(331037000L);

        DateTime now = DateTime.now(DateTimeZone.UTC);

        DateTimeConverter converter = DateTimeConverter.getDateTimeConverter();

        DateTime firstDeparture = converter.toObject("27-09-2013 21:00");

        sarfaq.addVoyageEntry(new Voyage("Nuuk", "64 10.4N", "051 43.5W", null, firstDeparture));
        sarfaq.addVoyageEntry(new Voyage("Maniitsoq", "65 24.8N", "052 54.3W",
                converter.toObject("28-09-2013 07:00"), converter.toObject("28-09-2013 07:30")));
        sarfaq.addVoyageEntry(new Voyage("Kangaamiut", "65 49.6N", "053 20.9W",
                converter.toObject("28-09-2013 10:45"), converter.toObject("28-09-2013 11:00")));
        sarfaq.addVoyageEntry(new Voyage("Sisimiut", "66 56.5N", "053 40.5W",
                converter.toObject("28-09-2013 18:00"), converter.toObject("28-09-2013 21:00")));
        sarfaq.addVoyageEntry(new Voyage("Aasiaat", "68 42.6N", "052 53.0W", converter.toObject("29-09-2013 08:00"),
                converter.toObject("29-09-2013 08:30")));
        sarfaq.addVoyageEntry(new Voyage("Ilulissat", "69 13.5N", "051 06.0W",
                converter.toObject("29-09-2013 13:00"), converter.toObject("29-09-2013 17:00")));
        sarfaq.addVoyageEntry(new Voyage("Aasiaat", "68 42.6N", "052 53.0W", converter.toObject("29-09-2013 21:30"),
                converter.toObject("29-09-2013 22:00")));
        sarfaq.addVoyageEntry(new Voyage("Sisimiut", "66 56.5N", "053 40.5W",
                converter.toObject("30-09-2013 09:00"), converter.toObject("30-09-2013 10:30")));
        sarfaq.addVoyageEntry(new Voyage("Kangaamiut", "65 49.6N", "053 20.9W",
                converter.toObject("30-09-2013 17:30"), converter.toObject("30-09-2013 17:45")));
        sarfaq.addVoyageEntry(new Voyage("Maniitsoq", "65 24.8N", "052 54.3W",
                converter.toObject("30-09-2013 21:30"), converter.toObject("30-09-2013 22:00")));
        sarfaq.addVoyageEntry(new Voyage("Nuuk", "64 10.4N", "051 43.5W", converter.toObject("01-10-2013 06:30"),
                converter.toObject("01-10-2013 09:00")));
        sarfaq.addVoyageEntry(new Voyage("Qeqertarsuatsiaat", "63 05.4N", "050 41.0W",
                converter.toObject("01-10-2013 16:30"), converter.toObject("01-10-2013 16:45")));

        sarfaq.addVoyageEntry(new Voyage("Paamiut", "61 59.8N", "049 40.8W", converter.toObject("01-10-2013 23:30"),
                converter.toObject("02-10-2013 00:00")));
        sarfaq.addVoyageEntry(new Voyage("Arsuk", "61 10.5N", "048 27.1W", converter.toObject("02-10-2013 06:45"),
                converter.toObject("02-10-2013 07:00")));
        sarfaq.addVoyageEntry(new Voyage("Qaqortoq", "60 43.1N", "046 02.4W",
                converter.toObject("02-10-2013 15:30"), converter.toObject("02-10-2013 19:00")));
        sarfaq.addVoyageEntry(new Voyage("Narsaq", "60 54.5N", "046 03.0W", converter.toObject("02-10-2013 21:00"),
                converter.toObject("02-10-2013 21:30")));

        sarfaq.addVoyageEntry(new Voyage("Arsuk", "61 10.5N", "048 27.2W", converter.toObject("03-10-2013 06:45"),
                converter.toObject("03-10-2013 07:00")));
        sarfaq.addVoyageEntry(new Voyage("Paamiut", "61 59.8N", "049 40.8W", converter.toObject("03-10-2013 13:30"),
                converter.toObject("03-10-2013 14:30")));
        sarfaq.addVoyageEntry(new Voyage("Qeqertarsuatsiaat", "63 05.4N", "050 41.0W",
                converter.toObject("03-10-2013 22:30"), converter.toObject("03-10-2013 22:45")));
        sarfaq.addVoyageEntry(new Voyage("Nuuk", "64 10.4N", "051 43.5W", converter.toObject("04-10-2013 09:00"),
                converter.toObject("04-10-2013 11:00")));

        // firstDeparture.

        Duration d = new Duration(firstDeparture, now);
        int weeks = (int) d.getStandardDays() / 7;

        logger.debug("Duration: {}, weeks:{}, days: {}", d, weeks, d.getStandardDays());

        List<Voyage> schedule = sarfaq.getSchedule();
        if (weeks > 0) {
            for (Voyage v : schedule) {
                v.setArrival(v.getArrival() == null ? null : v.getArrival().plusWeeks(weeks));
                v.setDeparture(v.getDeparture() == null ? null : v.getDeparture().plusWeeks(weeks));
            }
        }
        logger.debug("Schedule: {}", schedule);

        for (Voyage v : schedule) {
            scheduleDao.saveEntity(v);
        }
        em.flush();
    }

    private void uploadSarfaqRoutes() {
        logger.info("BEFORE UPLOAD - SARFAQ");

        List<Voyage> schedule = scheduleDao.getSchedule(331037000L);

        logger.debug("schedule: {}", schedule);

        insertDemoRoute(schedule.get(0).getEnavId(), "/demo/routes/SARFAQ-Nuuk-Maniitsoq.txt", true);
        insertDemoRoute(schedule.get(1).getEnavId(), "/demo/routes/SARFAQ-Maniitsoq-Kangaamiut.txt", false);
        insertDemoRoute(schedule.get(2).getEnavId(), "/demo/routes/SARFAQ-Kangaamiut-Sisimiut.txt", false);
    }

    private void createNajaArcticaTestData() {
        logger.info("BEFORE CREATION - NAJA ARCTICA");

        // Create vessel and user
        Vessel newVessel = new Vessel();
        newVessel.setMmsi(219623000L);
        newVessel = vesselDao.saveEntity(newVessel);

        SailorRole sailorRole = new SailorRole();
        sailorRole.setVessel(newVessel);

        vesselDao.saveEntity(sailorRole);

        SecuredUser user = SecurityUtil.createUser("naja", testPassword, testEmail, null);
        user.setRole(sailorRole);

        vesselDao.saveEntity(user);
    }

    private void createArinaArcticaTestData() {
        logger.info("BEFORE CREATION - ARINA ARCTICA");

        // Create vessel and user
        Vessel newVessel = new Vessel();
        newVessel.setMmsi(219097000L);
        newVessel = vesselDao.saveEntity(newVessel);

        SailorRole sailorRole = new SailorRole();
        sailorRole.setVessel(newVessel);

        vesselDao.saveEntity(sailorRole);

        SecuredUser user = SecurityUtil.createUser("arina", testPassword, testEmail, null);
        user.setRole(sailorRole);

        vesselDao.saveEntity(user);
    }

    private void createSilverExplorerTestData() {
        logger.info("BEFORE CREATION - SILVER EXPLORER");

        // Create vessel and user
        Vessel newVessel = new Vessel();
        newVessel.setMmsi(311562000L);
        newVessel = vesselDao.saveEntity(newVessel);

        SailorRole sailorRole = new SailorRole();
        sailorRole.setVessel(newVessel);

        vesselDao.saveEntity(sailorRole);

        SecuredUser user = SecurityUtil.createUser("silver", testPassword, testEmail, null);
        user.setRole(sailorRole);

        vesselDao.saveEntity(user);
    }

    private void createArtaniaTestData() {
        logger.info("BEFORE CREATION - ARTANIA");

        // Create vessel and user
        Vessel newVessel = new Vessel();
        newVessel.setMmsi(310456000L);
        newVessel = vesselDao.saveEntity(newVessel);

        SailorRole sailorRole = new SailorRole();
        sailorRole.setVessel(newVessel);

        vesselDao.saveEntity(sailorRole);

        SecuredUser user = SecurityUtil.createUser("artania", testPassword, testEmail, null);
        user.setRole(sailorRole);

        vesselDao.saveEntity(user);
    }

    private void createEmeraldPrincessTestData() {
        logger.info("BEFORE CREATION - EMERALD PRINCESS");

        // Create vessel and user
        Vessel newVessel = new Vessel();
        newVessel.setMmsi(310531000L);
        newVessel = vesselDao.saveEntity(newVessel);

        SailorRole sailorRole = new SailorRole();
        sailorRole.setVessel(newVessel);

        vesselDao.saveEntity(sailorRole);

        SecuredUser user = SecurityUtil.createUser("princess", testPassword, testEmail, null);
        user.setRole(sailorRole);

        vesselDao.saveEntity(user);
    }

    private void createCarnivalLegendTestData() {
        logger.info("BEFORE CREATION - CARNIVAL LEGEND");

        // Create vessel and user
        Vessel newVessel = new Vessel();
        newVessel.getAisData().setName("CARNIVAL LEGEND");
        newVessel.setMmsi(354237000L);
        newVessel.getAisData().setCallsign("H3VT");
        newVessel.getAisData().setImoNo(9224726L);
        newVessel.setGrossTonnage(85942);
        newVessel = vesselDao.saveEntity(newVessel);

        SailorRole sailorRole = new SailorRole();
        sailorRole.setVessel(newVessel);

        vesselDao.saveEntity(sailorRole);

        SecuredUser user = SecurityUtil.createUser("carnivalLegend", testPassword, testEmail, null);
        user.setRole(sailorRole);

        vesselDao.saveEntity(user);

        DateTime now = DateTime.now(DateTimeZone.UTC);

        newVessel.addVoyageEntry(new Voyage("Copenhagen", "55 67.61N", "12 56.83E", null,
                now.withTime(12, 57, 0, 0), 12, 300, true));
        newVessel.addVoyageEntry(
                new Voyage("Nuuk", "64 10.4N", "051 43.5W", now.plusDays(10).withTime(7, 10, 0, 0), null));

        for (Voyage v : newVessel.getSchedule()) {
            vesselDao.saveEntity(v);
        }
    }

    private void uploadCarnivalLegendRoutes() {
        logger.info("BEFORE UPLOAD - CARNIVAL LEGEND");

        List<Voyage> schedule = scheduleDao.getSchedule(354237000L);
        insertDemoRoute(schedule.get(0).getEnavId(), "/demo/routes/CARNIVAL-LEGEND-Cph-Nuuk.txt", true);
    }

    private void createArcticCommandLogin() {
        logger.info("BEFORE CREATION - Arctic Command");

        ReportingAuthorityRole role = new ReportingAuthorityRole();

        vesselDao.saveEntity(role);

        SecuredUser user = SecurityUtil.createUser("arcticCommand", testPassword, testEmail, EXCLUDE_EXACT_EARTH);
        user.setRole(role);

        vesselDao.saveEntity(user);
    }

    private void createAasiaatLogin() {
        logger.info("BEFORE CREATION - Kyst radion");

        ReportingAuthorityRole role = new ReportingAuthorityRole();
        vesselDao.saveEntity(role);

        SecuredUser user = SecurityUtil.createUser("aasiaat", testPassword, testEmail, EXCLUDE_EXACT_EARTH);
        user.setRole(role);
        vesselDao.saveEntity(user);
    }

    private void createNanoqLogin() {
        logger.info("BEFORE CREATION - Nanoq");

        ShoreRole role = new ShoreRole();
        vesselDao.saveEntity(role);

        SecuredUser user = SecurityUtil.createUser("nanoq", testPassword, testEmail, EXCLUDE_EXACT_EARTH);
        user.setRole(role);
        vesselDao.saveEntity(user);
    }

    private void createDmiLogin() {
        logger.info("BEFORE CREATION - DMI");

        ShoreRole role = new ShoreRole();
        vesselDao.saveEntity(role);

        SecuredUser user = SecurityUtil.createUser("dmi", testPassword, testEmail, EXCLUDE_EXACT_EARTH);
        user.setRole(role);
        vesselDao.saveEntity(user);
    }

    private void createGreenposReports() {
        DateTimeConverter converter = DateTimeConverter.getDateTimeConverter();
        Vessel vessel = vesselDao.getVesselByCallsign("OXPJ2");

        DateTime now = DateTime.now(DateTimeZone.UTC);
        DateTime minus8 = now.minusDays(8);
        DateTime minus7 = now.minusDays(7);
        DateTime minus2 = now.minusDays(2);
        DateTime minus1 = now.minusDays(1);

        GreenPosReport report = new GreenPosSailingPlanReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("66 56.5N", "053 40.50W"), 1, "Sun shine", "NO ICE",
                4.1, 10, "Nuuk", converter.toObject("19-09-2013 10:30"), 6,
                "Route with no particular good route description", null);
        report.setReportedBy("oratank");
        report.setRecipient("greenpos");
        report.setTs(minus8.withHourOfDay(13).withMinuteOfHour(9));
        vesselDao.saveEntity(report);

        report = new GreenPosPositionReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("66 03.772N", "053 46.3W"), 2, "Sun shine",
                "NO ICE", 10.0, 10, null);
        report.setReportedBy("oratank");
        report.setRecipient("greenpos");
        report.setTs(minus8.withHourOfDay(18).withMinuteOfHour(0));
        vesselDao.saveEntity(report);

        report = new GreenPosPositionReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("65 19.926N", "052 57.483W"), 3, "Sun shine",
                "NO ICE", 10.0, 10, null);
        report.setReportedBy("oratank");
        report.setRecipient("greenpos");
        report.setTs(minus7.withHourOfDay(0).withMinuteOfHour(0));
        vesselDao.saveEntity(report);

        report = new GreenPosPositionReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("64 29.198N", "052 29.507W"), 4, "Sun shine",
                "NO ICE", 10.0, 10, null);
        report.setReportedBy("oratank");
        report.setRecipient("greenpos");
        report.setTs(minus7.withHourOfDay(6).withMinuteOfHour(0));
        vesselDao.saveEntity(report);

        report = new GreenPosFinalReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("64 10.4N", "051 43.5W"), 5, "Sun shine", "NO ICE",
                null);
        report.setReportedBy("oratank");
        report.setRecipient("greenpos");
        report.setTs(minus7.withHourOfDay(10).withMinuteOfHour(15));
        vesselDao.saveEntity(report);

        vessel = vesselDao.getVesselByCallsign("OYDK2");

        report = new GreenPosPositionReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("63 80.01N", "051 58.04W"), 2, "Sun shine",
                "NO ICE", 11.6, 350, null);
        report.setReportedBy("orasila");
        report.setRecipient("greenpos");
        report.setTs(minus2.withHourOfDay(12).withMinuteOfHour(0));
        vesselDao.saveEntity(report);

        report = new GreenPosFinalReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("64 10.4N", "051 43.5W"), 3, "Sun shine", "NO ICE",
                null);
        report.setReportedBy("orasila");
        report.setRecipient("greenpos");
        report.setTs(minus2.withHourOfDay(16).withMinuteOfHour(2));
        vesselDao.saveEntity(report);

        report = new GreenPosSailingPlanReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("64 10.4N", "051 43.5W"), 1, "Sun shine", "NO ICE",
                4.1, 150, "KYSTFART", converter.toObject("26-09-2013 10:30"), 6,
                "Route with no particular good route description", null);
        report.setReportedBy("orasila");
        report.setRecipient("greenpos");
        report.setTs(minus2.withHourOfDay(23).withMinuteOfHour(12));
        vesselDao.saveEntity(report);

        report = new GreenPosPositionReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("64 10.068N", "051 64.78W"), 2, "Sun shine",
                "Spredte skosser og let tyndis", 11.6, 162, null);
        report.setReportedBy("orasila");
        report.setRecipient("greenpos");
        report.setTs(minus1.withHourOfDay(0).withMinuteOfHour(0));
        report.setTs(converter.toObject("25-09-2013 00:00"));
        vesselDao.saveEntity(report);

        report = new GreenPosDeviationReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("64 10.068N", "051 64.78W"), 2,
                "Vi smutter lige en tur omkring Sisimiut og henter cigaretter mm. ",
                "Der er en udbredt mangel p cigaretter p broen, hvilket er et problem for sejladsen");
        report.setReportedBy("orasila");
        report.setRecipient("greenpos");
        report.setTs(minus1.withHourOfDay(4).withMinuteOfHour(0));
        vesselDao.saveEntity(report);

        report = new GreenPosPositionReport(vessel.getAisData().getName(), vessel.getMmsi(),
                vessel.getAisData().getCallsign(), new Position("64 10.068N", "051 64.78W"), 3, "Sun shine",
                "Spredte skosser og let tyndis", 11.6, 162, null);
        report.setReportedBy("orasila");
        report.setRecipient("greenpos");
        report.setTs(minus1.withHourOfDay(6).withMinuteOfHour(0));
        vesselDao.saveEntity(report);

    }

    private void logExistingEntries() {
        logger.info("Roles: {} ", vesselDao.getAll(Role.class));
        logger.info("Users: {} ", vesselDao.getAll(SecuredUser.class));
        logger.info("Vessels: {} ", vesselDao.getAll(Vessel.class));
        logger.info("Voyage: {} ", vesselDao.getAll(Voyage.class));
        logger.info("Berth: {} ", vesselDao.getAll(Berth.class));
    }

    private void insertDemoRoute(String voyageId, String file, boolean activate) {
        InputStream is = getClass().getResourceAsStream(file);
        try {
            Route r = new RouteParserComponent().parseRoute(file, is, new HashMap<String, String>());
            new RouteSaver(scheduleDao).saveRoute(r, voyageId, activate);
        } catch (IOException e) {
            logger.error("Failed uploading demo route Miami-Nuuk.txt", e);
        }
    }

}