/*
* Node.java
*
* Copyright (c) 2005-2007 Andrew Krizhanovsky /aka at mail.iias.spb.su/
* Distributed under GNU Public License.
*/
package wikipedia.kleinberg;
import wikipedia.sql.Links;
import wikipedia.sql.PageNamespace;
import java.util.*;
abstract class Node {
/** id of the article or the category (from the table page) */
public int page_id;
/** title of the article or category */
public String page_title;
/** title of one of the interwiki of the article or category, e.g. "En:Something" or "Ru:Нечто" */
public String iwiki_title;
/** Articles: id of articles which refer to the article.
* Categories: id of categories which refer to the category */
//public ArrayList<Integer> links_in;
public int[] links_in;
/** Articles: id of articles which are referred by the article.
* Categories: id of categories which are referred by the category */
//public ArrayList<Integer> links_out;
public int[] links_out;
abstract String GraphVizNode();
abstract String GraphVizLinksOut();
public void init() {
}
public int GetLinksInLength() {
if(null == links_in)
return 0;
return links_in.length;
}
public int GetLinksOutLength() {
if(null == links_out)
return 0;
return links_out.length;
}
/** Returns true, if the array contain node with the title. */
public static boolean ContainTitle(Node[] nodes,String title) {
for(Node n : nodes) {
if(null != n && 0 == title.compareTo(n.page_title)) {
return true;
}
}
return false;
}
/** Returns true, if the array contain node with the id. */
public static boolean ContainID(Node[] nodes,int id) {
for(Node n : nodes) {
if(null != n && id == n.page_id) {
return true;
}
}
return false;
}
/** Returns array of titles. Returns null for empty nodes.*/
public static String[] getTitles(Node[] nodes) {
if(null == nodes || 0 == nodes.length) {
return null;
}
String[] s = new String[nodes.length];
for(int i=0; i<nodes.length; i++) {
s[i] = nodes[i].page_title;
}
return s;
}
/** Creates the map from node titles to the node IDs */
public static <T> Map<String, Integer> createMapFromTitleToID(Map<Integer, T> nodes) {
Map<String, Integer> m = new HashMap<String, Integer>();
for(T t:nodes.values()) {
Node n = (Node)t;
m.put(n.page_title, n.page_id);
}
return m;
}
public String getTitleAndIWiki() {
if(null == iwiki_title || 0 == iwiki_title.length()) {
return page_title;
}
return page_title + ":" + iwiki_title;
}
/** Fills inter wiki title (->iwiki_title) for the specified foreign language.
*
* @params lang Two letters identifier, e.g. "En", "Ru", etc.
* @param namespace only pages with this namespace will be selected, value
* defined in PageTable.NS_MAIN, etc.
*
* Todo: to optimize Links.GetTitleToByIDFrom(), to submit array of id[]
* instead of one id (now) and get arrays of Nodes with filled ->iwiki
*/
public void fillInterWikiTitle (SessionHolder session,String lang,PageNamespace namespace) {
if(0 == page_id)
return;
int[] id_from = new int[1];
id_from[0] = page_id;
String[] ss = Links.getTitleToByIDFrom(session, id_from, namespace);
for(String s:ss) {
if(s.length() > 3 &&
s.charAt(0) == lang.charAt(0) &&
s.charAt(1) == lang.charAt(1) &&
s.charAt(2) == 58)
{
iwiki_title = s;
break;
}
}
}
}