/******************************************************************************* * Copyright (c) 2010 Martin Schnabel <mb0@mb0.org>. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ package org.axdt.asdoc.parser.dita; import java.util.List; import org.axdt.asdoc.model.AsdocPackage; import org.axdt.asdoc.model.AsdocRoot; import org.axdt.asdoc.parser.AbstractCollector; import org.axdt.asdoc.util.DitaUrlHelper; import org.w3c.dom.Node; import com.google.common.collect.Lists; public class CollectPackages extends AbstractCollector { public CollectPackages() { super(); } public List<AsdocPackage> collectPackages(AsdocRoot root) throws Exception { String uri = new DitaUrlHelper().packageList(root); logger.info("loading: " + uri); try { Node node = xml.load(uri).getFirstChild(); List<AsdocPackage> result = Lists.newArrayList(); traverse(node, root, result); return result.isEmpty() ? null : result; } catch (Exception e) { logger.error(e); } return null; } protected void traverse(Node node, AsdocRoot root, List<AsdocPackage> result) { if ("apiItemRef".equals(node.getNodeName())) { String fqn = linkToFqn(node.getAttributes().getNamedItem("href")); if (fqn != null) { AsdocPackage pack = root.createPackage(fqn); pack.setTypeContentAvailable(true); result.add(pack == root ? 0 : result.size(), pack); } } if (node.hasChildNodes()) { for(Node child=node.getFirstChild(); child!=null; child=child.getNextSibling()) { traverse(child,root,result); } } } protected String linkToFqn(Node child) { String link = child.getNodeValue(); int index = link.lastIndexOf(DitaUrlHelper.EXT); if (index < 0) return null; String fqn = link.substring(0, index); logger.debug("found " + fqn); if (DitaUrlHelper.GLOBAL.equals(fqn)) return ""; return fqn; } }