package org.geoserver.csw.records;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import net.opengis.cat.csw20.ElementSetType;
import org.geoserver.csw.feature.MemoryFeatureCollection;
import org.geoserver.csw.store.AbstractCatalogStore;
import org.geotools.data.Query;
import org.geotools.data.Transaction;
import org.geotools.feature.AttributeTypeBuilder;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.NameImpl;
import org.geotools.feature.type.FeatureTypeFactoryImpl;
import org.junit.Test;
import org.opengis.feature.type.AttributeDescriptor;
import org.opengis.feature.type.FeatureType;
import org.opengis.feature.type.FeatureTypeFactory;
import org.opengis.feature.type.Name;
import org.opengis.filter.Filter;
import org.opengis.filter.expression.PropertyName;
import org.xml.sax.helpers.NamespaceSupport;
public class AbstractCatalogStoreTest {
@Test
public void testNamespaceSupport() throws IOException, URISyntaxException {
AbstractCatalogStore store = new AbstractCatalogStore() {
{
support(CSWRecordDescriptor.getInstance());
support(GSRecordDescriptor.getInstance());
}
@Override
public FeatureCollection getRecordsInternal(RecordDescriptor rd, RecordDescriptor rdOutput,
Query q, Transaction t) throws IOException {
if(rd == GSRecordDescriptor.getInstance()) {
return new MemoryFeatureCollection(GSRecordDescriptor.getInstance().getFeatureType());
} else {
throw new RuntimeException("Was expecting the geoserver record descriptor");
}
}
};
RecordDescriptor[] descriptors = store.getRecordDescriptors();
assertEquals(2, descriptors.length);
assertEquals(CSWRecordDescriptor.getInstance(), descriptors[0]);
assertEquals(GSRecordDescriptor.getInstance(), descriptors[1]);
Query query = new Query("Record");
query.setNamespace(new URI(GSRecordDescriptor.GS_NAMESPACE));
FeatureCollection records = store.getRecords(query, Transaction.AUTO_COMMIT, null);
assertEquals(GSRecordDescriptor.getInstance().getFeatureType(), records.getSchema());
}
static class GSRecordDescriptor extends AbstractRecordDescriptor {
static final String GS_NAMESPACE = "http://www.geoserver.org/csw";
CSWRecordDescriptor delegate = CSWRecordDescriptor.getInstance();
static final GSRecordDescriptor INSTANCE = new GSRecordDescriptor();
public static GSRecordDescriptor getInstance() {
return INSTANCE;
}
public FeatureType getFeatureType() {
FeatureType ft = delegate.getFeatureType();
FeatureTypeFactory factory = new FeatureTypeFactoryImpl();
FeatureType gsft = factory.createFeatureType(new NameImpl(GS_NAMESPACE, "Record"), ft.getDescriptors(), null, false, null, ft.getSuper(), null);
return gsft;
}
public AttributeDescriptor getFeatureDescriptor() {
AttributeTypeBuilder builder = new AttributeTypeBuilder();
AttributeDescriptor descriptor = builder.buildDescriptor(new NameImpl(GS_NAMESPACE, "Record"), delegate.getFeatureType());
return descriptor;
}
public String getOutputSchema() {
return delegate.getOutputSchema();
}
public List<Name> getPropertiesForElementSet(ElementSetType elementSet) {
return delegate.getPropertiesForElementSet(elementSet);
}
public NamespaceSupport getNamespaceSupport() {
return delegate.getNamespaceSupport();
}
public Query adaptQuery(Query query) {
return delegate.adaptQuery(query);
}
public String getBoundingBoxPropertyName() {
return delegate.getBoundingBoxPropertyName();
}
public List<Name> getQueryables() {
return delegate.getQueryables();
}
public String getQueryablesDescription() {
return delegate.getQueryablesDescription();
}
public PropertyName translateProperty(Name name) {
return delegate.translateProperty(name);
}
public void verifySpatialFilters(Filter filter) {
delegate.verifySpatialFilters(filter);
}
}
}