/* Copyright (C) 2009 Steffen Dienst 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package de.elatexam.editor.pages.subtaskdefs; import java.util.Iterator; import java.util.Map; import java.util.Set; import net.databinder.hib.Databinder; import net.databinder.models.hib.CriteriaFilterAndSort; import net.databinder.models.hib.OrderingCriteriaBuilder; import net.databinder.models.hib.SortableHibernateProvider; import org.apache.wicket.extensions.markup.html.repeater.data.table.filter.IFilterStateLocator; import org.apache.wicket.extensions.markup.html.repeater.util.SingleSortState; import org.hibernate.Query; import org.hibernate.Session; import de.elatexam.model.SubTaskDef; import de.elatexam.editor.TaskEditorApplication; import de.elatexam.editor.TaskEditorSession; import de.elatexam.editor.util.RemoveNullResultTransformer; /** * XXX ugly hack, clean up this mess as soon as possible. Assumes just one sort, * no nested sort properties, no nested filtering properties, concrete classes * etc. * * @author Steffen Dienst * * @param <T> */ final class PrivateSubtasksDataProvider extends SortableHibernateProvider<SubTaskDef> { private final IFilterStateLocator<SubTaskDef> builder; private final Class<? extends SubTaskDef> clazz; final String query = "select task from BasicUser user left join user.subtaskdefs task where user.username='%s'"; final String adminQuery = "from de.elatexam.model.SubTaskDef task where 1=1"; final String classQuery = " and task.class in (%s)"; PrivateSubtasksDataProvider(final Class<SubTaskDef> objectClass, final OrderingCriteriaBuilder criteriaBuilder, final IFilterStateLocator<SubTaskDef> builder) { super(objectClass, criteriaBuilder); this.builder = builder; this.clazz = objectClass; } private String createQueryString() { String q = String.format(query, TaskEditorSession.get().getUser().getUsername()); // admin sees all subtasks if (TaskEditorApplication.isAdmin()) { q = adminQuery; } if (!SubTaskDef.class.equals(clazz)) { q = q + String.format(classQuery, clazz.getName()); } for (final Map.Entry<String, String> entry : (Set<Map.Entry<String, String>>) ((Map) builder.getFilterState()).entrySet()) { final String property = entry.getKey(); final String value = entry.getValue(); if (value == null) { continue; } q = q + " and task." + property + " like '%" + value + "%'"; } final SingleSortState sort = (SingleSortState) getSortState(); if (sort.getSort() != null) { q = q + " order by task." + sort.getSort().getProperty() + " " + (sort.getSort().isAscending() ? " asc" : "desc"); } return q; } @Override public Iterator<SubTaskDef> iterator(final int first, final int count) { final Session sess = Databinder.getHibernateSession(getFactoryKey()); final Query q = sess.createQuery(createQueryString()); q.setFirstResult(first); q.setMaxResults(count); // q.setResultTransformer(RemoveNullResultTransformer.INSTANCE); return q.iterate(); } @Override public int size() { final Session sess = Databinder.getHibernateSession(getFactoryKey()); final Query q = sess.createQuery(createQueryString()); q.setResultTransformer(RemoveNullResultTransformer.INSTANCE); final int size = q.list().size(); return size; } }