Package ch.tatool.app.service.impl

Source Code of ch.tatool.app.service.impl.ModuleDAO

/*******************************************************************************
* Copyright (c) 2011 Michael Ruflin, Andr� Locher, Claudia von Bastian.
*
* This file is part of Tatool.
*
* Tatool is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Tatool 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Tatool. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package ch.tatool.app.service.impl;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import ch.tatool.app.data.ModuleImpl;
import ch.tatool.app.data.ModuleSessionImpl;
import ch.tatool.app.data.TrialImpl;
import ch.tatool.app.data.UserAccountImpl;
import ch.tatool.data.Module;

/**
* Property access object for module objects.
*
* @author Michael Ruflin
*/
public class ModuleDAO extends HibernateDaoSupport {

    /**
     * Get info objects of all available module instances for an account.
     *
     * @param account
     * @return
     */
    @SuppressWarnings("unchecked")
    public Set<Module.Info> getModules(final UserAccountImpl account) {
        return (Set<Module.Info>) getHibernateTemplate().execute(
            new HibernateCallback() {
                public Object doInHibernate(Session session) {
                    // query the names and ids of all modules inside an account
                    Query query = session.createQuery("select module.id, module.name FROM ModuleImpl as module where module.accountId = :accountId");
                    query.setParameter("accountId", account.getId());
                    List<Object[]> results = (List<Object[]>) query.list();
                    Set<Module.Info> infos = new TreeSet<Module.Info>();
                    for (Object[] result : results) {
                        ModuleInfoImpl info = new ModuleInfoImpl();
                        info.setAccount(account);
                        info.setId((Long) result[0]);
                        info.setName((String) result[1]);
                        infos.add(info);
                    }
                    return infos;
                }
            }
        );
    }
   
   
    /**
     * Loads a module object from the database, using the id specified in the module.
     *
     * If no module with given id exists in the database, a new one is created
     *
     * @param moduleInfo the module to load
     */
    public ModuleImpl loadModule(ModuleInfoImpl moduleInfo) {
        ModuleImpl module = (ModuleImpl) getHibernateTemplate().get(ModuleImpl.class, moduleInfo.getId());

        // set the account object manually
        if (! moduleInfo.getAccount().getId().equals(module.getAccountId())) {
            throw new RuntimeException("ModuleInfo and Module object don't belong to each other! Account id mismatch");
        }
        module.setAccount(moduleInfo.getAccount());
       
        return module;
    }
   
    /**
     * Deletes a module
     *
     * @param module the module to load
     */
    public void deleteModule(final ModuleInfoImpl moduleInfo) {
        getHibernateTemplate().execute(
            new HibernateCallback() {
                public Object doInHibernate(Session session) {
                  // PENDING: can't hibernate figure this out on its own?
                  // First delete all trials
                  List<?> trialIds = session.createQuery("select id from TrialImpl trial where trial.session.module.id = :id").setParameter("id", moduleInfo.getId()).list();
                  for (Object o : trialIds) {
                    TrialImpl trial = new TrialImpl();
                    session.load(trial, (Long)o);
                    session.delete(trial);
                    //session.createQuery("delete TrialImpl trial where trial.id = :id").setParameter("id", o).executeUpdate();
                  }
                  session.flush();
                 
                  // then delete the sessions
                  List<?> sessionIds = session.createQuery("select id from ModuleSessionImpl session where session.module.id = :id").setParameter("id", moduleInfo.getId()).list();
                  for (Object o : sessionIds) {
                    ModuleSessionImpl s = new ModuleSessionImpl();
                    session.load(s, (Long)o);
                    session.delete(s);
                  }
                 
                  // finally delete the module
                    // Does not work because for some reason the module properties are not deleted in cascade...
                    /*
                    Query query = session.createQuery("delete from ModuleImpl module where module-id = :moduleId");
                    query.setLong("moduleId", moduleInfo.getId());
                    query.executeUpdate();
                    */
                 
                  // and finally the module itself
                  ModuleImpl module = loadModule(moduleInfo);
                    session.delete(module);
                    return null;
                }
            }
        );
    }
   
    public void addModuleProperties(final ModuleImpl impl, final Map<String, String> properties) {
        getHibernateTemplate().execute(
            new HibernateCallback() {
                public Object doInHibernate(Session session) {
                    session.update(impl);
                    Map<String, String> props = impl.getModuleProperties();
                    for (String key : props.keySet()) {
                        logger.debug(key + ": " + props.get(key));
                    }
                    for (String key : properties.keySet()) {
                        String value = properties.get(key);
                        props.put(key, value);
                    }
                    session.save(impl);
                    return null;
                }
            }
        );
    }
   
    /**
     * Stores the module object.
     */
    public void saveModule(ModuleImpl module) {
        getHibernateTemplate().saveOrUpdate(module);
    }
   
    /**
     * Deletes a module object.
     */
    public void deleteModule(Module module) {
        getHibernateTemplate().delete(module);
    }
}
TOP

Related Classes of ch.tatool.app.service.impl.ModuleDAO

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.