package folioxml.export.html;
import folioxml.config.ExportLocations;
import folioxml.config.InfobaseConfigBase;
import folioxml.core.InvalidMarkupException;
import folioxml.export.ExportingNodeListProcessor;
import folioxml.export.FileNode;
import folioxml.export.LogStreamProvider;
import folioxml.export.NodeListProcessor;
import folioxml.xml.Node;
import folioxml.xml.NodeList;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class LinkMapper implements NodeListProcessor, ExportingNodeListProcessor {
public InfobaseConfigBase c;
private HashMap<String, Object> infobaseToUriMap;
private HashMap<String, Object> uriToUriMap;
public LinkMapper(InfobaseConfigBase c) {
this.c = c;
Map<String, Object> mapperConfig = c.getObject("link_mapper") != null ? (Map<String, Object>) c.getObject("link_mapper") : new HashMap<String, Object>();
if (mapperConfig.get("infobases") != null) {
infobaseToUriMap = (HashMap<String, Object>) mapperConfig.get("infobases");
}
if (mapperConfig.get("urls") != null) {
uriToUriMap = (HashMap<String, Object>) mapperConfig.get("urls");
}
}
@Override
public NodeList process(NodeList nodes) throws InvalidMarkupException, IOException {
NodeList links = nodes.filterByTagName("a|link", true);
for (Node n : links.list()) {
String newUrl = null;
String infobase = n.get("infobase");
if (infobase != null && infobaseToUriMap != null && infobaseToUriMap.containsKey(infobase)) {
newUrl = (String) infobaseToUriMap.get(infobase);
}
String href = n.get("href");
if (href != null && uriToUriMap != null && uriToUriMap.containsKey(href)) {
newUrl = (String) uriToUriMap.get(href);
}
if (newUrl != null) {
String old = n.toXmlString(true);
n.setTagName("a");
n.removeAttr("infobase");
n.set("href", newUrl);
provider.getNamedStream("mapped_links").append(" in record ").append(n.rootNode().get("folioId")).append("\n").append(old).append(" ... to:\n").append(n.toXmlString((true))).append("\n");
}
}
return nodes;
}
@Override
public void setFileNode(FileNode fn) {
}
LogStreamProvider provider;
@Override
public void setLogProvider(LogStreamProvider provider) {
this.provider = provider;
}
@Override
public void setExportLocations(ExportLocations el) {
}
}