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.NodeFilter; import folioxml.xml.NodeList; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PullElements implements NodeListProcessor, ExportingNodeListProcessor { public InfobaseConfigBase c; public PullElements(InfobaseConfigBase c) { this.c = c; Map<String, Object> pull = c.getObject("pull") != null ? (Map<String, Object>) c.getObject("pull") : new HashMap<String, Object>(); if (pull.get("links_to_infobases") != null) infobasesToDrop = (List<String>) pull.get("links_to_infobases"); pullProgramLinks = (Boolean) pull.get("program_links"); pullMenuLinks = (Boolean) pull.get("menu_links"); if (pullProgramLinks == null) pullProgramLinks = false; if (pullMenuLinks == null) pullMenuLinks = true; dropNotes = (Boolean) pull.get("drop_notes"); if (dropPopups == null) dropPopups = true; dropPopups = (Boolean) pull.get("drop_popups"); if (dropNotes == null) dropNotes = false; dropOle = (Boolean) pull.get("ole_objects"); if (dropOle == null) dropOle = false; dropMetafile = (Boolean) pull.get("metafile_objects"); if (dropMetafile == null) dropMetafile = false; } private Boolean pullProgramLinks = null; private Boolean pullMenuLinks = null; private Boolean dropNotes = null; private Boolean dropPopups = null; private Boolean dropOle = null; private Boolean dropMetafile = null; private List<String> infobasesToDrop = new ArrayList<String>(); @Override public NodeList process(NodeList nodes) throws InvalidMarkupException, IOException { NodeList objects = nodes.filterByTagName("img|object|a|link", true); for (Node n : objects.list()) { String infobase = n.get("infobase"); if (infobase == null) continue; if (infobasesToDrop.contains(infobase)) { logAndPullNode("pulled_elements", n, "External infobase reference"); } } if (pullMenuLinks) logAndPullNodes("pulled_elements", nodes.search(new NodeFilter("link", "menu", null)), "Menu link"); if (pullProgramLinks) logAndPullNodes("pulled_elements", nodes.search(new NodeFilter("link", "program", null)), "Program link"); if (dropOle) logAndDropNodes("dropped_elements", nodes.search(new NodeFilter("object", "type", "ole")), "OLE Object"); if (dropMetafile) logAndDropNodes("dropped_elements", nodes.search(new NodeFilter("object", "handler", "Metafile")), "Metafile Object"); if (dropNotes) logAndDropNodes("dropped_elements", nodes.search(new NodeFilter("note")), "Notes"); if (dropPopups) { objects = nodes.search(new NodeFilter("a|link", "type", "popup")); for (Node t : objects.list()) { Node popup = objects.search(new NodeFilter("popup")).first(); if (popup == null) { provider.getNamedStream("warnings").append("Malformed popup links").append(" in record ").append(t.rootNode().get("folioId")).append("\n").append(t.toXmlString((true))).append("\n"); } if (popup != null) logNode("dropped_elements", popup, "Popup contents"); logNode("pulled_elements", t, "Popup link"); if (popup != null) popup.remove(); t.pull(); } logAndPullNodes("pulled_elements", nodes.search(new NodeFilter("link", "popupTitle", null)), "Named popup link"); } 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) { } private void logAndPullNodes(String stream, NodeList list, String intro) throws InvalidMarkupException, IOException { for (Node n : list.list()) { logAndPullNode(stream, n, intro); } } private void logAndDropNodes(String stream, NodeList list, String intro) throws InvalidMarkupException, IOException { for (Node n : list.list()) { logNode(stream, n, intro); n.remove(); } } private void logAndPullNode(String stream, Node n, String intro) throws InvalidMarkupException, IOException { logNode(stream, n, intro); n.pull(); } private void logNode(String stream, Node n, String intro) throws InvalidMarkupException, IOException { provider.getNamedStream(stream).append(intro).append(" in record ").append(n.rootNode().get("folioId")).append("\n").append(n.toXmlString((true))).append("\n"); } }