/*
* Copyright (C) 2010-2012 Stichting Akvo (Akvo Foundation)
*
* This file is part of Akvo FLOW.
*
* Akvo FLOW is free software: you can redistribute it and modify it under the terms of
* the GNU Affero General Public License (AGPL) as published by the Free Software Foundation,
* either version 3 of the License or any later version.
*
* Akvo FLOW 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 Affero General Public License included below for more details.
*
* The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>.
*/
package org.waterforpeople.mapping.app.web;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import org.json.JSONObject;
import org.waterforpeople.mapping.app.gwt.client.community.CommunityDto;
import org.waterforpeople.mapping.app.gwt.client.community.CountryDto;
import org.waterforpeople.mapping.app.web.dto.GeoRequest;
import org.waterforpeople.mapping.app.web.dto.GeoResponse;
import org.waterforpeople.mapping.dao.CommunityDao;
import org.waterforpeople.mapping.dao.CommunityDao.MAP_TYPE;
import org.waterforpeople.mapping.domain.Community;
import com.gallatinsystems.framework.rest.AbstractRestApiServlet;
import com.gallatinsystems.framework.rest.RestError;
import com.gallatinsystems.framework.rest.RestRequest;
import com.gallatinsystems.framework.rest.RestResponse;
import com.gallatinsystems.framework.rest.exception.RestException;
import com.gallatinsystems.gis.geography.dao.CountryDao;
import com.gallatinsystems.gis.geography.domain.Country;
/**
* servlet to return country/communities as JSON objects
*
* @author Christopher Fagiani
*/
public class GeoServlet extends AbstractRestApiServlet {
private static final long serialVersionUID = -7534864780109561623L;
@SuppressWarnings("unused")
private static final Logger log = Logger.getLogger(GeoServlet.class
.getName());
private CountryDao countryDao;
private CommunityDao communityDao;
public GeoServlet() {
countryDao = new CountryDao();
communityDao = new CommunityDao();
}
@Override
protected RestRequest convertRequest() throws Exception {
HttpServletRequest req = getRequest();
RestRequest restRequest = new GeoRequest();
restRequest.populateFromHttpRequest(req);
return restRequest;
}
/**
* calls the accessPointDao to get the list of access points near the point passed in via the
* request
*/
@Override
protected RestResponse handleRequest(RestRequest req) throws Exception {
GeoRequest geoReq = (GeoRequest) req;
if (GeoRequest.LIST_COUNTRY_ACTION.equalsIgnoreCase(geoReq.getAction())) {
if (geoReq.getMapType() == null) {
return convertToResponse(
countryDao.list(CountryDao.CURSOR_TYPE.all.toString()),
null);
} else {
if (GeoRequest.PUBLIC_MAP_TYPE.equalsIgnoreCase(geoReq
.getMapType())) {
return convertToResponse(
communityDao.listMapCountries(MAP_TYPE.PUBLIC),
null);
} else if (GeoRequest.KMZ_MAP_TYPE.equalsIgnoreCase(geoReq
.getMapType())) {
return convertToResponse(
communityDao.listMapCountries(MAP_TYPE.KMZ), null);
} else {
return null;
}
}
} else if (GeoRequest.LIST_COMMUNITY_ACTION.equalsIgnoreCase(geoReq
.getAction())) {
return convertToResponse(null,
communityDao.listCommunityByCountry(geoReq.getCountry()));
} else {
throw new RestException(new RestError(
RestError.MISSING_PARAM_ERROR_CODE, "Unrecognized Action",
"Action is not valid"), "Action not valid", null);
}
}
/**
* converts the domain objects to dtos and then installs them in an GeoResponse object
*/
protected GeoResponse convertToResponse(List<Country> countries,
List<Community> communities) {
GeoResponse resp = new GeoResponse();
if (countries != null) {
List<CountryDto> dtoList = new ArrayList<CountryDto>();
for (Country c : countries) {
CountryDto dto = new CountryDto();
dto.setIsoAlpha2Code(c.getIsoAlpha2Code());
dto.setIsoAlpha3Code(c.getIsoAlpha3Code());
dto.setIsoNumeric3Code(c.getIsoNumeric3Code());
dto.setCentroidLat(c.getCentroidLat());
dto.setCentroidLon(c.getCentroidLon());
dto.setName(c.getName());
dtoList.add(dto);
}
resp.setCountries(dtoList);
} else if (communities != null) {
List<CommunityDto> dtoList = new ArrayList<CommunityDto>();
for (Community c : communities) {
CommunityDto dto = new CommunityDto();
dto.setCommunityCode(c.getCommunityCode());
dtoList.add(dto);
}
resp.setCommunities(dtoList);
}
return resp;
}
/**
* writes response as a JSON string
*/
@Override
protected void writeOkResponse(RestResponse resp) throws Exception {
getResponse().setStatus(200);
if (resp != null) {
GeoResponse geoResp = (GeoResponse) resp;
JSONObject result = new JSONObject(geoResp);
getResponse().getWriter().println(result.toString());
}
}
}