cpcc.vvrte.services.db.VvRteRepositoryImpl.java Source code

Java tutorial

Introduction

Here is the source code for cpcc.vvrte.services.db.VvRteRepositoryImpl.java

Source

// This code is part of the CPCC-NG project.
//
// Copyright (c) 2013 Clemens Krainer <clemens.krainer@gmail.com>
//
// 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.
//
// 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

package cpcc.vvrte.services.db;

import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;
import org.hibernate.sql.JoinType;
import org.slf4j.Logger;

import cpcc.core.services.jobs.TimeService;
import cpcc.vvrte.entities.TaskState;
import cpcc.vvrte.entities.VirtualVehicle;
import cpcc.vvrte.entities.VirtualVehicleState;
import cpcc.vvrte.entities.VirtualVehicleStorage;

/**
 * VvRteRepository implementation.
 */
public class VvRteRepositoryImpl implements VvRteRepository {
    private Logger logger;
    private Session session;
    private TaskRepository taskRepository;
    private TimeService timeService;

    /**
     * @param logger the application logger.
     * @param session the Hibernate session.
     * @param taskRepository the task repository instance.
     * @param timeService the time service.
     */
    public VvRteRepositoryImpl(Logger logger, Session session, TaskRepository taskRepository,
            TimeService timeService) {
        this.logger = logger;
        this.session = session;
        this.taskRepository = taskRepository;
        this.timeService = timeService;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void resetVirtualVehicleStates() {
        session.createQuery("UPDATE VirtualVehicle SET state = :newState WHERE state = :oldState")
                .setParameter("newState", VirtualVehicleState.MIGRATION_INTERRUPTED_SND)
                .setParameter("oldState", VirtualVehicleState.MIGRATING_SND).executeUpdate();

        session.createQuery("UPDATE VirtualVehicle SET state = :newState WHERE state = :oldState")
                .setParameter("newState", VirtualVehicleState.MIGRATION_INTERRUPTED_SND)
                .setParameter("oldState", VirtualVehicleState.MIGRATION_AWAITED_SND).executeUpdate();

        session.createQuery("UPDATE VirtualVehicle SET migrationStartTime = :now "
                + "WHERE state = :state AND migrationStartTime is NULL")
                .setParameter("state", VirtualVehicleState.MIGRATION_INTERRUPTED_SND)
                .setParameter("now", timeService.newDate()).executeUpdate();

        session.createQuery("UPDATE VirtualVehicle SET state = :newState WHERE state = :oldState")
                .setParameter("newState", VirtualVehicleState.INTERRUPTED)
                .setParameter("oldState", VirtualVehicleState.RUNNING).executeUpdate();

        session.createQuery("UPDATE VirtualVehicle SET task = null").executeUpdate();

        session.createQuery("DELETE Task").executeUpdate();
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    @Override
    public List<VirtualVehicle> findAllVehicles() {
        return (List<VirtualVehicle>) session.createCriteria(VirtualVehicle.class)
                .addOrder(Property.forName("id").asc()).list();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @SuppressWarnings("unchecked")
    public Map<VirtualVehicleState, Integer> getVvStatistics() {
        Map<VirtualVehicleState, Integer> statistics = new HashMap<>();

        statistics.putAll(Stream.of(VirtualVehicleState.values()).map(x -> new SimpleEntry<>(x, Integer.valueOf(0)))
                .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())));

        List<VirtualVehicleState> stateList = session.createCriteria(VirtualVehicle.class)
                .setProjection(Projections.property("state")).list();

        stateList.stream().forEach(x -> statistics.put(x, statistics.get(x) + 1));

        return statistics;
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    @Override
    public List<VirtualVehicle> findAllActiveVehicles(int maxResults) {
        return (List<VirtualVehicle>) session.createCriteria(VirtualVehicle.class)
                .add(Restrictions.eq("state", VirtualVehicleState.RUNNING)).addOrder(Property.forName("id").asc())
                .setMaxResults(maxResults).list();
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    @Override
    public List<VirtualVehicle> findAllStuckVehicles(Set<VirtualVehicleState> allowedStates) {
        List<VirtualVehicle> vvs = new ArrayList<VirtualVehicle>();

        vvs.addAll(
                (List<VirtualVehicle>) session.createCriteria(VirtualVehicle.class, "v")
                        .add(Restrictions.in("state", allowedStates)).createCriteria("v.task", "t",
                                JoinType.LEFT_OUTER_JOIN, Restrictions.eq("taskState", TaskState.COMPLETED))
                        .list());

        vvs.addAll((List<VirtualVehicle>) session.createCriteria(VirtualVehicle.class)
                .add(Restrictions.eq("state", VirtualVehicleState.TASK_COMPLETION_AWAITED))
                .add(Restrictions.isNull("task")).list());

        vvs.addAll((List<VirtualVehicle>) session.createCriteria(VirtualVehicle.class)
                .add(Restrictions.eq("state", VirtualVehicleState.MIGRATION_AWAITED_SND))
                .add(Restrictions.le("migrationStartTime", new Date(timeService.currentTimeMillis() - 10000)))
                .list());

        vvs.addAll((List<VirtualVehicle>) session.createCriteria(VirtualVehicle.class).add(Restrictions.in("state",
                Arrays.asList(VirtualVehicleState.MIGRATING_SND, VirtualVehicleState.MIGRATION_INTERRUPTED_SND,
                        VirtualVehicleState.MIGRATION_COMPLETED_SND)))
                .add(Restrictions.le("updateTime", new Date(timeService.currentTimeMillis() - 55000))).list());

        vvs.addAll((List<VirtualVehicle>) session.createCriteria(VirtualVehicle.class)
                .add(Restrictions.eq("state", VirtualVehicleState.MIGRATING_RCV))
                .add(Restrictions.le("updateTime", new Date(timeService.currentTimeMillis() - 175000))).list());

        return vvs;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public VirtualVehicle findVirtualVehicleById(Integer id) {
        return (VirtualVehicle) session.createCriteria(VirtualVehicle.class).add(Restrictions.eq("id", id))
                .uniqueResult();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public VirtualVehicle findVirtualVehicleByName(String name) {
        return (VirtualVehicle) session.createCriteria(VirtualVehicle.class).add(Restrictions.eq("name", name))
                .uniqueResult();
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    @Override
    public VirtualVehicle findVirtualVehicleByUUID(String uuid) {
        List<VirtualVehicle> vvs = (List<VirtualVehicle>) session.createCriteria(VirtualVehicle.class)
                .add(Restrictions.eq("uuid", uuid)).addOrder(Order.asc("id")).list();

        VirtualVehicle result = vvs.isEmpty() ? null : vvs.remove(0);
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void deleteVirtualVehicleById(VirtualVehicle vehicle) {
        if (vehicle == null) {
            return;
        }

        if (!VirtualVehicleState.VV_STATES_FOR_DELETE.contains(vehicle.getState())) {
            logger.warn("Not deleting virtual vehicle " + vehicle.getName() + " (" + vehicle.getUuid()
                    + ") because of state " + vehicle.getState());
            return;
        }

        logger.info("Deleting virtual vehicle " + vehicle.getName() + " (" + vehicle.getUuid() + ") "
                + vehicle.getState());

        session.createQuery("DELETE FROM VirtualVehicleStorage WHERE virtualVehicle.id = :id")
                .setParameter("id", vehicle.getId()).executeUpdate();

        taskRepository.unlinkTasksFromVirtualVehicleById(vehicle.getId());

        vehicle.setTask(null);
        session.update(vehicle);
        session.delete(vehicle);
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    @Override
    public List<String> findAllStorageItemNames() {
        return (List<String>) session.createQuery("select name from VirtualVehicleStorage").list();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public VirtualVehicleStorage findStorageItemByVirtualVehicleAndName(VirtualVehicle vehicle, String name) {
        //        return (VirtualVehicleStorage) session
        //            .createQuery("from VirtualVehicleStorage where virtualVehicle.id = :id AND name = :name")
        //            .setInteger("id", vehicle.getId())
        //            .setString("name", name)
        //            .uniqueResult();

        return (VirtualVehicleStorage) session
                .createCriteria(VirtualVehicleStorage.class).add(Restrictions
                        .and(Restrictions.eq("virtualVehicle.id", vehicle.getId()), Restrictions.eq("name", name)))
                .uniqueResult();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public VirtualVehicleStorage findStorageItemById(Integer id) {
        return (VirtualVehicleStorage) session.createCriteria(VirtualVehicleStorage.class)
                .add(Restrictions.eq("id", id)).uniqueResult();
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    @Override
    public List<VirtualVehicleStorage> findStorageItemsByVirtualVehicle(Integer id) {
        return (List<VirtualVehicleStorage>) session.createCriteria(VirtualVehicleStorage.class)
                .addOrder(Order.asc("modificationTime")).createCriteria("virtualVehicle", "vv", JoinType.INNER_JOIN)
                .add(Restrictions.eq("id", id)).list();
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    @Override
    public List<VirtualVehicleStorage> findStorageItemsByVirtualVehicle(Integer id, String startName,
            int maxEntries) {
        return (List<VirtualVehicleStorage>) session
                .createQuery(
                        "FROM VirtualVehicleStorage WHERE virtualVehicle.id = :id AND name > :name ORDER BY name")
                .setInteger("id", id).setString("name", startName).setMaxResults(maxEntries > 0 ? maxEntries : 1)
                .list();
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    @Override
    public List<VirtualVehicleStorage> findAllStorageItemsByVirtualVehicle(Integer id) {
        return (List<VirtualVehicleStorage>) session
                .createQuery("FROM VirtualVehicleStorage WHERE virtualVehicle.id = :id").setInteger("id", id)
                .list();
    }
}