package org.geoserver.python;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertEquals;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.HashMap;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.platform.GeoServerExtensions;
import org.geotools.data.DataAccess;
import org.geotools.data.DataStore;
import org.geotools.data.FeatureSource;
import org.geotools.data.FeatureWriter;
import org.geotools.data.Transaction;
import org.geotools.data.h2.H2DataStoreFactory;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.h2.tools.DeleteDbFiles;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.springframework.context.ApplicationContext;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.io.WKTReader;
public class PythonCatalogDataTest extends PythonTestSupport {
@Before
public void setUp() throws Exception {
setUpMock();
}
@After
public void tearDown() throws Exception {
tearDownMock();
}
void setUpMock() throws Exception {
DeleteDbFiles.execute("target", "acme", true);
H2DataStoreFactory fac = new H2DataStoreFactory();
HashMap params = new HashMap();
params.put(H2DataStoreFactory.DATABASE.key, "target/acme");
params.put(H2DataStoreFactory.DBTYPE.key, "h2");
DataStore ds = fac.createDataStore(params);
SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
tb.setName("widgets");
tb.add("type", String.class);
tb.add("price", Double.class);
tb.add("geom", Point.class);
SimpleFeatureType ft = tb.buildFeatureType();
ds.createSchema(ft);
FeatureWriter fw = ds.getFeatureWriter("widgets", Transaction.AUTO_COMMIT);
WKTReader wkt = new WKTReader();
fw.hasNext();
SimpleFeature next = (SimpleFeature) fw.next();
next.setAttribute("type", "anvil");
next.setAttribute("price", 10.99);
next.setAttribute("geom", wkt.read("POINT(12.5 13.7)"));
fw.write();
fw.hasNext();
next = (SimpleFeature) fw.next();
next.setAttribute("type", "dynamite");
next.setAttribute("price", 99.99);
next.setAttribute("geom", wkt.read("POINT(11.8 16.7)"));
fw.write();
fw.close();
Catalog cat = createNiceMock(Catalog.class);
//workspaces
WorkspaceInfo ws = createNiceMock(WorkspaceInfo.class);
expect(ws.getName()).andReturn("acme").anyTimes();
replay(ws);
expect(cat.getWorkspaces()).andReturn(Arrays.asList(ws)).anyTimes();
expect(cat.getDefaultWorkspace()).andReturn(ws).anyTimes();
expect(cat.getWorkspaceByName("acme")).andReturn(ws).anyTimes();
//data stores
DataStoreInfo acme = createNiceMock(DataStoreInfo.class);
expect(acme.getName()).andReturn("acme").anyTimes();
expect(acme.getWorkspace()).andReturn(ws).anyTimes();
expect(acme.getDataStore(null)).andReturn((DataAccess) ds).anyTimes();
replay(acme);
expect(cat.getDataStoresByWorkspace(ws)).andReturn(Arrays.asList(acme)).anyTimes();
expect(cat.getDataStoresByWorkspace("acme")).andReturn(Arrays.asList(acme)).anyTimes();
expect(cat.getDataStoreByName("acme", "acme")).andReturn(acme).anyTimes();
expect(cat.getDataStoreByName(ws, "acme")).andReturn(acme).anyTimes();
//feature types
FeatureTypeInfo widgets = createNiceMock(FeatureTypeInfo.class);
expect(widgets.getName()).andReturn("widgets");
expect(widgets.getFeatureSource(null, null)).andReturn((FeatureSource) ds.getFeatureSource("widgets"));
expect(widgets.getFeatureType()).andReturn(ds.getSchema("widgets"));
expect(widgets.getStore()).andReturn(acme);
replay(widgets);
expect(cat.getFeatureTypeByDataStore(acme, "widgets")).andReturn(widgets).anyTimes();
expect(cat.getFeatureTypeByStore(acme, "widgets")).andReturn(widgets).anyTimes();
//app context
ApplicationContext app = createNiceMock(ApplicationContext.class);
expect(app.getBean("catalog")).andReturn(cat).anyTimes();
replay(cat);
replay(app);
new GeoServerExtensions().setApplicationContext(app);
}
void tearDownMock() throws Exception {
new GeoServerExtensions().setApplicationContext(null);
DeleteDbFiles.execute("target", "acme", true);
}
@Test
public void testLayerData() {
pi.exec("from geoserver.catalog import Workspace");
pi.exec("acme = Workspace('acme')['acme']");
clear();
pi.exec("widgets = acme['widgets']");
pi.exec("print widgets.data.count()");
_assert("2");
clear();
pi.exec("print widgets.data.bounds()");
_assert("(11.8, 13.7, 12.5, 16.7)");
clear();
pi.exec("for f in widgets.data.features(): print f.geom");
_assert("POINT (12.5 13.7)\nPOINT (11.8 16.7)");
}
void print() {
System.out.println(new String(out.toByteArray()));
}
void clear() {
out = new ByteArrayOutputStream();
pi.setOut(out);
}
void _assert(String result) {
assertEquals(result, new String(out.toByteArray()).trim());
}
}