package es.axios.udig.ui.testsupport; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import net.refractions.udig.catalog.CatalogPlugin; import net.refractions.udig.catalog.ICatalog; import net.refractions.udig.catalog.IGeoResource; import net.refractions.udig.catalog.IResolve; import net.refractions.udig.catalog.IService; import net.refractions.udig.catalog.memory.MemoryServiceExtensionImpl; import net.refractions.udig.project.ILayer; import net.refractions.udig.project.IMap; import net.refractions.udig.project.internal.commands.CreateMapCommand; import net.refractions.udig.project.ui.ApplicationGIS; import org.eclipse.core.runtime.NullProgressMonitor; import org.geotools.data.DataUtilities; import org.geotools.data.FeatureStore; import org.geotools.feature.FeatureCollection; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; /** * Builds a testing environment with test georesources and data * <p> * Sample usage: * * <pre> * <code> * public class FooTest extends TestCase { * private TestWorkBenchBuilder testData; * * public void setUp() { * testData = new TestWorkbenchBuilder(); * testData.setUp(); * } * * public void tearDown() { * testData.tearDown(); * } * * public void testXXX(){ * IGeoResource points = testData.getPoints(); * ... do something * } * } * </code> * </pre> * * </p> * * @author gabriel * @since 1.1.0 */ public class TestWorkBenchBuilder { private IMap map; private IGeoResource points; private IGeoResource lines; private IGeoResource polygons; private ILayer pointsLayer; private ILayer linesLayer; private ILayer polygonsLayer; /** * Creates a Map and populates it with three sample georesources from the scratch resource * provider * * @throws Exception */ public void setUp() throws Exception { removeScratchResource(); List<IGeoResource> resources = new ArrayList<IGeoResource>(); List<SimpleFeature> features; features = TestData.createPointFeatures(); points = createGeoResource(features); resources.add(points); features = TestData.createLineFeatures(); lines = createGeoResource(features); resources.add(lines); features = TestData.createPolygontFeatures(); polygons = createGeoResource(features); resources.add(polygons); CreateMapCommand command = new CreateMapCommand(null, resources, null); ApplicationGIS.getActiveProject().sendSync(command); command.run(new NullProgressMonitor()); map = command.getCreatedMap(); final boolean wait = true; ApplicationGIS.openMap(map, wait); for( ILayer layer : map.getMapLayers() ) { String name = layer.getName(); if (TestData.FTYPE_LINES.equals(name)) { linesLayer = layer; } else if (TestData.FTYPE_POINTS.equals(name)) { pointsLayer = layer; } else if (TestData.FTYPE_POLYGONS.equals(name)) { polygonsLayer = layer; } } } /** * TODO: remove map or find a way to not get a question message befor closing * * @throws Exception */ public void tearDown() throws Exception { removeScratchResource(); } public IGeoResource createGeoResource( List<SimpleFeature> features ) throws IOException { final ICatalog catalog = CatalogPlugin.getDefault().getLocalCatalog(); SimpleFeatureType SimpleFeatureType = features.get(0).getFeatureType(); IGeoResource resource; resource = catalog.createTemporaryResource(SimpleFeatureType); FeatureStore<SimpleFeatureType, SimpleFeature> store = resource.resolve(FeatureStore.class, new NullProgressMonitor()); SimpleFeature[] toArray = features.toArray(new SimpleFeature[]{}); FeatureCollection<SimpleFeatureType, SimpleFeature> collection = DataUtilities.collection(toArray); store.addFeatures(collection); return resource; } public void removeScratchResource() throws IOException { final ICatalog catalog = CatalogPlugin.getDefault().getLocalCatalog(); URL url = MemoryServiceExtensionImpl.URL; List<IResolve> services = catalog.find(url, null); for( IResolve res : services ) { if (res.canResolve(IService.class)) { IService service = res.resolve(IService.class, null); catalog.remove(service); } } } public IGeoResource getLines() { return lines; } public IMap getMap() { return map; } public IGeoResource getPoints() { return points; } public IGeoResource getPolygons() { return polygons; } public ILayer getLinesLayer() { return linesLayer; } public ILayer getPointsLayer() { return pointsLayer; } public ILayer getPolygonsLayer() { return polygonsLayer; } public ILayer getLayerWithPolygonGeometry() { return null; } }