package com.bericotech.clavin.gazetteer; import com.bericotech.clavin.ClavinException; import com.bericotech.clavin.gazetteer.query.AncestryMode; import com.bericotech.clavin.gazetteer.query.Gazetteer; import java.util.Date; import java.util.List; import java.util.TimeZone; /** * This GeoName can be configured to lazily load its ancestry when its parent * is first requested or to load its ancestry only when explicitly requested * through a Gazetteer. */ public class LazyAncestryGeoName implements GeoName { /** The wrapped GeoName. */ private final GeoName geoName; /** The GeoName ID of this GeoName's parent. */ private final Integer parentId; /** The Gazetteer used to resolve the ancestry of the target GeoName. */ private final Gazetteer gazetteer; /** * Creates a LazyAncestryGeoName whose ancestry must be manually loaded. * @param geoName the GeoName to wrap * @param parentId the ID of the parent of this GeoName */ public LazyAncestryGeoName(final GeoName geoName, final Integer parentId) { this(geoName, parentId, null); } /** * Creates a LazyAncestryGeoName that lazily loads the ancestry of the wrapped * GeoName when its parent is first requested. If no Gazetteer is provided, * ancestry must be manually loaded. * @param geoName the GeoName to wrap * @param parentId the ID of the parent of this GeoName * @param gazetteer the Gazetteer used for ancestry resolution; if null, ancestry must be loaded manually */ public LazyAncestryGeoName(final GeoName geoName, final Integer parentId, final Gazetteer gazetteer) { this.geoName = geoName; this.parentId = parentId; this.gazetteer = gazetteer; } @Override public Integer getParentId() { return parentId; } @Override public GeoName getParent() { if (gazetteer != null && parentId != null && !geoName.isAncestryResolved()) { try { geoName.setParent(gazetteer.getGeoName(parentId, AncestryMode.ON_CREATE)); } catch (ClavinException ce) { throw new RuntimeException(String.format("Error lazy-loading ancestry for %s", geoName), ce); } } return geoName.getParent(); } @Override public boolean setParent(GeoName prnt) { return geoName.setParent(prnt); } @Override public String getPrimaryCountryName() { return geoName.getPrimaryCountryName(); } @Override public String getParentAncestryKey() { return geoName.getParentAncestryKey(); } @Override public String getAncestryKey() { return geoName.getAncestryKey(); } @Override public boolean isTopLevelAdminDivision() { return geoName.isTopLevelAdminDivision(); } @Override public boolean isTopLevelTerritory() { return geoName.isTopLevelTerritory(); } @Override public boolean isDescendantOf(GeoName geoname) { return geoName.isDescendantOf(geoname); } @Override public boolean isAncestorOf(GeoName geoname) { return geoName.isAncestorOf(geoname); } @Override public boolean isAncestryResolved() { return geoName.isAncestryResolved(); } @Override public int getGeonameID() { return geoName.getGeonameID(); } @Override public String getName() { return geoName.getName(); } @Override public String getAsciiName() { return geoName.getAsciiName(); } @Override public List<String> getAlternateNames() { return geoName.getAlternateNames(); } @Override public String getPreferredName() { return geoName.getPreferredName(); } @Override public double getLatitude() { return geoName.getLatitude(); } @Override public double getLongitude() { return geoName.getLongitude(); } @Override public FeatureClass getFeatureClass() { return geoName.getFeatureClass(); } @Override public FeatureCode getFeatureCode() { return geoName.getFeatureCode(); } @Override public CountryCode getPrimaryCountryCode() { return geoName.getPrimaryCountryCode(); } @Override public List<CountryCode> getAlternateCountryCodes() { return geoName.getAlternateCountryCodes(); } @Override public String getAdmin1Code() { return geoName.getAdmin1Code(); } @Override public String getAdmin2Code() { return geoName.getAdmin2Code(); } @Override public String getAdmin3Code() { return geoName.getAdmin3Code(); } @Override public String getAdmin4Code() { return geoName.getAdmin4Code(); } @Override public long getPopulation() { return geoName.getPopulation(); } @Override public int getElevation() { return geoName.getElevation(); } @Override public int getDigitalElevationModel() { return geoName.getDigitalElevationModel(); } @Override public TimeZone getTimezone() { return geoName.getTimezone(); } @Override public Date getModificationDate() { return geoName.getModificationDate(); } @Override public String getGazetteerRecord() { return geoName.getGazetteerRecord(); } @Override public String getGazetteerRecordWithAncestry() { return geoName.getGazetteerRecordWithAncestry(); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; LazyAncestryGeoName that = (LazyAncestryGeoName) o; if (!geoName.equals(that.geoName)) return false; return true; } @Override public int hashCode() { return geoName.hashCode(); } }