/*##################################################################### * * CLAVIN (Cartographic Location And Vicinity INdexer) * --------------------------------------------------- * * Copyright (C) 2012-2013 Berico Technologies * http://clavin.bericotechnologies.com * * ==================================================================== * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. * * ==================================================================== * * SearchLevel.java * *###################################################################*/ package com.bericotech.clavin.resolver.multipart; import com.bericotech.clavin.gazetteer.FeatureClass; import com.bericotech.clavin.gazetteer.FeatureCode; import com.bericotech.clavin.gazetteer.GeoName; import com.bericotech.clavin.gazetteer.query.QueryBuilder; /** * A roll-up of feature classes and codes that assists in * searching for locations that fall into a particular category. */ public enum SearchLevel { COUNTRY, ADMIN1, ADMIN2, ADMIN3, ADMIN4, ADMINX, CITY; public static SearchLevel forGeoName(final GeoName name) { SearchLevel level = null; if (name != null) { if (name.isTopLevelAdminDivision()) { level = COUNTRY; } else if (name.getFeatureClass() == FeatureClass.A) { switch (name.getFeatureCode()) { case ADM1: case ADM1H: case TERR: case PRSH: level = ADMIN1; break; case ADM2: case ADM2H: level = ADMIN2; break; case ADM3: case ADM3H: level = ADMIN3; break; case ADM4: case ADM4H: level = ADMIN4; break; case ADM5: case ADMD: case ADMDH: level = ADMINX; break; } } else if (name.getFeatureClass() == FeatureClass.P) { level = CITY; } } return level; } public QueryBuilder apply(final QueryBuilder builder) { builder.clearFeatureCodes(); switch (this) { case COUNTRY: builder.addCountryCodes(); break; case ADMIN1: builder.addFeatureCodes(FeatureCode.ADM1, FeatureCode.ADM1H, FeatureCode.TERR, FeatureCode.PRSH); break; case ADMIN2: builder.addFeatureCodes(FeatureCode.ADM2, FeatureCode.ADM2H); break; case ADMIN3: builder.addFeatureCodes(FeatureCode.ADM3, FeatureCode.ADM3H); break; case ADMIN4: builder.addFeatureCodes(FeatureCode.ADM4, FeatureCode.ADM4H); break; case ADMINX: builder.addFeatureCodes(FeatureCode.ADM5, FeatureCode.ADMD, FeatureCode.ADMDH); break; case CITY: builder.addCityCodes(); break; } return builder; } public SearchLevel narrow() { switch (this) { case COUNTRY: return ADMIN1; case ADMIN1: return ADMIN2; case ADMIN2: return ADMIN3; case ADMIN3: return ADMIN4; case ADMIN4: return ADMINX; case ADMINX: return CITY; default: return null; } } public boolean canNarrow() { return narrow() != null; } public SearchLevel broaden() { switch (this) { case ADMIN1: return COUNTRY; case ADMIN2: return ADMIN1; case ADMIN3: return ADMIN2; case ADMIN4: return ADMIN3; case ADMINX: return ADMIN4; case CITY: return ADMINX; default: return null; } } public String getCode(final GeoName geoName) { switch (this) { case COUNTRY: return geoName.getPrimaryCountryCode().name(); case ADMIN1: return geoName.getAdmin1Code(); case ADMIN2: return geoName.getAdmin2Code(); case ADMIN3: return geoName.getAdmin3Code(); case ADMIN4: return geoName.getAdmin4Code(); default: return null; } } public boolean isAdmin() { switch (this) { case ADMIN1: case ADMIN2: case ADMIN3: case ADMIN4: case ADMINX: return true; default: return false; } } }