/******************************************************************************* * Copyright 2012 Geoscience Australia * * 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. ******************************************************************************/ package au.gov.ga.earthsci.worldwind.common.layers.geometry.types; import gov.nasa.worldwind.avlist.AVKey; import gov.nasa.worldwind.avlist.AVList; import gov.nasa.worldwind.avlist.AVListImpl; import gov.nasa.worldwind.layers.AbstractLayer; import gov.nasa.worldwind.render.DrawContext; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.net.MalformedURLException; import java.net.URL; import java.util.Collection; import java.util.List; import java.util.Map.Entry; import java.util.Set; import au.gov.ga.earthsci.worldwind.common.layers.Bounds; import au.gov.ga.earthsci.worldwind.common.layers.geometry.GeometryLayer; import au.gov.ga.earthsci.worldwind.common.layers.geometry.ShapeProvider; import au.gov.ga.earthsci.worldwind.common.layers.styled.Attribute; import au.gov.ga.earthsci.worldwind.common.layers.styled.BasicStyleProvider; import au.gov.ga.earthsci.worldwind.common.layers.styled.Style; import au.gov.ga.earthsci.worldwind.common.layers.styled.StyleProvider; import au.gov.ga.earthsci.worldwind.common.util.AVKeyMore; import au.gov.ga.earthsci.worldwind.common.util.Validate; /** * A base class for {@link GeometryLayer} implementations. * <p/> * Provides convenience methods to aid in implementation. * * @author James Navin (james.navin@ga.gov.au) */ public abstract class GeometryLayerBase extends AbstractLayer implements GeometryLayer { private AVList avList = new AVListImpl(); private final URL shapeSourceUrl; private final String dataCacheName; private final ShapeProvider shapeProvider; private final StyleProvider styleProvider; @SuppressWarnings("unchecked") public GeometryLayerBase(AVList params) { try { URL shapeSourceContext = (URL) params.getValue(AVKeyMore.CONTEXT_URL); String url = params.getStringValue(AVKey.URL); shapeSourceUrl = new URL(shapeSourceContext, url); } catch (MalformedURLException e) { throw new IllegalArgumentException("Unable to parse shape source URL", e); } dataCacheName = params.getStringValue(AVKey.DATA_CACHE_NAME); shapeProvider = (ShapeProvider) params.getValue(AVKeyMore.DATA_LAYER_PROVIDER); styleProvider = new BasicStyleProvider(); styleProvider.setStyles((List<Style>) params.getValue(AVKeyMore.DATA_LAYER_STYLES)); styleProvider.setAttributes((List<Attribute>) params.getValue(AVKeyMore.DATA_LAYER_ATTRIBUTES)); Validate.notBlank(dataCacheName, "Shape data cache name not set"); Validate.notNull(shapeProvider, "Shape data provider is null"); Validate.notNull(styleProvider.getStyles(), "Shape style list is null"); Validate.notNull(styleProvider.getAttributes(), "Shape attribute list is null"); setValues(params); } @Override public Object setValue(String key, Object value) { return avList.setValue(key, value); } @Override public AVList setValues(AVList avList) { return this.avList.setValues(avList); } @Override public Object getValue(String key) { return avList.getValue(key); } @Override public Collection<Object> getValues() { return avList.getValues(); } @Override public String getStringValue(String key) { return avList.getStringValue(key); } @Override public Set<Entry<String, Object>> getEntries() { return avList.getEntries(); } @Override public boolean hasKey(String key) { return avList.hasKey(key); } @Override public Object removeKey(String key) { return avList.removeKey(key); } @Override public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { avList.addPropertyChangeListener(propertyName, listener); } @Override public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { avList.removePropertyChangeListener(propertyName, listener); } @Override public void addPropertyChangeListener(PropertyChangeListener listener) { avList.addPropertyChangeListener(listener); } @Override public void removePropertyChangeListener(PropertyChangeListener listener) { avList.removePropertyChangeListener(listener); } @Override public void firePropertyChange(String propertyName, Object oldValue, Object newValue) { avList.firePropertyChange(propertyName, oldValue, newValue); } @Override public void firePropertyChange(PropertyChangeEvent propertyChangeEvent) { avList.firePropertyChange(propertyChangeEvent); } @Override public AVList copy() { return avList.copy(); } @Override public AVList clearList() { return avList.clearList(); } @Override public Bounds getBounds() { return shapeProvider.getBounds(); } @Override public boolean isFollowTerrain() { return shapeProvider.isFollowTerrain(); } @Override public void loadComplete() { // Subclasses may override to perform required post-load processing } @Override public URL getUrl() throws MalformedURLException { return shapeSourceUrl; } @Override public String getDataCacheName() { return dataCacheName; } @Override protected final void doRender(DrawContext dc) { if (isEnabled()) { getShapeProvider().requestData(this); } renderGeometry(dc); } protected ShapeProvider getShapeProvider() { return shapeProvider; } protected StyleProvider getStyleProvider() { return styleProvider; } @Override public boolean isLoading() { return shapeProvider.isLoading(); } @Override public void addLoadingListener(LoadingListener listener) { shapeProvider.addLoadingListener(listener); } @Override public void removeLoadingListener(LoadingListener listener) { shapeProvider.removeLoadingListener(listener); } }