/******************************************************************************* * 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.html; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.axdt.asdoc.model.AsdocPackage; import org.axdt.asdoc.model.AsdocRoot; import org.axdt.asdoc.util.HtmlUrlHelper; import org.w3c.dom.Node; import com.google.common.base.Function; public class CollectPackageList extends AbstractHtmlCollector { private Pattern pattern; public CollectPackageList() { super(); pattern = Pattern.compile("^.*'(.*/" + HtmlUrlHelper.PACKAGE_DETAIL + ")'.*$"); } public List<AsdocPackage> collectPackages(AsdocRoot root, boolean summary) throws Exception { String uri = new HtmlUrlHelper().packages(root, summary); logger.info("loading: " + uri); Node node = xml.load(uri); if (summary) node = xml.eval(findMain, node); return xml.eIter(findLinks, node, new TransformLink2Package(root)); } public String getFQN(String href) { if (href == null) return null; if (!href.endsWith(HtmlUrlHelper.PACKAGE_DETAIL)) { Matcher matcher = pattern.matcher(href); if (!matcher.matches()) { logger.debug("ignored link: " + href); return null; } href = matcher.group(1); } int lastSlash = href.lastIndexOf('/'); return lastSlash < 0 ? "" : href.substring(0, lastSlash).replace('/', '.'); } protected class TransformLink2Package implements Function<Node, AsdocPackage> { private final AsdocRoot root; public TransformLink2Package(AsdocRoot root) { this.root = root; } public AsdocPackage apply(Node link) { String href = xml.attr(link, "href"); String fqn = getFQN(href); if (fqn != null) { AsdocPackage pack = root.createPackage(fqn); pack.setTypeContentAvailable(true); return pack; } return null; } } }