/** * Peers * Copyright 2012 by Michael Peter Christen, mc@yacy.net, Frankfurt am Main, Germany * First released 21.09.2012 at http://yacy.net * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program in the file lgpl21.txt * If not, see <http://www.gnu.org/licenses/>. */ package net.yacy.cora.federate.yacy.api; import java.io.ByteArrayInputStream; import java.io.IOException; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import net.yacy.cora.federate.yacy.Peer; import net.yacy.cora.federate.yacy.Peers; import net.yacy.cora.protocol.ClientIdentification; import net.yacy.cora.protocol.http.HTTPClient; /** * discover all peers in the network when only one peer is known. * this works only for a limited number of peers, not more than some thousands */ public class Network { /** * get the list of peers from one peer * @param address * @return a network as list of peers * @throws IOException */ public static Peers getNetwork(final String address) throws IOException { Peers peers = new Peers(); final HTTPClient httpclient = new HTTPClient(ClientIdentification.yacyInternetCrawlerAgent); final byte[] content = httpclient.GETbytes("http://" + address + "/Network.xml?page=1&maxCount=1000&ip=", null, null, false); ByteArrayInputStream bais = new ByteArrayInputStream(content); Document doc = null; try { doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(bais); } catch (final Throwable e) { throw new IOException(e.getMessage()); } bais.close(); doc.getDocumentElement().normalize(); NodeList objects = doc.getElementsByTagName("peer"); for (int i = 0; i < objects.getLength(); i++) { Node object = objects.item(i); if (object.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) object; Peer peer = new Peer(); for (Peer.Schema attr: Peer.Schema.values()) { peer.put(attr, getAttr(attr.name(), element)); } peers.add(peer); //log.info(peer.toString()); } } return peers; } private static String getAttr(String attr, Element eElement) { NodeList nl0 = eElement.getElementsByTagName(attr); if (nl0 == null) return ""; Node n0 = nl0.item(0); if (n0 == null) return ""; NodeList nl1 = n0.getChildNodes(); if (nl1 == null) return ""; Node n1 = nl1.item(0); if (n1 == null) return ""; return n1.getNodeValue(); } public static void main(String[] args) { //getNetwork("search.yacy.net"); try {getNetwork("sokrates.homeunix.net:9090");} catch (final IOException e1) {} try {HTTPClient.closeConnectionManager();} catch (final InterruptedException e) {} } }