/******************************************************************************* * 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; import gov.nasa.worldwind.avlist.AVKey; import gov.nasa.worldwind.avlist.AVList; import gov.nasa.worldwind.avlist.AVListImpl; import gov.nasa.worldwind.layers.BasicLayerFactory; import gov.nasa.worldwind.layers.Layer; import gov.nasa.worldwind.layers.SkyGradientLayer; import gov.nasa.worldwind.layers.StarsLayer; import gov.nasa.worldwind.layers.mercator.BasicMercatorTiledImageLayer; import gov.nasa.worldwind.ogc.OGCConstants; import gov.nasa.worldwind.util.WWUtil; import gov.nasa.worldwind.util.WWXML; import org.w3c.dom.Element; import au.gov.ga.earthsci.worldwind.common.layers.borehole.BoreholeLayerFactory; import au.gov.ga.earthsci.worldwind.common.layers.crust.CrustLayer; import au.gov.ga.earthsci.worldwind.common.layers.curtain.BasicTiledCurtainLayer; import au.gov.ga.earthsci.worldwind.common.layers.curtain.delegate.DelegatorTiledCurtainLayer; import au.gov.ga.earthsci.worldwind.common.layers.earthquakes.HistoricEarthquakesLayer; import au.gov.ga.earthsci.worldwind.common.layers.geometry.GeometryLayerFactory; import au.gov.ga.earthsci.worldwind.common.layers.kml.KMLLayer; import au.gov.ga.earthsci.worldwind.common.layers.mercator.delegate.DelegatorMercatorTiledImageLayer; import au.gov.ga.earthsci.worldwind.common.layers.model.ModelLayerFactory; import au.gov.ga.earthsci.worldwind.common.layers.point.PointLayerFactory; import au.gov.ga.earthsci.worldwind.common.layers.screenoverlay.ScreenOverlayLayerFactory; import au.gov.ga.earthsci.worldwind.common.layers.shapefile.surfaceshape.ShapefileLayerFactory; import au.gov.ga.earthsci.worldwind.common.layers.sphere.SphereLayerFactory; import au.gov.ga.earthsci.worldwind.common.layers.tiled.image.delegate.DelegatorTiledImageLayer; import au.gov.ga.earthsci.worldwind.common.layers.transform.TransformSkyGradientLayer; import au.gov.ga.earthsci.worldwind.common.layers.transform.TransformStarsLayer; import au.gov.ga.earthsci.worldwind.common.layers.volume.VolumeLayerFactory; import au.gov.ga.earthsci.worldwind.common.util.XMLUtil; /** * Extension to World Wind's {@link BasicLayerFactory} which allows creation of * extra layer types. * * @author Michael de Hoog (michael.dehoog@ga.gov.au) */ public class LayerFactory extends BasicLayerFactory { @Override protected Layer createFromLayerDocument(Element domElement, AVList params) { //overridden to allow extra layer types String layerType = WWXML.getText(domElement, "@layerType"); if ("SurfaceShapeShapefileLayer".equals(layerType)) { return ShapefileLayerFactory.createLayer(domElement, params); } if ("PointLayer".equals(layerType)) { return PointLayerFactory.createPointLayer(domElement, params); } if ("KMLLayer".equals(layerType)) { return new KMLLayer(domElement, params); } if ("CurtainImageLayer".equals(layerType)) { return createTiledCurtainLayer(domElement, params); } if ("MercatorImageLayer".equals(layerType)) { return createTiledMercatorLayer(domElement, params); } if ("HistoricEarthquakesLayer".equals(layerType)) { return new HistoricEarthquakesLayer(domElement, params); } if ("CrustLayer".equals(layerType)) { return new CrustLayer(domElement, params); } if ("GeometryLayer".equalsIgnoreCase(layerType)) { return GeometryLayerFactory.createGeometryLayer(domElement, params); } if ("BoreholeLayer".equalsIgnoreCase(layerType)) { return BoreholeLayerFactory.createBoreholeLayer(domElement, params); } if ("ModelLayer".equalsIgnoreCase(layerType)) { return ModelLayerFactory.createModelLayer(domElement, params); } if ("VolumeLayer".equalsIgnoreCase(layerType)) { return VolumeLayerFactory.createVolumeLayer(domElement, params); } if ("SphereLayer".equalsIgnoreCase(layerType)) { return SphereLayerFactory.createSphereLayer(domElement, params); } if ("ScreenOverlayLayer".equals(layerType)) { return ScreenOverlayLayerFactory.createScreenOverlayLayer(domElement, params); } String className = WWXML.getText(domElement, "@className"); if (className != null && className.length() > 0) { try { Class<?> c = Class.forName(className); if (c.equals(StarsLayer.class)) { className = TransformStarsLayer.class.getName(); } else if (c.equals(SkyGradientLayer.class)) { className = TransformSkyGradientLayer.class.getName(); } } catch (ClassNotFoundException e) { if (className.startsWith("au.gov.ga.worldwind")) { className = className.replace("au.gov.ga.worldwind", "au.gov.ga.earthsci.worldwind"); } } domElement.setAttribute("className", className); //try instantiate from this plugin, in case WorldWind plugin cannot find the class: try { Class<?> c = Class.forName(className.trim()); Layer layer = (Layer) c.newInstance(); String actuate = WWXML.getText(domElement, "@actuate"); layer.setEnabled(WWUtil.isEmpty(actuate) || actuate.equals("onLoad")); WWXML.invokePropertySetters(layer, domElement); return layer; } catch (Exception e) { } } return super.createFromLayerDocument(domElement, params); } protected Layer createTiledCurtainLayer(Element domElement, AVList params) { if (params == null) { params = new AVListImpl(); } Layer layer; String serviceName = XMLUtil.getText(domElement, "Service/@serviceName"); if ("DelegatorTileService".equals(serviceName)) { layer = new DelegatorTiledCurtainLayer(domElement, params); } else { layer = new BasicTiledCurtainLayer(domElement, params); } params = TimedExpirationHandler.getExpirationParams(domElement, params); TimedExpirationHandler.registerLayer(layer, params); return layer; } protected Layer createTiledMercatorLayer(Element domElement, AVList params) { if (params == null) { params = new AVListImpl(); } Layer layer; String serviceName = XMLUtil.getText(domElement, "Service/@serviceName"); if ("DelegatorTileService".equals(serviceName)) { layer = new DelegatorMercatorTiledImageLayer(domElement, params); } else { layer = new BasicMercatorTiledImageLayer(params); } params = TimedExpirationHandler.getExpirationParams(domElement, params); TimedExpirationHandler.registerLayer(layer, params); return layer; } @Override protected Layer createTiledImageLayer(Element domElement, AVList params) { //overridden to allow extra service names for the TiledImageLayer type if (params == null) { params = new AVListImpl(); } Layer layer; String serviceName = XMLUtil.getText(domElement, "Service/@serviceName"); if ("DelegatorTileService".equals(serviceName) || OGCConstants.WMS_SERVICE_NAME.equals(serviceName)) { layer = new DelegatorTiledImageLayer(domElement, params); } else { layer = super.createTiledImageLayer(domElement, params); if (params.getValue(AVKey.SECTOR) != null) { layer.setValue(AVKey.SECTOR, params.getValue(AVKey.SECTOR)); } } params = TimedExpirationHandler.getExpirationParams(domElement, params); TimedExpirationHandler.registerLayer(layer, params); return layer; } }