view artifacts/src/main/java/org/dive4elements/river/artifacts/model/CrossSectionFactory.java @ 5838:5aa05a7a34b7

Rename modules to more fitting names.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 15:23:37 +0200
parents flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/CrossSectionFactory.java@bd047b71ab37
children 4897a58c8746
line wrap: on
line source
package org.dive4elements.river.artifacts.model;

import java.util.List;

import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;

import org.dive4elements.river.backend.SessionHolder;
import org.dive4elements.river.model.CrossSection;
import org.dive4elements.river.model.River;

import org.dive4elements.river.artifacts.cache.CacheFactory;

import org.hibernate.Session;
import org.hibernate.Query;


/**
 * Get Cross Sections.
 */
public class CrossSectionFactory {

    protected final static String CACHE_NAME = "cross_sections";

    // TODO use caching consistently, streamline acces.
    /**
     * Get CrossSections for an instantiated River.
     *
     * @param river river object.
     *
     * @return List of Cross Sections of river.
     */
    public static List<CrossSection> getCrossSections(River river) {
        return getCrossSections(river.getName());
    }


    /**
     * Get Cross Sections for a river by name.
     *
     * @param riverName name of the river of interest.
     *
     * @return List of Cross Sections of river.
     */
    public static List<CrossSection> getCrossSections(String riverName) {
        Session session = SessionHolder.HOLDER.get();
        Query query = session.createQuery(
            "from CrossSection where river.name = :rivername");
        query.setParameter("rivername", riverName);
        return query.list();
    }


    /**
     * True if the given section is the "newest" for that river.
     * @param section Given section
     * @return true if the section has the most advanced end of its validity interval
     *         or the most advanced start of its validity interval.
     */
    public static boolean isNewest(CrossSection section) {
        Session session = SessionHolder.HOLDER.get();
        Query query = session.createQuery(
            "from CrossSection where river.id = :riverid "
            + " order by timeInterval.stopTime desc, timeInterval.startTime desc");
        query.setParameter("riverid", section.getRiver().getId());

        List result = query.list();

        if (result == null || result.isEmpty()) {
            return true;
        }
        else {
            CrossSection cs = (CrossSection) result.get(0);
            return section.getId().equals(cs.getId());
        }
    }


    /**
     *  Get a specific CrossSection from db.
     *  @param id The dbid of the cross-section to load.
     */
    public static CrossSection getCrossSection(int id) {
        Cache cache = CacheFactory.getCache(CACHE_NAME);
        if (cache != null) {
            Element element = cache.get(Integer.valueOf(id));
            if (element != null) {
                return (CrossSection) element.getValue();
            }
        }

        CrossSection section = getCrossSectionUncached(id);
        if (cache != null) {
            Element element = new Element(Integer.valueOf(id), section);
            cache.put(element);
        }

        return section;
    }


    /** Get specific CrossSection from database. */
    protected static CrossSection getCrossSectionUncached(int id) {
        Session session = SessionHolder.HOLDER.get();
        Query query = session.createQuery(
                "from CrossSection where id=:id");
        query.setParameter("id", id);
        List<CrossSection> list = query.list();
        return list.isEmpty() ? null : list.get(0);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org