/** * check whether the href/id element defined by keys has been exported. * * @param href href * @param id id * @param key keyname * @param tempDir absolute path to temporary director * @return result list */ public List<Boolean> checkExport( String href, final String id, final String key, final File tempDir) { // parsed export .xml to get exported elements final File exportFile = new File(tempDir, FILE_NAME_EXPORT_XML); boolean idExported = false; boolean keyrefExported = false; try { // load export.xml only once if (root == null) { final DocumentBuilder builder = XMLUtils.getDocumentBuilder(); builder.setEntityResolver(CatalogUtils.getCatalogResolver()); root = builder.parse(new InputSource(new FileInputStream(exportFile))); } // get file node which contains the export node final Element fileNode = searchForKey(root.getDocumentElement(), href, "file"); if (fileNode != null) { // iterate the child nodes final NodeList pList = fileNode.getChildNodes(); for (int j = 0; j < pList.getLength(); j++) { final Node node = pList.item(j); if (Node.ELEMENT_NODE == node.getNodeType()) { final Element child = (Element) node; // compare keys if (child.getNodeName().equals("keyref") && child.getAttribute(ATTRIBUTE_NAME_NAME).equals(key)) { keyrefExported = true; // compare topic id } else if (child.getNodeName().equals("topicid") && child.getAttribute(ATTRIBUTE_NAME_NAME).equals(id)) { idExported = true; // compare element id } else if (child.getNodeName().equals("id") && child.getAttribute(ATTRIBUTE_NAME_NAME).equals(id)) { idExported = true; } } if (idExported && keyrefExported) { break; } } } } catch (final Exception e) { e.printStackTrace(); } final List<Boolean> list = new ArrayList<>(); list.add(idExported); list.add(keyrefExported); return list; }
/** * Find whether an id is refer to a topic in a dita file. * * @param absolutePathToFile the absolute path of dita file * @param id topic id * @return true if id find and false otherwise */ public boolean findTopicId(final File absolutePathToFile, final String id) { if (!absolutePathToFile.exists()) { return false; } try { // load the file final DocumentBuilder builder = XMLUtils.getDocumentBuilder(); builder.setEntityResolver(CatalogUtils.getCatalogResolver()); final Document root = builder.parse(new InputSource(new FileInputStream(absolutePathToFile))); // get root element final Element doc = root.getDocumentElement(); // do BFS final Queue<Element> queue = new LinkedList<>(); queue.offer(doc); while (!queue.isEmpty()) { final Element pe = queue.poll(); final NodeList pchildrenList = pe.getChildNodes(); for (int i = 0; i < pchildrenList.getLength(); i++) { final Node node = pchildrenList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { queue.offer((Element) node); } } final String classValue = pe.getAttribute(ATTRIBUTE_NAME_CLASS); if (classValue != null && TOPIC_TOPIC.matches(classValue)) { // topic id found if (pe.getAttribute(ATTRIBUTE_NAME_ID).equals(id)) { return true; } } } return false; } catch (final Exception e) { logger.error("Failed to read document: " + e.getMessage(), e); } return false; }