/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2014 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wfs;
import com.google.common.collect.Iterators;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.NamespaceInfo;
import org.geoserver.catalog.Predicates;
import org.geoserver.catalog.util.CloseableIterator;
import org.xml.sax.helpers.NamespaceSupport;
import javax.xml.namespace.NamespaceContext;
import java.util.Enumeration;
import java.util.Iterator;
/**
* NamespaceContext based on GeoServer catalog.
*/
public class CatalogNamespaceSupport extends NamespaceSupport {
Catalog catalog;
public CatalogNamespaceSupport(Catalog catalog) {
super();
this.catalog = catalog;
}
@Override
public Enumeration getDeclaredPrefixes() {
return getPrefixes();
}
@Override
public Enumeration getPrefixes() {
final CloseableIterator<NamespaceInfo> it = catalog.list(NamespaceInfo.class, Predicates.acceptAll());
return new Enumeration() {
@Override
public boolean hasMoreElements() {
if (it.hasNext()) {
return true;
}
else {
it.close();
return false;
}
}
@Override
public Object nextElement() {
return it.next().getPrefix();
}
};
}
@Override
public Enumeration getPrefixes(String uri) {
final String pre = getPrefix(uri);
if (pre == null) {
return new Enumeration() {
@Override
public boolean hasMoreElements() {
return false;
}
@Override
public Object nextElement() {
return null;
}
};
}
return new Enumeration() {
boolean read = false;
@Override
public boolean hasMoreElements() {
return !read;
}
@Override
public Object nextElement() {
try {
return pre;
}
finally {
read = false;
}
}
};
}
@Override
public String getPrefix(String uri) {
NamespaceInfo ns = "".equals(uri) ? catalog.getDefaultNamespace() : catalog.getNamespaceByURI(uri);
return ns != null ? ns.getPrefix() : null;
}
@Override
public String getURI(String prefix) {
NamespaceInfo ns = "".equals(prefix) ? catalog.getDefaultNamespace() : catalog.getNamespaceByPrefix(prefix);
return ns != null ? ns.getURI() : null;
}
@Override
public void reset() {
super.reset();
}
@Override
public void pushContext() {
throw new UnsupportedOperationException();
}
@Override
public void popContext() {
throw new UnsupportedOperationException();
}
@Override
public boolean declarePrefix(String prefix, String uri) {
throw new UnsupportedOperationException();
}
@Override
public String[] processName(String qName, String[] parts, boolean isAttribute) {
throw new UnsupportedOperationException();
}
@Override
public void setNamespaceDeclUris(boolean value) {
throw new UnsupportedOperationException();
}
@Override
public boolean isNamespaceDeclUris() {
throw new UnsupportedOperationException();
}
}