/*******************************************************************************
* Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License 3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
*
******************************************************************************/
package com.opendoorlogistics.core.geometry;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import com.opendoorlogistics.api.geometry.LatLong;
import com.opendoorlogistics.api.geometry.LatLongToScreen;
import com.opendoorlogistics.core.gis.map.OnscreenGeometry;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
public class ODLShapefileLinkGeom extends ODLGeomImpl {
private final ShapefileLink shapefileLink;
private volatile boolean attemptedResolve=false;
private volatile ODLGeomImpl loadedLink;
public ODLShapefileLinkGeom( ShapefileLink shapefileLink) {
this.shapefileLink = shapefileLink;
}
@Override
public Geometry getJTSGeometry() {
if(resolveLink()){
return loadedLink.getJTSGeometry();
}
return null;
}
@Override
public boolean isLoaded() {
return attemptedResolve;
}
@Override
public OnscreenGeometry createOnscreenGeometry(LatLongToScreen converter) {
if(resolveLink()){
return loadedLink.createOnscreenGeometry(converter);
}
return null;
}
private synchronized boolean resolveLink(){
if(attemptedResolve && loadedLink!=null){
// all ok, link resolved
return true;
}
// attempt resolve
if(attemptedResolve==false && shapefileLink!=null){
loadedLink = (ODLGeomImpl)Spatial.loadLink(shapefileLink);
// set attempted resolve last of all; accessed by multiple threads
attemptedResolve = true;
return loadedLink!=null;
}
// bad link
return false;
}
public synchronized String toText(){
return shapefileLink.toString();
}
// @Override
// public void putInCache(Object cacheKey, Object data) {
// if(resolveLink()){
// loadedLink.putInCache(cacheKey, data);;
// }
// }
//
// @Override
// public Object getFromCache(Object cacheKey) {
// if(resolveLink()){
// return loadedLink.getFromCache(cacheKey);
// }
// return null;
// }
@Override
public int getPointsCount() {
if(resolveLink()){
return loadedLink.getPointsCount();
}
return 0;
}
@Override
public long getEstimatedSizeInBytes() {
if(resolveLink()){
return loadedLink.getEstimatedSizeInBytes();
}
return 0;
}
@Override
public Point2D getWorldBitmapCentroid(LatLongToScreen latLongToScreen) {
if(resolveLink()){
return loadedLink.getWorldBitmapCentroid(latLongToScreen);
}
return null;
}
@Override
public LatLong getWGSCentroid() {
if(resolveLink()){
return loadedLink.getWGSCentroid();
}
return null;
}
@Override
public Envelope getWGSBounds() {
if(resolveLink()){
return loadedLink.getWGSBounds();
}
return null;
}
@Override
public Rectangle2D getWorldBitmapBounds(LatLongToScreen latLongToScreen) {
if(resolveLink()){
return loadedLink.getWorldBitmapBounds(latLongToScreen);
}
return null;
}
@Override
public boolean isLineString() {
if(resolveLink()){
return loadedLink.isLineString();
}
return false;
}
@Override
public int getAtomicGeomCount(AtomicGeomType type) {
if(resolveLink()){
return loadedLink.getAtomicGeomCount(type);
}
return 0;
}
}