package org.geotools.filter.v2_0.bindings; import static org.opengis.filter.identity.Version.Action.ALL; import static org.opengis.filter.identity.Version.Action.FIRST; import static org.opengis.filter.identity.Version.Action.LAST; import static org.opengis.filter.identity.Version.Action.NEXT; import static org.opengis.filter.identity.Version.Action.PREVIOUS; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.identity.ResourceIdImpl; import org.geotools.filter.v2_0.FESTestSupport; import org.geotools.xml.impl.DatatypeConverterImpl; import org.opengis.filter.FilterFactory; import org.opengis.filter.Id; import org.opengis.filter.identity.Identifier; import org.opengis.filter.identity.ResourceId; import org.opengis.filter.identity.Version; public class ResourceIdTypeBindingTest extends FESTestSupport { public void testParse() throws Exception { String xml = "<fes:Filter " + " xmlns:fes='http://www.opengis.net/fes/2.0' " + " xmlns:gml='http://www.opengis.net/gml/3.2' " + " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " + " xsi:schemaLocation='http://www.opengis.net/fes/2.0 http://schemas.opengis.net/filter/2.0/filterAll.xsd" + " http://www.opengis.net/gml/3.2 http://schemas.opengis.net/gml/3.2.1/gml.xsd'>" + " <fes:ResourceId rid=\"rid1@abc\" previousRid=\"previous1\" version=\"FIRST\"/> " + " <fes:ResourceId rid=\"rid2\" version=\"LAST\"/> " + " <fes:ResourceId rid=\"rid3\" version=\"PREVIOUS\"/> " + " <fes:ResourceId rid=\"rid4\" version=\"NEXT\"/> " + " <fes:ResourceId rid=\"rid5\" version=\"ALL\"/> " + " <fes:ResourceId rid=\"rid6\" previousRid=\"previous2\" version=\"4\" startDate=\"1977-01-17T01:05:40Z\" endDate=\"2011-07-29T23:49:40Z\" /> " + " <fes:ResourceId rid=\"rid7@123\" version=\"1977-01-17T01:05:40Z\"/> " + "</fes:Filter>"; buildDocument(xml); Id filter = (Id) parse(); assertNotNull(filter); assertEquals(7, filter.getIdentifiers().size()); List<ResourceId> ids = new ArrayList<ResourceId>(7); for (Identifier id : filter.getIdentifiers()) { assertTrue(id instanceof ResourceId); ids.add((ResourceId) id); } Collections.sort(ids, new Comparator<ResourceId>() { @Override public int compare(ResourceId o1, ResourceId o2) { return o1.getRid().compareTo(o2.getRid()); } }); final DatatypeConverterImpl dateParser = DatatypeConverterImpl.getInstance(); final Date date1 = dateParser.parseDateTime("1977-01-17T01:05:40Z").getTime(); final Date date2 = dateParser.parseDateTime("2011-07-29T23:49:40Z").getTime(); FilterFactory ff = CommonFactoryFinder.getFilterFactory(null); // This is in consistent as the FIRST entry cannot have a previous1 ResourceIdImpl resourceId = new ResourceIdImpl("rid1", "abc", new Version(FIRST)); resourceId.setPreviousRid("previous1"); assertEquals( resourceId.getID(), ids.get(0).getID()); assertEquals(ff.resourceId("rid2", "", new Version(LAST)).getID(), ids.get(1).getID()); assertEquals(ff.resourceId("rid3", "", new Version(PREVIOUS)).getID(), ids.get(2).getID()); assertEquals(ff.resourceId("rid4", "", new Version(NEXT)).getID(), ids.get(3).getID()); assertEquals(ff.resourceId("rid5", "", new Version(ALL)).getID(), ids.get(4).getID()); // This is inconsistent as date and resource based query cannot be used at the same time ResourceIdImpl resourceId2 = new ResourceIdImpl("rid6", "", new Version(4)); resourceId2.setPreviousRid("previous2"); resourceId2.setStartTime(date1); resourceId2.setEndTime(date2); assertEquals( resourceId2.getID(), ids.get(5).getID()); assertEquals(ff.resourceId("rid7", "123", new Version(date1)).getID(), ids.get(6).getID()); } }