package lux.index.analysis;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import net.sf.saxon.s9api.QName;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.util.TokenFilterFactory;
public class QNameFilterFactory extends TokenFilterFactory {
private static final String VISIBILITY = "visibility";
private final HashMap<String,ElementVisibility> elVis;
private final ElementVisibility defVis;
public QNameFilterFactory (Map<String,String> args) {
super (args);
if (args.containsKey(VISIBILITY)) {
defVis = ElementVisibility.valueOf(args.get(VISIBILITY).toUpperCase());
} else {
defVis = ElementVisibility.OPAQUE;
}
elVis = new HashMap<String, ElementVisibility>();
setElementVisibility (ElementVisibility.CONTAINER, args);
setElementVisibility (ElementVisibility.OPAQUE, args);
setElementVisibility (ElementVisibility.TRANSPARENT, args);
setElementVisibility (ElementVisibility.HIDDEN, args);
/*
for (Map.Entry<String,String> entry : args.entrySet()) {
ElementVisibility vis;
try {
vis = ElementVisibility.valueOf(entry.getKey().toUpperCase());
} catch (IllegalArgumentException e) {
continue;
}
setElementVisibility(vis, args);
}
*/
}
private void setElementVisibility (ElementVisibility vis, Map<String, String> args) {
String qnameList = args.get(vis.name().toLowerCase());
if (qnameList != null) {
for (String name : qnameList.split(",")) {
QName.fromClarkName(name); // expect the name in Clark notation: {namespace}local-name
elVis.put(name, vis);
}
}
}
@Override
public TokenStream create(TokenStream input) {
return new QNameTokenFilter (input, defVis, elVis);
}
public ElementVisibility getDefaultVisibility () {
return defVis;
}
public Map<String,ElementVisibility> getElementVisibility () {
return Collections.unmodifiableMap(elVis);
}
}