package org.geoserver.catalog.impl; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.CountDownLatch; import junit.framework.TestCase; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.CatalogException; import org.geoserver.catalog.CatalogFactory; import org.geoserver.catalog.CoverageInfo; import org.geoserver.catalog.CoverageStoreInfo; import org.geoserver.catalog.DataStoreInfo; import org.geoserver.catalog.FeatureTypeInfo; import org.geoserver.catalog.Keyword; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.MetadataMap; import org.geoserver.catalog.NamespaceInfo; import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.StyleInfo; import org.geoserver.catalog.WMSLayerInfo; import org.geoserver.catalog.WMSStoreInfo; import org.geoserver.catalog.WorkspaceInfo; import org.geoserver.catalog.event.CatalogAddEvent; import org.geoserver.catalog.event.CatalogListener; import org.geoserver.catalog.event.CatalogModifyEvent; import org.geoserver.catalog.event.CatalogPostModifyEvent; import org.geoserver.catalog.event.CatalogRemoveEvent; public class CatalogImplTest extends TestCase { protected Catalog catalog; protected WorkspaceInfo ws; protected NamespaceInfo ns; protected DataStoreInfo ds; protected CoverageStoreInfo cs; protected WMSStoreInfo wms; protected FeatureTypeInfo ft; protected CoverageInfo cv; protected WMSLayerInfo wl; protected LayerInfo l; protected StyleInfo s; protected void setUp() throws Exception { catalog = createCatalog(); CatalogFactory factory = catalog.getFactory(); ns = factory.createNamespace(); ns.setPrefix( "nsPrefix" ); ns.setURI( "nsURI" ); ws = factory.createWorkspace(); ws.setName( "wsName"); ds = factory.createDataStore(); ds.setEnabled(true); ds.setName( "dsName"); ds.setDescription("dsDescription"); ds.setWorkspace( ws ); ft = factory.createFeatureType(); ft.setEnabled(true); ft.setName( "ftName" ); ft.setAbstract( "ftAbstract" ); ft.setDescription( "ftDescription" ); ft.setStore( ds ); ft.setNamespace( ns ); cs = factory.createCoverageStore(); cs.setName("csName"); cs.setType("fakeCoverageType"); cs.setURL("file://fake"); cv = factory.createCoverage(); cv.setName("cvName"); cv.setStore(cs); wms = factory.createWebMapServer(); wms.setName("wmsName"); wms.setType("WMS"); wms.setCapabilitiesURL("http://fake.url"); wms.setWorkspace(ws); wl = factory.createWMSLayer(); wl.setEnabled(true); wl.setName("wmsLayer"); wl.setStore(wms); wl.setNamespace(ns); s = factory.createStyle(); s.setName( "styleName" ); s.setFilename( "styleFilename" ); l = factory.createLayer(); l.setEnabled(true); l.setResource( ft ); l.setDefaultStyle( s ); } protected Catalog createCatalog() { return new CatalogImpl(); } protected void addWorkspace() { catalog.add(ws); } protected void addNamespace() { catalog.add(ns); } protected void addDataStore() { addWorkspace(); catalog.add(ds); } protected void addCoverageStore() { addWorkspace(); catalog.add(cs); } protected void addWMSStore() { addWorkspace(); catalog.add(wms); } protected void addFeatureType() { addDataStore(); addNamespace(); catalog.add(ft); } protected void addCoverage() { addCoverageStore(); addNamespace(); catalog.add(cv); } protected void addWMSLayer() { addWMSStore(); addNamespace(); catalog.add(wl); } protected void addStyle() { catalog.add(s); } protected void addLayer() { addFeatureType(); addStyle(); catalog.add(l); } public void testAddNamespace() { assertTrue( catalog.getNamespaces().isEmpty() ); catalog.add( ns ); assertEquals( 1, catalog.getNamespaces().size() ); NamespaceInfo ns2 = catalog.getFactory().createNamespace(); try { catalog.add( ns2 ); fail( "adding without a prefix should throw exception"); } catch( Exception e ) { } ns2.setPrefix( "ns2Prefix"); try { catalog.add( ns2 ); fail( "adding without a uri should throw exception"); } catch( Exception e ) { } ns2.setURI( "bad uri"); try { catalog.add( ns2 ); fail( "adding an invalid uri should throw exception"); } catch( Exception e ) { } ns2.setURI( "ns2URI"); try { catalog.getNamespaces().add( ns2 ); fail( "adding directly should throw an exception" ); } catch( Exception e ) { } catalog.add( ns2 ); } public void testRemoveNamespace() { catalog.add( ns ); assertEquals( 1, catalog.getNamespaces().size() ); try { assertFalse( catalog.getNamespaces().remove( ns ) ); fail( "removing directly should throw an exception" ); } catch( Exception e ) { } catalog.remove( ns ); assertTrue( catalog.getNamespaces().isEmpty() ); } public void testGetNamespaceById() { catalog.add( ns ); NamespaceInfo ns2 = catalog.getNamespace(ns.getId()); assertNotNull(ns2); assertFalse( ns == ns2 ); assertEquals( ns, ns2 ); } public void testGetNamespaceByPrefix() { catalog.add( ns ); NamespaceInfo ns2 = catalog.getNamespaceByPrefix(ns.getPrefix()); assertNotNull(ns2); assertFalse( ns == ns2 ); assertEquals( ns, ns2 ); NamespaceInfo ns3 = catalog.getNamespaceByPrefix(null); assertNotNull(ns3); assertFalse( ns == ns3 ); assertEquals( ns, ns3 ); NamespaceInfo ns4 = catalog.getNamespaceByPrefix(Catalog.DEFAULT); assertNotNull(ns4); assertFalse( ns == ns4 ); assertEquals( ns, ns4 ); } public void testGetNamespaceByURI() { catalog.add( ns ); NamespaceInfo ns2 = catalog.getNamespaceByURI(ns.getURI()); assertNotNull(ns2); assertFalse( ns == ns2 ); assertEquals( ns, ns2 ); } public void testModifyNamespace() { catalog.add( ns ); NamespaceInfo ns2 = catalog.getNamespaceByPrefix(ns.getPrefix()); ns2.setPrefix( null ); ns2.setURI( null ); try { catalog.save(ns2); fail( "setting prefix to null should throw exception"); } catch( Exception e ) { } ns2.setPrefix( "ns2Prefix" ); try { catalog.save(ns2); fail( "setting uri to null should throw exception"); } catch( Exception e ) { } ns2.setURI( "ns2URI"); NamespaceInfo ns3 = catalog.getNamespaceByPrefix(ns.getPrefix()); assertEquals( "nsPrefix", ns3.getPrefix() ); assertEquals( "nsURI", ns3.getURI() ); catalog.save( ns2 ); //ns3 = catalog.getNamespaceByPrefix(ns.getPrefix()); ns3 = catalog.getNamespaceByPrefix("ns2Prefix"); assertEquals(ns2, ns3); assertEquals( "ns2Prefix", ns3.getPrefix() ); assertEquals( "ns2URI", ns3.getURI() ); } public void testNamespaceEvents() { TestListener l = new TestListener(); catalog.addListener( l ); NamespaceInfo ns = catalog.getFactory().createNamespace(); ns.setPrefix( "ns2Prefix" ); ns.setURI( "ns2URI"); assertTrue( l.added.isEmpty() ); assertTrue( l.modified.isEmpty() ); catalog.add( ns ); assertEquals( 1, l.added.size() ); assertEquals( ns, l.added.get(0).getSource()); assertEquals( 1, l.modified.size() ); assertEquals( catalog, l.modified.get(0).getSource()); assertEquals( "defaultNamespace", l.modified.get(0).getPropertyNames().get(0)); ns = catalog.getNamespaceByPrefix( "ns2Prefix" ); ns.setURI( "changed"); catalog.save( ns ); assertEquals( 2, l.modified.size() ); assertEquals( 1, l.modified.get(1).getPropertyNames().size()); assertTrue(l.modified.get(1).getPropertyNames().get(0).equalsIgnoreCase("uri" )); assertTrue(l.modified.get(1).getOldValues().contains( "ns2URI" )); assertTrue(l.modified.get(1).getNewValues().contains( "changed" )); assertTrue( l.removed.isEmpty() ); catalog.remove( ns ); assertEquals( 1, l.removed.size() ); assertEquals( ns, l.removed.get(0).getSource() ); } public void testAddWorkspace() { assertTrue( catalog.getWorkspaces().isEmpty() ); catalog.add( ws ); assertEquals( 1, catalog.getWorkspaces().size() ); WorkspaceInfo ws2 = catalog.getFactory().createWorkspace(); try { catalog.getWorkspaces().add( ws2 ); fail( "adding directly should throw an exception" ); } catch( Exception e ) { } try { catalog.add( ws2 ); fail( "addign without a name should throw an exception"); } catch( Exception e ) { } ws2.setName( "ws2" ); catalog.add( ws2 ); } public void testRemoveWorkspace() { catalog.add( ws ); assertEquals( 1, catalog.getWorkspaces().size() ); try { assertFalse( catalog.getWorkspaces().remove( ws ) ); fail( "removing directly should throw an exception" ); } catch( Exception e ) { } catalog.remove( ws ); assertTrue( catalog.getWorkspaces().isEmpty() ); } public void testAutoSetDefaultWorkspace() { catalog.add( ws ); assertEquals( 1, catalog.getWorkspaces().size() ); assertEquals(ws, catalog.getDefaultWorkspace()); assertNull(catalog.getDefaultNamespace()); } public void testRemoveDefaultWorkspace() { catalog.add( ws ); assertNotNull(catalog.getDefaultWorkspace()); catalog.remove( ws ); assertNull(catalog.getDefaultWorkspace()); } public void testAutoCascadeDefaultWorksapce() { CatalogFactory factory = catalog.getFactory(); WorkspaceInfo ws1 = factory.createWorkspace(); ws1.setName("ws1Name"); WorkspaceInfo ws2 = factory.createWorkspace(); ws2.setName("ws2Name"); catalog.add(ws1); catalog.add(ws2); assertEquals(ws1, catalog.getDefaultWorkspace()); catalog.remove(ws1); assertEquals(ws2, catalog.getDefaultWorkspace()); } public void testAutoSetDefaultNamespace() { catalog.add( ns ); assertEquals( 1, catalog.getNamespaces().size() ); assertEquals(ns, catalog.getDefaultNamespace()); } public void testRemoveDefaultNamespace() { catalog.add( ns ); catalog.remove( ns ); assertNull(catalog.getDefaultNamespace()); } public void testAutoCascadeDefaultNamespace() { CatalogFactory factory = catalog.getFactory(); NamespaceInfo ns1 = factory.createNamespace(); ns1.setPrefix("1"); ns1.setURI("http://www.geoserver.org/1"); NamespaceInfo ns2 = factory.createNamespace(); ns2.setPrefix("2"); ns2.setURI("http://www.geoserver.org/2"); catalog.add(ns1); catalog.add(ns2); assertEquals(ns1, catalog.getDefaultNamespace()); catalog.remove(ns1); assertEquals(ns2, catalog.getDefaultNamespace()); } public void testAutoSetDefaultStore() { catalog.add(ws); catalog.add(ds); assertEquals(1, catalog.getDataStores().size()); assertEquals(ds, catalog.getDefaultDataStore(ws)); } public void testRemoveDefaultStore() { catalog.add(ws); catalog.add(ds); catalog.remove(ds); assertNull(catalog.getDefaultDataStore(ws)); } public void testGetWorkspaceById() { catalog.add( ws ); WorkspaceInfo ws2 = catalog.getWorkspace(ws.getId()); assertNotNull(ws2); assertFalse( ws == ws2 ); assertEquals( ws, ws2 ); } public void testGetWorkspaceByName() { catalog.add( ws ); WorkspaceInfo ws2 = catalog.getWorkspaceByName(ws.getName()); assertNotNull(ws2); assertFalse( ws == ws2 ); assertEquals( ws, ws2 ); WorkspaceInfo ws3 = catalog.getWorkspaceByName(null); assertNotNull(ws3); assertFalse( ws == ws3 ); assertEquals( ws, ws3 ); WorkspaceInfo ws4 = catalog.getWorkspaceByName(Catalog.DEFAULT); assertNotNull(ws4); assertFalse( ws == ws4 ); assertEquals( ws, ws4 ); } public void testModifyWorkspace() { catalog.add( ws ); WorkspaceInfo ws2 = catalog.getWorkspaceByName(ws.getName()); ws2.setName( null ); try { catalog.save( ws2 ); fail( "setting name to null should throw exception"); } catch( Exception e) { } ws2.setName( "ws2"); WorkspaceInfo ws3 = catalog.getWorkspaceByName(ws.getName()); assertEquals( "wsName", ws3.getName() ); catalog.save( ws2 ); ws3 = catalog.getWorkspaceByName(ws2.getName()); assertEquals(ws2, ws3); assertEquals( "ws2", ws3.getName() ); } public void testWorkspaceEvents() { TestListener l = new TestListener(); catalog.addListener( l ); WorkspaceInfo ws = catalog.getFactory().createWorkspace(); ws.setName( "ws2"); assertTrue( l.added.isEmpty() ); assertTrue( l.modified.isEmpty() ); catalog.add( ws ); assertEquals( 1, l.added.size() ); assertEquals( ws, l.added.get(0).getSource()); assertEquals( catalog, l.modified.get(0).getSource()); assertEquals( "defaultWorkspace", l.modified.get(0).getPropertyNames().get(0)); ws = catalog.getWorkspaceByName( "ws2" ); ws.setName( "changed"); catalog.save( ws ); assertEquals( 2, l.modified.size() ); assertTrue(l.modified.get(1).getPropertyNames().contains( "name" )); assertTrue(l.modified.get(1).getOldValues().contains( "ws2" )); assertTrue(l.modified.get(1).getNewValues().contains( "changed" )); assertTrue( l.removed.isEmpty() ); catalog.remove( ws ); assertEquals( 1, l.removed.size() ); assertEquals( ws, l.removed.get(0).getSource() ); } public void testAddDataStore() { assertTrue( catalog.getDataStores().isEmpty() ); ds.setWorkspace(null); try { catalog.add( ds ); fail( "adding with no workspace should throw exception" ); } catch( Exception e ) {} ds.setWorkspace(ws); catalog.add(ws); catalog.add(ds); assertEquals( 1, catalog.getDataStores().size() ); DataStoreInfo retrieved = catalog.getDataStore(ds.getId()); DataStoreInfo ds2 = catalog.getFactory().createDataStore(); try { catalog.add( ds2 ); fail( "adding without a name should throw exception" ); } catch(Exception e ) { } ds2.setName( "ds2Name" ); try { catalog.getDataStores().add( ds2 ); fail( "adding directly should throw an exception" ); } catch( Exception e ) { } ds2.setWorkspace( ws ); catalog.add( ds2 ); assertEquals( 2, catalog.getDataStores().size() ); } public void testAddDataStoreDefaultWorkspace() { catalog.setDefaultWorkspace( ws ); DataStoreInfo ds2 = catalog.getFactory().createDataStore(); ds2.setName( "ds2Name"); catalog.add( ds2 ); assertEquals( ws, ds2.getWorkspace() ); } public void testRemoveDataStore() { addDataStore(); assertEquals( 1, catalog.getDataStores().size() ); try { assertFalse( catalog.getDataStores().remove( ds ) ); fail( "removing directly should throw an exception" ); } catch( Exception e ) { } catalog.remove( ds ); assertTrue( catalog.getDataStores().isEmpty() ); } public void testGetDataStoreById() { addDataStore(); DataStoreInfo ds2 = catalog.getDataStore(ds.getId()); assertNotNull(ds2); assertFalse( ds == ds2 ); assertEquals( ds, ds2 ); } public void testGetDataStoreByName() { addDataStore(); DataStoreInfo ds2 = catalog.getDataStoreByName(ds.getName()); assertNotNull(ds2); assertFalse( ds == ds2 ); assertEquals( ds, ds2 ); DataStoreInfo ds3 = catalog.getDataStoreByName(ws, null); assertNotNull(ds3); assertFalse( ds == ds3 ); assertEquals( ds, ds3 ); DataStoreInfo ds4 = catalog.getDataStoreByName(ws, Catalog.DEFAULT); assertNotNull(ds4); assertFalse( ds == ds4 ); assertEquals( ds, ds4 ); DataStoreInfo ds5 = catalog.getDataStoreByName(Catalog.DEFAULT, Catalog.DEFAULT); assertNotNull(ds5); assertFalse( ds == ds5 ); assertEquals( ds, ds5 ); } public void testModifyDataStore() { addDataStore(); DataStoreInfo ds2 = catalog.getDataStoreByName(ds.getName()); ds2.setName( "dsName2" ); ds2.setDescription( "dsDescription2" ); DataStoreInfo ds3 = catalog.getDataStoreByName(ds.getName()); assertEquals( "dsName", ds3.getName() ); assertEquals( "dsDescription", ds3.getDescription() ); catalog.save( ds2 ); ds3 = catalog.getDataStoreByName("dsName2"); assertEquals(ds2, ds3); assertEquals( "dsName2", ds3.getName() ); assertEquals( "dsDescription2", ds3.getDescription() ); } public void testChangeDataStoreWorkspace() throws Exception { addDataStore(); WorkspaceInfo ws2 = catalog.getFactory().createWorkspace(); ws2.setName( "newWorkspace"); catalog.add( ws2 ); ws2 = catalog.getWorkspaceByName( ws2.getName() ); DataStoreInfo ds2 = catalog.getDataStoreByName(ds.getName()); ds2.setWorkspace( ws2 ); catalog.save( ds2 ); assertNull( catalog.getDataStoreByName( ws, ds2.getName() ) ); assertNotNull( catalog.getDataStoreByName( ws2, ds2.getName() ) ); } public void testDataStoreEvents() { addWorkspace(); TestListener l = new TestListener(); catalog.addListener( l ); assertEquals( 0, l.added.size() ); catalog.add( ds ); assertEquals( 1, l.added.size() ); assertEquals( ds, l.added.get(0).getSource() ); assertEquals( 1, l.modified.size() ); assertEquals( catalog, l.modified.get(0).getSource() ); DataStoreInfo ds2 = catalog.getDataStoreByName( ds.getName() ); ds2.setDescription( "changed" ); assertEquals( 1, l.modified.size() ); catalog.save( ds2 ); assertEquals( 2, l.modified.size() ); CatalogModifyEvent me = l.modified.get(1); assertEquals( ds2, me.getSource() ); assertEquals( 1, me.getPropertyNames().size() ); assertEquals( "description", me.getPropertyNames().get(0)); assertEquals( 1, me.getOldValues().size() ); assertEquals( 1, me.getNewValues().size() ); assertEquals( "dsDescription", me.getOldValues().get(0)); assertEquals( "changed", me.getNewValues().get(0)); assertEquals( 0, l.removed.size() ); catalog.remove( ds ); assertEquals( 1, l.removed.size() ); assertEquals( ds, l.removed.get( 0 ).getSource() ); } public void testAddFeatureType() { assertTrue( catalog.getFeatureTypes().isEmpty() ); addFeatureType(); assertEquals( 1, catalog.getFeatureTypes().size() ); FeatureTypeInfo ft2 = catalog.getFactory().createFeatureType(); try { catalog.add(ft2); fail( "adding with no name should throw exception"); } catch( Exception e ) {} ft2.setName("ft2Name"); try { catalog.add(ft2); fail( "adding with no store should throw exception"); } catch( Exception e ) {} ft2.setStore( ds ); catalog.add( ft2 ); FeatureTypeInfo ft3 = catalog.getFactory().createFeatureType(); ft3.setName( "ft3Name"); try { catalog.getFeatureTypes().add( ft3 ); fail( "adding directly should throw an exception"); } catch( Exception e ) {} } public void testAddCoverage() { //set a default namespace assertNotNull(catalog.getCoverages()); assertTrue( catalog.getCoverages().isEmpty() ); addCoverage(); assertEquals( 1, catalog.getCoverages().size() ); CoverageInfo cv2 = catalog.getFactory().createCoverage(); try { catalog.add(cv2); fail( "adding with no name should throw exception"); } catch( Exception e ) {} cv2.setName("cv2Name"); try { catalog.add(cv2); fail( "adding with no store should throw exception"); } catch( Exception e ) {} cv2.setStore( cs ); catalog.add( cv2 ); assertEquals( 2, catalog.getCoverages().size() ); CoverageInfo fromCatalog = catalog.getCoverageByName("cv2Name"); assertNotNull(fromCatalog); //ensure the collection properties are set to NullObjects and not to null assertNotNull(fromCatalog.getParameters()); CoverageInfo cv3 = catalog.getFactory().createCoverage(); cv3.setName( "cv3Name"); try { catalog.getCoverages().add( cv3 ); fail( "adding directly should throw an exception"); } catch( Exception e ) {} } public void testAddWMSLayer() { //set a default namespace assertTrue( catalog.getResources(WMSLayerInfo.class).isEmpty() ); addWMSLayer(); assertEquals( 1, catalog.getResources(WMSLayerInfo.class).size() ); } public void testRemoveFeatureType() { addFeatureType(); assertFalse( catalog.getFeatureTypes().isEmpty() ); try { catalog.getFeatureTypes().remove( ft ); fail( "removing directly should cause exception"); } catch( Exception e ) {} catalog.remove( ft ); assertTrue( catalog.getFeatureTypes().isEmpty() ); } public void testRemoveWMSLayer() { addWMSLayer(); assertFalse( catalog.getResources(WMSLayerInfo.class).isEmpty() ); catalog.remove( wl ); assertTrue( catalog.getResources(WMSLayerInfo.class).isEmpty() ); } public void testGetFeatureTypeById() { addFeatureType(); FeatureTypeInfo ft2 = catalog.getFeatureType(ft.getId()); assertNotNull(ft2); assertFalse( ft == ft2 ); assertEquals( ft, ft2 ); } public void testGetFeatureTypeByName() { addFeatureType(); FeatureTypeInfo ft2 = catalog.getFeatureTypeByName(ft.getName()); assertNotNull(ft2); assertFalse( ft == ft2 ); assertEquals( ft, ft2 ); NamespaceInfo ns2 = catalog.getFactory().createNamespace(); ns2.setPrefix( "ns2Prefix" ); ns2.setURI( "ns2URI" ); catalog.add( ns2 ); FeatureTypeInfo ft3 = catalog.getFactory().createFeatureType(); ft3.setName( "ft3Name" ); ft3.setStore( ds ); ft3.setNamespace( ns2 ); catalog.add( ft3 ); FeatureTypeInfo ft4 = catalog.getFeatureTypeByName(ns2.getPrefix(), ft3.getName() ); assertNotNull(ft4); assertFalse( ft4 == ft3 ); assertEquals( ft3, ft4 ); ft4 = catalog.getFeatureTypeByName(ns2.getURI(), ft3.getName() ); assertNotNull(ft4); assertFalse( ft4 == ft3 ); assertEquals( ft3, ft4 ); } public void testGetFeatureTypesByStore() { catalog.add( ns ); catalog.add( ws ); catalog.setDefaultNamespace( ns ); catalog.setDefaultWorkspace( ws ); DataStoreInfo ds1 = catalog.getFactory().createDataStore(); ds1.setName( "ds1" ); catalog.add( ds1 ); FeatureTypeInfo ft1 = catalog.getFactory().createFeatureType(); ft1.setName( "ft1" ); ft1.setStore(ds1); catalog.add( ft1 ); FeatureTypeInfo ft2 = catalog.getFactory().createFeatureType(); ft2.setName( "ft2" ); ft2.setStore(ds1); catalog.add( ft2 ); DataStoreInfo ds2 = catalog.getFactory().createDataStore(); ds2.setName( "ds2" ); catalog.add( ds2 ); FeatureTypeInfo ft3 = catalog.getFactory().createFeatureType(); ft3.setName( "ft3" ); ft3.setStore( ds2 ); catalog.add( ft3 ); List<FeatureTypeInfo> ft = catalog.getFeatureTypesByStore( ds1 ); assertEquals( 2, ft.size() ); ft = catalog.getFeatureTypesByStore( ds2 ); assertEquals( 1, ft.size() ); List<ResourceInfo> r = catalog.getResourcesByStore(ds1,ResourceInfo.class); assertEquals( 2, r.size() ); assertEquals( ft1, r.get(0) ); assertEquals( ft2, r.get(1) ); } public void testModifyFeatureType() { addFeatureType(); FeatureTypeInfo ft2 = catalog.getFeatureTypeByName(ft.getName()); ft2.setDescription( "ft2Description" ); ft2.getKeywords().add(new Keyword("ft2")); FeatureTypeInfo ft3 = catalog.getFeatureTypeByName(ft.getName()); assertEquals( "ftName", ft3.getName() ); assertEquals( "ftDescription", ft3.getDescription() ); assertTrue( ft3.getKeywords().isEmpty() ); catalog.save( ft2 ); ft3 = catalog.getFeatureTypeByName(ft.getName()); assertEquals(ft2, ft3); assertEquals( "ft2Description", ft3.getDescription() ); assertEquals( 1, ft3.getKeywords().size() ); } public void testFeatureTypeEvents() { //set default namespace addNamespace(); addDataStore(); TestListener l = new TestListener(); catalog.addListener( l ); FeatureTypeInfo ft = catalog.getFactory().createFeatureType(); ft.setName( "ftName" ); ft.setDescription( "ftDescription" ); ft.setStore( ds ); assertTrue( l.added.isEmpty() ); catalog.add(ft); assertEquals( 1, l.added.size() ); assertEquals( ft, l.added.get(0).getSource() ); ft = catalog.getFeatureTypeByName("ftName"); ft.setDescription( "changed" ); assertTrue( l.modified.isEmpty() ); catalog.save(ft); assertEquals( 1, l.modified.size() ); assertEquals( ft, l.modified.get(0).getSource() ); assertTrue( l.modified.get(0).getPropertyNames().contains( "description")); assertTrue( l.modified.get(0).getOldValues().contains( "ftDescription")); assertTrue( l.modified.get(0).getNewValues().contains( "changed")); assertTrue( l.removed.isEmpty() ); catalog.remove( ft ); assertEquals( 1, l.removed.size() ); assertEquals( ft, l.removed.get(0).getSource() ); } public void testModifyMetadata() { //set default namespace addNamespace(); addDataStore(); TestListener l = new TestListener(); catalog.addListener( l ); FeatureTypeInfo ft = catalog.getFactory().createFeatureType(); ft.setName( "ftName" ); ft.setDescription( "ftDescription" ); ft.setStore( ds ); assertTrue( l.added.isEmpty() ); catalog.add(ft); assertEquals( 1, l.added.size() ); assertEquals( ft, l.added.get(0).getSource() ); ft = catalog.getFeatureTypeByName("ftName"); ft.getMetadata().put("newValue", "abcd"); MetadataMap newMetadata = new MetadataMap(ft.getMetadata()); catalog.save(ft); assertEquals( 1, l.modified.size() ); assertEquals( ft, l.modified.get(0).getSource() ); assertTrue( l.modified.get(0).getPropertyNames().contains( "metadata")); assertTrue( l.modified.get(0).getOldValues().contains( new MetadataMap() )); assertTrue( l.modified.get(0).getNewValues().contains( newMetadata )); } public void testAddLayer() { assertTrue( catalog.getLayers().isEmpty() ); addLayer(); assertEquals( 1, catalog.getLayers().size() ); LayerInfo l2 = catalog.getFactory().createLayer(); try { catalog.add( l2 ); fail( "adding with no name should throw exception"); } catch( Exception e) {} // l2.setName( "l2" ); try { catalog.add( l2 ); fail( "adding with no resource should throw exception"); } catch( Exception e) {} l2.setResource( ft ); //try { // catalog.add( l2 ); // fail( "adding with no default style should throw exception"); //} //catch( Exception e) {} // l2.setDefaultStyle( s ); catalog.add( l2 ); assertEquals( 2, catalog.getLayers().size() ); } public void testGetLayerById() { addLayer(); LayerInfo l2 = catalog.getLayer( l.getId() ); assertNotNull(l2); assertNotSame(l,l2); assertEquals( l, l2 ); } public void testGetLayerByName() { addLayer(); LayerInfo l2 = catalog.getLayerByName( l.getName() ); assertNotNull(l2); assertNotSame(l,l2); assertEquals( l, l2 ); } public void testGetLayerByNameWithColon() { FeatureTypeInfo ft = catalog.getFactory().createFeatureType(); ft.setEnabled(true); ft.setName( "foo:bar" ); ft.setAbstract( "ftAbstract" ); ft.setDescription( "ftDescription" ); ft.setStore( ds ); ft.setNamespace( ns ); catalog.add(ft); LayerInfo l = catalog.getFactory().createLayer(); l.setEnabled(true); l.setResource(ft); l.setDefaultStyle( s ); catalog.add(l); assertNotNull(catalog.getLayerByName("foo:bar")); } public void testGetLayerByResource() { addLayer(); List<LayerInfo> layers = catalog.getLayers(ft); assertEquals( 1, layers.size() ); LayerInfo l2 = layers.get(0); assertNotSame( l, l2 ); assertEquals( l, l2 ); } public void testRemoveLayer() { addLayer(); assertEquals( 1, catalog.getLayers().size() ); catalog.remove(l); assertTrue( catalog.getLayers().isEmpty() ); } public void testModifyLayer() { addLayer(); LayerInfo l2 = catalog.getLayerByName( l.getName() ); // l2.setName( null ); l2.setResource( null ); LayerInfo l3 = catalog.getLayerByName( l.getName() ); assertEquals( l.getName(), l3.getName() ); // try { // catalog.save(l2); // fail( "setting name to null should throw exception"); // } // catch( Exception e ) {} // // l2.setName( "changed" ); try { catalog.save(l2); fail( "setting resource to null should throw exception"); } catch( Exception e ) {} l2.setResource(ft); catalog.save(l2); // TODO: reinstate with resource/publishing split done // l3 = catalog.getLayerByName( "changed" ); l3 = catalog.getLayerByName( ft.getName() ); assertNotNull(l3); } public void testEnableLayer() { addLayer(); LayerInfo l2 = catalog.getLayerByName(l.getName()); assertTrue(l2.isEnabled()); assertTrue(l2.enabled()); assertTrue(l2.getResource().isEnabled()); l2.setEnabled(false); catalog.save(l2); l2 = catalog.getLayerByName(l2.getName()); assertFalse(l2.isEnabled()); assertFalse(l2.enabled()); assertFalse(l2.getResource().isEnabled()); } public void testLayerEvents() { addFeatureType(); TestListener tl = new TestListener(); catalog.addListener( tl ); assertTrue( tl.added.isEmpty() ); catalog.add( l ); assertEquals( 1, tl.added.size() ); assertEquals( l, tl.added.get(0).getSource() ); LayerInfo l2 = catalog.getLayerByName( l.getName() ); l2.setPath( "newPath" ); assertTrue( tl.modified.isEmpty() ); catalog.save( l2 ); assertEquals( 1, tl.modified.size() ); assertEquals( l2, tl.modified.get(0).getSource() ); assertTrue( tl.modified.get(0).getPropertyNames().contains( "path") ); assertTrue( tl.modified.get(0).getOldValues().contains( null ) ); assertTrue( tl.modified.get(0).getNewValues().contains( "newPath") ); assertTrue( tl.removed.isEmpty() ); catalog.remove( l2 ); assertEquals( 1, tl.removed.size() ); assertEquals( l2, tl.removed.get(0).getSource() ); } public void testAddStyle() { assertTrue( catalog.getStyles().isEmpty() ); addStyle(); assertEquals( 1, catalog.getStyles().size() ); StyleInfo s2 = catalog.getFactory().createStyle(); try { catalog.add( s2 ); fail( "adding without name should throw exception"); } catch( Exception e ) {} s2.setName( "s2Name"); try { catalog.add( s2 ); fail( "adding without fileName should throw exception"); } catch( Exception e ) {} s2.setFilename( "s2Filename"); try { catalog.getStyles().add( s2 ); fail( "adding directly should throw exception"); } catch( Exception e ) {} catalog.add( s2 ); assertEquals( 2, catalog.getStyles().size() ); } public void testGetStyleById() { addStyle(); StyleInfo s2 = catalog.getStyle( s.getId() ); assertNotNull( s2 ); assertNotSame(s,s2); assertEquals(s,s2); } public void testGetStyleByName() { addStyle(); StyleInfo s2 = catalog.getStyleByName( s.getName() ); assertNotNull( s2 ); assertNotSame(s,s2); assertEquals(s,s2); } public void testModifyStyle() { addStyle(); StyleInfo s2 = catalog.getStyleByName( s.getName() ); s2.setName( null ); s2.setFilename( null ); StyleInfo s3 = catalog.getStyleByName( s.getName() ); assertEquals( s, s3 ); try { catalog.save(s2); fail("setting name to null should fail"); } catch( Exception e ) {} s2.setName( "s2Name"); try { catalog.save(s2); fail("setting filename to null should fail"); } catch( Exception e ) {} s2.setFilename( "s2Filename"); catalog.save( s2 ); s3 = catalog.getStyleByName( "styleName" ); assertNull( s3 ); s3 = catalog.getStyleByName( s2.getName() ); assertEquals( s2, s3 ); } public void testRemoveStyle() { addStyle(); assertEquals( 1, catalog.getStyles().size()); catalog.remove(s); assertTrue( catalog.getStyles().isEmpty() ); } public void testStyleEvents() { TestListener l = new TestListener(); catalog.addListener( l ); assertTrue( l.added.isEmpty() ); catalog.add( s ); assertEquals( 1, l.added.size() ); assertEquals( s, l.added.get(0).getSource() ); StyleInfo s2 = catalog.getStyleByName(s.getName()); s2.setFilename( "changed"); assertTrue( l.modified.isEmpty() ); catalog.save( s2 ); assertEquals( 1, l.modified.size() ); assertEquals( s2, l.modified.get(0).getSource() ); assertTrue( l.modified.get(0).getPropertyNames().contains( "filename") ); assertTrue( l.modified.get(0).getOldValues().contains( "styleFilename") ); assertTrue( l.modified.get(0).getNewValues().contains( "changed") ); assertTrue( l.removed.isEmpty() ); catalog.remove( s2 ); assertEquals( 1, l.removed.size() ); assertEquals( s2, l.removed.get(0).getSource()); } public void testProxyBehaviour() throws Exception { testAddLayer(); // l = catalog.getLayerByName( "layerName"); LayerInfo l = catalog.getLayerByName(ft.getName()); assertTrue( l instanceof Proxy ); ResourceInfo r = l.getResource(); assertTrue( r instanceof Proxy ); r.setName( "changed"); catalog.save( l ); // l = catalog.getLayerByName( "layerName"); l = catalog.getLayerByName(ft.getName()); assertEquals( "changed", l.getResource().getName() ); } public void testProxyListBehaviour() throws Exception { catalog.add( s ); StyleInfo s2 = catalog.getFactory().createStyle(); s2.setName( "a" + s.getName() ); s2.setFilename( "a.sld"); catalog.add( s2 ); List<StyleInfo> styles = catalog.getStyles(); assertEquals( 2 , styles.size() ); assertEquals( s.getName(), styles.get( 0 ).getName() ); assertEquals( "a"+s.getName(), styles.get( 1).getName() ); //test sorting Collections.sort( styles, new Comparator<StyleInfo>() { public int compare(StyleInfo o1, StyleInfo o2) { return o1.getName().compareTo( o2.getName()); } }); assertEquals( "a"+s.getName(), styles.get( 0 ).getName() ); assertEquals( s.getName(), styles.get( 1 ).getName() ); } public void testExceptionThrowingListener() throws Exception { ExceptionThrowingListener l = new ExceptionThrowingListener(); catalog.addListener(l); l.throwCatalogException = false; WorkspaceInfo ws = catalog.getFactory().createWorkspace(); ws.setName("foo"); //no exception thrown back catalog.add(ws); l.throwCatalogException = true; ws = catalog.getFactory().createWorkspace(); ws.setName("bar"); try { catalog.add(ws); fail(); } catch( CatalogException ce ) { //good } } public void testAddWMSStore() { assertTrue( catalog.getStores(WMSStoreInfo.class).isEmpty() ); addWMSStore(); assertEquals( 1, catalog.getStores(WMSStoreInfo.class).size() ); WMSStoreInfo retrieved = catalog.getStore(wms.getId(), WMSStoreInfo.class); WMSStoreInfo wms2 = catalog.getFactory().createWebMapServer(); wms2.setName( "wms2Name" ); wms2.setWorkspace( ws ); catalog.add( wms2 ); assertEquals( 2, catalog.getStores(WMSStoreInfo.class).size() ); } private static final int GET_LAYER_BY_ID_WITH_CONCURRENT_ADD_TEST_COUNT = 500; private static final int GET_LAYER_BY_ID_WITH_CONCURRENT_ADD_THREAD_COUNT = 10; public void testGetLayerByIdWithConcurrentAdd() throws Exception { addDataStore(); addNamespace(); LayerInfo layer = catalog.getFactory().createLayer(); layer.setResource(ft); layer.setName("LAYER"); catalog.add(layer); String id = layer.getId(); CountDownLatch ready = new CountDownLatch(GET_LAYER_BY_ID_WITH_CONCURRENT_ADD_THREAD_COUNT + 1); CountDownLatch done = new CountDownLatch(GET_LAYER_BY_ID_WITH_CONCURRENT_ADD_THREAD_COUNT); List<RunnerBase> runners = new ArrayList<RunnerBase>(); for (int i = 0; i < GET_LAYER_BY_ID_WITH_CONCURRENT_ADD_THREAD_COUNT; i++) { RunnerBase runner = new LayerAddRunner(ready, done, i); new Thread(runner).start(); runners.add(runner); } // note that test thread is ready ready.countDown(); // wait for all threads to reach latch in order to maximize likelihood of contention ready.await(); for (int i = 0; i < GET_LAYER_BY_ID_WITH_CONCURRENT_ADD_TEST_COUNT ; i++) { catalog.getLayer(id); } // make sure worker threads are done done.await(); RunnerBase.checkForRunnerExceptions(runners); } static class TestListener implements CatalogListener { public List<CatalogAddEvent> added = new ArrayList(); public List<CatalogModifyEvent> modified = new ArrayList(); public List<CatalogRemoveEvent> removed = new ArrayList(); public void handleAddEvent(CatalogAddEvent event) { added.add( event ); } public void handleModifyEvent(CatalogModifyEvent event) { modified.add( event ); } public void handlePostModifyEvent(CatalogPostModifyEvent event) { } public void handleRemoveEvent(CatalogRemoveEvent event) { removed.add( event ); } public void reloaded() { } } static class ExceptionThrowingListener implements CatalogListener { public boolean throwCatalogException; public void handleAddEvent(CatalogAddEvent event) throws CatalogException { if (throwCatalogException) { throw new CatalogException(); } else { throw new RuntimeException(); } } public void handleModifyEvent(CatalogModifyEvent event) throws CatalogException { } public void handlePostModifyEvent(CatalogPostModifyEvent event) throws CatalogException { } public void handleRemoveEvent(CatalogRemoveEvent event) throws CatalogException { } public void reloaded() { } } class LayerAddRunner extends RunnerBase { private int idx; protected LayerAddRunner(CountDownLatch ready, CountDownLatch done, int idx) { super(ready, done); this.idx = idx; } protected void runInternal() throws Exception { CatalogFactory factory = catalog.getFactory(); for (int i = 0; i < GET_LAYER_BY_ID_WITH_CONCURRENT_ADD_TEST_COUNT; i++) { LayerInfo layer = factory.createLayer(); layer.setResource(ft); layer.setName("LAYER-" + i + "-" + idx); catalog.add(layer); } } }; }