fi.vm.sade.organisaatio.dao.impl.OrganisaatioNimiDAOImpl.java Source code

Java tutorial

Introduction

Here is the source code for fi.vm.sade.organisaatio.dao.impl.OrganisaatioNimiDAOImpl.java

Source

/*
* Copyright (c) 2014 The Finnish Board of Education - Opetushallitus
*
* This program is free software:  Licensed under the EUPL, Version 1.1 or - as
* soon as they will be approved by the European Commission - subsequent versions
* of the EUPL (the "Licence");
*
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at: http://www.osor.eu/eupl/
*
* 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
*/

package fi.vm.sade.organisaatio.dao.impl;

import fi.vm.sade.generic.dao.AbstractJpaDAOImpl;
import fi.vm.sade.organisaatio.dao.OrganisaatioDAO;
import fi.vm.sade.organisaatio.dao.OrganisaatioNimiDAO;
import fi.vm.sade.organisaatio.model.MonikielinenTeksti;
import fi.vm.sade.organisaatio.model.Organisaatio;
import fi.vm.sade.organisaatio.model.OrganisaatioNimi;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

/**
 * @author simok
 */
@Repository
public class OrganisaatioNimiDAOImpl extends AbstractJpaDAOImpl<OrganisaatioNimi, Long>
        implements OrganisaatioNimiDAO {

    private static final Logger LOG = LoggerFactory.getLogger(OrganisaatioNimiDAOImpl.class);

    @Autowired(required = true)
    OrganisaatioDAO organisaatioDAO;

    @Override
    public OrganisaatioNimi addNimi(Organisaatio organisaatio, MonikielinenTeksti nimi, Date alkuPvm,
            String paivittaja) {
        if (organisaatio == null) {
            throw new IllegalArgumentException();
        }

        LOG.info("addNimi({}, {}, {})", new Object[] { organisaatio.getOid(), alkuPvm, nimi.getValues() });

        if (alkuPvm == null) {
            alkuPvm = new Date();
        }

        //
        // Luodaan uusi nimi organisaatiolle (nimihistorian entry)
        //
        OrganisaatioNimi organisaatioNimi = new OrganisaatioNimi();
        organisaatioNimi.setOrganisaatio(organisaatio);
        organisaatioNimi.setAlkuPvm(alkuPvm);
        organisaatioNimi.setNimi(nimi);
        organisaatioNimi.setPaivittaja(paivittaja);

        organisaatioNimi = insert(organisaatioNimi);

        return organisaatioNimi;
    }

    @Override
    public List<OrganisaatioNimi> findNimet(Organisaatio organisaatio) {
        if (organisaatio == null) {
            throw new IllegalArgumentException("organisaatio cannot be null");
        }

        LOG.info("findNimet({})", organisaatio.getOid());

        return findBy("organisaatio", organisaatio);
    }

    @Override
    public List<OrganisaatioNimi> findNimet(String organisaatioOid) {
        Organisaatio organisaatio = organisaatioDAO.findByOid(organisaatioOid);

        return this.findNimet(organisaatio);
    }

    @Override
    public OrganisaatioNimi findNimi(Organisaatio organisaatio, Date alkuPvm) {
        if (organisaatio == null) {
            throw new IllegalArgumentException("organisaatio cannot be null");
        }

        LOG.info("findNimi({}, {})", new Object[] { organisaatio.getId(), alkuPvm });

        // Kysely kokeilty mys QueryDsl:ll
        // Ongelmana oli se, ett pivmrn perusteella haku ei onnistunut jos
        // organisaation id:ll rivej oli enemmn kuin 1

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        String s = "SELECT n FROM OrganisaatioNimi n " + "WHERE " + "organisaatio_id = " + organisaatio.getId()
                + " and " + "alkupvm = '" + df.format(alkuPvm) + "'";

        Query q = getEntityManager().createQuery(s);

        List<OrganisaatioNimi> organisaatioNimet = (List<OrganisaatioNimi>) q.getResultList();

        LOG.info("findNimi() result size: " + organisaatioNimet.size());

        if (organisaatioNimet.size() == 1) {
            return organisaatioNimet.get(0);
        }

        LOG.info("findNimi({}, {}) --> OrganisaatioNimi not found", new Object[] { organisaatio.getId(), alkuPvm });

        return null;
    }

    @Override
    public OrganisaatioNimi findNimi(String organisaatioOid, Date alkuPvm) {
        Organisaatio organisaatio = organisaatioDAO.findByOid(organisaatioOid);

        return this.findNimi(organisaatio, alkuPvm);
    }

    @Override
    public OrganisaatioNimi findCurrentNimi(Organisaatio organisaatio) {
        if (organisaatio == null) {
            throw new IllegalArgumentException("organisaatio cannot be null");
        }

        LOG.info("findCurrentNimi({})", new Object[] { organisaatio.getId() });

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        String s = "SELECT n FROM OrganisaatioNimi n " + "WHERE " + "organisaatio_id = " + organisaatio.getId()
                + " AND " + "alkupvm = (SELECT MAX (o.alkuPvm) " + "FROM OrganisaatioNimi o " + "WHERE "
                + "organisaatio_id = " + organisaatio.getId() + " AND " + "alkupvm <= '" + df.format(new Date())
                + "')";

        Query q = getEntityManager().createQuery(s);

        List<OrganisaatioNimi> organisaatioNimet = (List<OrganisaatioNimi>) q.getResultList();

        LOG.info("findCurrentNimi() result size: " + organisaatioNimet.size());

        if (organisaatioNimet.size() == 1) {
            return organisaatioNimet.get(0);
        }

        LOG.info("findNimi({}) --> OrganisaatioNimi not found", new Object[] { organisaatio.getId() });

        return null;
    }

    @Override
    public OrganisaatioNimi findCurrentNimi(String organisaatioOid) {
        Organisaatio organisaatio = organisaatioDAO.findByOid(organisaatioOid);

        return this.findCurrentNimi(organisaatio);
    }

    /**
     * Haetaan organisaatiot, joiden nimi eroaa nimihistorian current nimest
     * -----------------------------------------------------------------------
     * SELECT org.*
     * FROM organisaatio org
     * WHERE org.nimi_mkt !=
     * (
     * SELECT org_nimi.nimi_mkt
     * FROM organisaatio_nimi org_nimi
     * WHERE org_nimi.alkupvm =
     * (
     * SELECT max(org_nimi2.alkupvm)
     * FROM organisaatio_nimi org_nimi2
     * WHERE org_nimi.organisaatio_id = org_nimi2.organisaatio_id
     * AND org_nimi2.alkupvm <= '2014-09-01'
     * )
     * AND org.id = org_nimi.organisaatio_id
     * )
     *
     * Ylloleva SQL lauseke on alla kirjoitettu HQL muotoon.
     *
     * @return
     **/
    @Override
    public List<Organisaatio> findNimiNotCurrentOrganisaatiot() {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        String s = "SELECT org FROM Organisaatio org " + "WHERE org.nimi != " + "( "
                + "SELECT org_nimi.nimi FROM OrganisaatioNimi org_nimi " + "WHERE org_nimi.alkuPvm = " + "( "
                + "SELECT MAX (org_nimi2.alkuPvm) FROM OrganisaatioNimi org_nimi2 "
                + "WHERE org_nimi.organisaatio = org_nimi2.organisaatio " + "AND org_nimi2.alkuPvm <= '"
                + df.format(new Date()) + "' " + ") " + "AND org = org_nimi.organisaatio " + ")";

        Query q = getEntityManager().createQuery(s);

        List<Organisaatio> organisaatiot = (List<Organisaatio>) q.getResultList();

        return organisaatiot;
    }

}