/* * 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 com.gallatinsystems.gis.map.dao; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.jdo.PersistenceManager; import com.gallatinsystems.common.Constants; import com.gallatinsystems.framework.dao.BaseDAO; import com.gallatinsystems.framework.servlet.PersistenceFilter; import com.gallatinsystems.gis.geography.dao.CountryDao; import com.gallatinsystems.gis.geography.domain.Country; import com.gallatinsystems.gis.map.domain.OGRFeature; import com.gallatinsystems.gis.map.domain.OGRFeature.FeatureType; public class OGRFeatureDao extends BaseDAO<OGRFeature> { public OGRFeatureDao() { super(OGRFeature.class); } public List<OGRFeature> listBySubLevelCountryName(String countryCode, Integer level, String subLevelValue, String cursorString, String parentSubPath) { PersistenceManager pm = PersistenceFilter.getManager(); javax.jdo.Query query = pm.newQuery(OGRFeature.class); StringBuilder filterString = new StringBuilder(); StringBuilder paramString = new StringBuilder(); Map<String, Object> paramMap = null; paramMap = new HashMap<String, Object>(); appendNonNullParam("countryCode", filterString, paramString, "String", countryCode, paramMap, EQ_OP); if (level > 0) appendNonNullParam("sub" + level, filterString, paramString, "String", subLevelValue, paramMap, EQ_OP); if (parentSubPath != null) { String[] subParts = parentSubPath.split("/"); for (int i = 1; i < subParts.length; i++) { // first param is country so ignore appendNonNullParam("sub" + i, filterString, paramString, "String", subParts[i], paramMap, EQ_OP); } } query.setFilter(filterString.toString()); query.declareParameters(paramString.toString()); prepareCursor(cursorString, query); @SuppressWarnings("unchecked") List<OGRFeature> resultsGTE = (List<OGRFeature>) query .executeWithMap(paramMap); return resultsGTE; } public List<OGRFeature> listByExtentAndType(Double x1, Double y1, OGRFeature.FeatureType featureType, String orderByCol, String orderByDirection, String cursorString) { PersistenceManager pm = PersistenceFilter.getManager(); javax.jdo.Query query = pm.newQuery(OGRFeature.class); StringBuilder filterString = new StringBuilder(); StringBuilder paramString = new StringBuilder(); Map<String, Object> paramMap = null; paramMap = new HashMap<String, Object>(); appendNonNullParam("x1", filterString, paramString, "Double", x1, paramMap, LTE_OP); appendNonNullParam("featureType", filterString, paramString, "String", featureType, paramMap, EQ_OP); query.setFilter(filterString.toString()); query.declareParameters(paramString.toString()); if (orderByCol != null && orderByDirection != null) query.setOrdering(orderByCol + " " + orderByDirection); prepareCursor(cursorString, query); @SuppressWarnings("unchecked") List<OGRFeature> resultsGTE = (List<OGRFeature>) query .executeWithMap(paramMap); List<OGRFeature> results = new ArrayList<OGRFeature>(); for (OGRFeature item : resultsGTE) { Double[] boundingBox = item.getBoundingBox(); if (boundingBox[0] < x1 && boundingBox[1] > y1 && boundingBox[2] > x1 && boundingBox[3] < y1) { results.add(item); } } return results; } public List<OGRFeature> listByExtentTypeCountry(Double x1, Double y1, String countryCode, String orderByCol, String orderByDirection, String cursorString) { PersistenceManager pm = PersistenceFilter.getManager(); javax.jdo.Query query = pm.newQuery(OGRFeature.class); StringBuilder filterString = new StringBuilder(); StringBuilder paramString = new StringBuilder(); Map<String, Object> paramMap = null; paramMap = new HashMap<String, Object>(); appendNonNullParam("x1", filterString, paramString, "Double", x1, paramMap, LTE_OP); appendNonNullParam("featureType", filterString, paramString, "String", FeatureType.SUB_COUNTRY_OTHER, paramMap, EQ_OP); appendNonNullParam("countryCode", filterString, paramString, "String", countryCode, paramMap, EQ_OP); query.setFilter(filterString.toString()); query.declareParameters(paramString.toString()); if (orderByCol != null && orderByDirection != null) query.setOrdering(orderByCol + " " + orderByDirection); prepareCursor(cursorString, query); @SuppressWarnings("unchecked") List<OGRFeature> resultsGTE = (List<OGRFeature>) query .executeWithMap(paramMap); List<OGRFeature> results = new ArrayList<OGRFeature>(); for (OGRFeature item : resultsGTE) { Double[] boundingBox = item.getBoundingBox(); if (boundingBox[0] < x1 && boundingBox[1] > y1 && boundingBox[2] > x1 && boundingBox[3] < y1) { results.add(item); } } return results; } @SuppressWarnings("unchecked") public List<OGRFeature> listBySubLevelCountry(String countryCode, Integer subLevel, String cursorString) { PersistenceManager pm = PersistenceFilter.getManager(); javax.jdo.Query query = pm.newQuery(OGRFeature.class); StringBuilder filterString = new StringBuilder(); StringBuilder paramString = new StringBuilder(); Map<String, Object> paramMap = null; paramMap = new HashMap<String, Object>(); appendNonNullParam("countryCode", filterString, paramString, "String", countryCode, paramMap, EQ_OP); appendNonNullParam("featureType", filterString, paramString, "String", FeatureType.SUB_COUNTRY_OTHER, paramMap, EQ_OP); appendNonNullParam("sub" + (subLevel), filterString, paramString, "String", "null", paramMap, NOT_EQ_OP); appendNonNullParam("sub" + (subLevel + 1), filterString, paramString, "String", "null", paramMap, EQ_OP); query.setFilter(filterString.toString()); query.declareParameters(paramString.toString()); prepareCursor(cursorString, query); List<OGRFeature> resultsGTE = (List<OGRFeature>) query .executeWithMap(paramMap); return resultsGTE; } public OGRFeature findByCountryAndType(String countryCode, FeatureType featureType) { List<OGRFeature> results = listByCountryAndType(countryCode, featureType, null); if (results != null && results.size() > 0) return results.get(0); else return null; } /** * included for backward compatibility. Use version that takes cursor instead. * * @param countryCode * @param featureType * @return */ @Deprecated public List<OGRFeature> listByCountryAndType(String countryCode, FeatureType featureType) { return listByCountryAndType(countryCode, featureType, Constants.ALL_RESULTS); } @SuppressWarnings("unchecked") public List<OGRFeature> listByCountryAndType(String countryCode, FeatureType featureType, String cursorString) { PersistenceManager pm = PersistenceFilter.getManager(); javax.jdo.Query query = pm.newQuery(OGRFeature.class); StringBuilder filterString = new StringBuilder(); StringBuilder paramString = new StringBuilder(); Map<String, Object> paramMap = null; paramMap = new HashMap<String, Object>(); appendNonNullParam("featureType", filterString, paramString, "String", featureType, paramMap, EQ_OP); appendNonNullParam("countryCode", filterString, paramString, "String", countryCode, paramMap, EQ_OP); query.setFilter(filterString.toString()); query.declareParameters(paramString.toString()); prepareCursor(cursorString, query); List<OGRFeature> results = (List<OGRFeature>) query .executeWithMap(paramMap); if (results != null && results.size() > 0) { return results; } else { return null; } } public OGRFeature findByCountryTypeAndSub(String countryCode, String name, FeatureType featureType, ArrayList<String> subArray) { PersistenceManager pm = PersistenceFilter.getManager(); javax.jdo.Query query = pm.newQuery(OGRFeature.class); StringBuilder filterString = new StringBuilder(); StringBuilder paramString = new StringBuilder(); Map<String, Object> paramMap = null; paramMap = new HashMap<String, Object>(); appendNonNullParam("featureType", filterString, paramString, "String", featureType, paramMap, EQ_OP); appendNonNullParam("name", filterString, paramString, "String", name, paramMap, EQ_OP); appendNonNullParam("countryCode", filterString, paramString, "String", countryCode, paramMap, EQ_OP); for (int i = 1; i < subArray.size() + 1; i++) { appendNonNullParam("sub" + i, filterString, paramString, "String", subArray.get(i - 1), paramMap, EQ_OP); } query.setFilter(filterString.toString()); query.declareParameters(paramString.toString()); @SuppressWarnings("unchecked") List<OGRFeature> results = (List<OGRFeature>) query .executeWithMap(paramMap); if (results != null && results.size() > 0) return results.get(0); else return null; } public OGRFeature save(OGRFeature item) { // If type == country then must update can't have 2 shapes for 1 country if (item.getFeatureType().equals(FeatureType.COUNTRY)) { OGRFeature existingItem = findByCountryAndType( item.getCountryCode(), FeatureType.COUNTRY); if (existingItem != null) { existingItem.setGeometry(item.getGeometry()); existingItem.setBoundingBox(item.getBoundingBox()); super.save(existingItem); item = existingItem; } else { super.save(item); } // Save to country table as well so that we have populated it CountryDao countryDao = new CountryDao(); Country country = countryDao.findByCode(item.getCountryCode()); if (country == null) { country = new Country(); country.setName(item.getName()); country.setDisplayName(item.getName()); country.setCentroidLat(item.getCentroidLat()); country.setCentroidLon(item.getCentroidLon()); country.setIsoAlpha2Code(item.getCountryCode()); countryDao.save(country); } else if (country.getName() == null || country.getDisplayName() == null) { country.setName(item.getName()); country.setDisplayName(item.getName()); countryDao.save(country); } return item; } else { ArrayList<String> subList = new ArrayList<String>(); if (item.getSub1() != null) { subList.add(item.getSub1()); } if (item.getSub2() != null) { subList.add(item.getSub2()); } if (item.getSub3() != null) { subList.add(item.getSub3()); } if (item.getSub4() != null) { subList.add(item.getSub4()); } if (item.getSub5() != null) { subList.add(item.getSub5()); } if (item.getSub6() != null) { subList.add(item.getSub6()); } OGRFeature existingItem = findByCountryTypeAndSub( item.getCountryCode(), item.getName(), FeatureType.SUB_COUNTRY_OTHER, subList); if (existingItem != null) { boolean isSame = true; if (item.getSub1() != null && existingItem.getSub1() != null && !existingItem.getSub1().equals(item.getSub1())) { isSame = false; } if ((item.getSub2() != null && existingItem.getSub2() != null && !existingItem .getSub2().equals(item.getSub2())) || (item.getSub2() == null && existingItem.getSub2() != null)) { isSame = false; } if (item.getSub3() != null && existingItem.getSub3() != null && !existingItem.getSub3().equals(item.getSub3())) { isSame = false; } if (item.getSub4() != null && existingItem.getSub4() != null && !existingItem.getSub4().equals(item.getSub4())) { isSame = false; } if (item.getSub5() != null && existingItem.getSub5() != null && !existingItem.getSub5().equals(item.getSub5())) { isSame = false; } if (item.getSub6() != null && existingItem.getSub6() != null && !existingItem.getSub6().equals(item.getSub6())) { isSame = false; } if (isSame) { existingItem.setGeometry(item.getGeometry()); existingItem.setBoundingBox(item.getBoundingBox()); existingItem.setCentroidLat(item.getCentroidLat()); existingItem.setCentroidLon(item.getCentroidLon()); super.save(existingItem); return existingItem; } } super.save(item); return item; } } }