package org.sigmah.server.handler; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * 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 3 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, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import com.extjs.gxt.ui.client.Style.SortDir; import com.extjs.gxt.ui.client.data.SortInfo; import com.google.inject.Inject; import org.sigmah.shared.command.GetSites; import org.sigmah.shared.command.result.SiteResult; import org.sigmah.shared.dto.AdminEntityDTO; import org.sigmah.shared.dto.BoundingBoxDTO; import org.sigmah.shared.dto.PartnerDTO; import org.sigmah.shared.dto.SiteDTO; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.sigmah.server.dao.SiteTableDAO; import org.sigmah.server.dao.util.SiteOrder; import org.sigmah.server.dao.util.SiteProjectionBinder; import org.sigmah.server.dao.util.SiteTableColumn; import org.sigmah.server.dispatch.impl.UserDispatch; import org.sigmah.server.domain.AdminEntity; import org.sigmah.server.domain.User; import org.sigmah.server.handler.base.AbstractCommandHandler; import org.sigmah.shared.dispatch.CommandException; /** * Handler for {@link GetSites} command. * * @author Alex Bertram * @author Raphaƫl Calabro (rcalabro@ideia.fr) v2.0 * @see org.sigmah.shared.command.GetSites */ public class GetSitesHandler extends AbstractCommandHandler<GetSites, SiteResult> { /** * DAO used to retrieve data about the sites. */ @Inject private SiteTableDAO siteDAO; @Override protected SiteResult execute(GetSites command, UserDispatch.UserExecutionContext context) throws CommandException { final List<SiteOrder> order = sortInfoToSortOrder(command); int offset = calculateOffset(command, context.getUser(), order); final List<SiteDTO> sites = siteDAO.query( context.getUser(), command.getFilter(), order, new ModelBinder(), SiteTableDAO.RETRIEVE_ALL, offset, command.getLimit()); return new SiteResult(sites, offset, siteDAO.queryCount(context.getUser(), command.getFilter())); } private int calculateOffset(GetSites cmd, User user, List<SiteOrder> order) { int offset; if (cmd.getSeekToSiteId() != null && cmd.getSeekToSiteId() != 0 && cmd.getLimit() > 0) { int pageNum = siteDAO.queryPageNumber( user, cmd.getFilter(), order, cmd.getLimit(), cmd.getSeekToSiteId()); offset = pageNum * cmd.getLimit(); } else { offset = cmd.getOffset(); } return offset; } // TODO: ideally the client is just sending the SiteOrder object directly, // but we'll need to harmonize the field names first. private List<SiteOrder> sortInfoToSortOrder(GetSites cmd) { final List<SiteOrder> order = new ArrayList<SiteOrder>(); if (cmd.getSortInfo().getSortDir() != SortDir.NONE) { String field = cmd.getSortInfo().getSortField(); if (field.equals("date1")) { order.add( order(SiteTableColumn.date1, cmd.getSortInfo())); } else if (field.equals("date2")) { order.add(order(SiteTableColumn.date2, cmd.getSortInfo())); } else if (field.equals("locationName")) { order.add(order(SiteTableColumn.location_name, cmd.getSortInfo())); } else if (field.equals("partner")) { order.add(order(SiteTableColumn.partner_name, cmd.getSortInfo())); } else if (field.equals("locationAxe")) { order.add(order(SiteTableColumn.location_axe, cmd.getSortInfo())); } else { order.add(new SiteOrder(field, cmd.getSortInfo().getSortDir() == SortDir.DESC)); } } return order; } protected SiteOrder order(SiteTableColumn column, SortInfo si) { if (si.getSortDir() == SortDir.ASC) { return SiteOrder.ascendingOn(column.property()); } else { return SiteOrder.descendingOn(column.property()); } } protected class ModelBinder implements SiteProjectionBinder<SiteDTO> { private final Map<Integer, AdminEntityDTO> adminEntities = new HashMap<Integer, AdminEntityDTO>(); private final Map<Integer, PartnerDTO> partners = new HashMap<Integer, PartnerDTO>(); @Override public SiteDTO newInstance(String[] properties, ResultSet rs) throws SQLException { SiteDTO model = new SiteDTO(); model.setId( rs.getInt(SiteTableColumn.id.index()) ); model.setActivityId( rs.getInt(SiteTableColumn.activity_id.index() )); model.setDatabaseId( rs.getInt(SiteTableColumn.database_id.index() )); model.setDate1(rs.getDate(SiteTableColumn.date1.index() )); model.setDate2(rs.getDate(SiteTableColumn.date2.index() )); model.setLocationName( rs.getString( SiteTableColumn.location_name.index() )); model.setLocationAxe( rs.getString( SiteTableColumn.location_axe.index() )); model.setX( rs.getDouble( SiteTableColumn.x.index())); model.setY( rs.getDouble( SiteTableColumn.y.index())); model.setComments( rs.getString( SiteTableColumn.comments.index() )); int partnerId = rs.getInt(SiteTableColumn.partner_id.index()); PartnerDTO partner = partners.get(partnerId); if (partner == null) { partner = new PartnerDTO( partnerId, rs.getString(SiteTableColumn.partner_name.index())); partners.put(partnerId, partner); } model.setPartner(partner); return model; } @Override public void setAdminEntity(SiteDTO site, AdminEntity entity) { AdminEntityDTO model = adminEntities.get(entity.getId()); if (model == null) { model = new AdminEntityDTO(); model.setId(entity.getId()); model.setName(entity.getName()); model.setLevelId(entity.getLevel().getId()); if(entity.getParent() != null) { model.setParentId(entity.getParent().getId()); } if(entity.getBounds() != null) { model.setBounds(new BoundingBoxDTO( entity.getBounds().getX1(), entity.getBounds().getY1(), entity.getBounds().getX2(), entity.getBounds().getY2() )); } adminEntities.put(entity.getId(), model); } site.setAdminEntity(entity.getLevel().getId(), model); } @Override public void setAttributeValue(SiteDTO site, int attributeId, boolean value) { site.setAttributeValue(attributeId, value); } @Override public void addIndicatorValue(SiteDTO site, int indicatorId, int aggregationMethod, double value) { site.setIndicatorValue(indicatorId, value); } } }