Java tutorial
/******************************************************************************* * 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); } }