package org.wikibrain.core.model; import com.google.common.collect.Sets; import org.wikibrain.core.lang.Language; import org.wikibrain.core.lang.LanguageInfo; import org.wikibrain.core.lang.LocalId; import java.util.Set; /** */ public class LocalPage { protected final Language language; protected final int localId; protected final Title title; protected final NameSpace nameSpace; protected final boolean isRedirect; protected final boolean isDisambig; /** * Creates a new page in the main namespace that is NOT a redirect or disambig. * @param language * @param localId * @param title */ public LocalPage(Language language, int localId, String title) { this(language, localId, new Title(title, language), NameSpace.ARTICLE); } /** * Default for NON-redirect pages. * @param language * @param localId * @param title * @param nameSpace */ public LocalPage(Language language, int localId, Title title, NameSpace nameSpace){ this.language = language; this.localId = localId; this.title = title; this.nameSpace = nameSpace; isRedirect = false; isDisambig = false; } /** * Ability to set redirect pages. * @param language * @param localId * @param title * @param nameSpace * @param redirect */ public LocalPage(Language language, int localId, Title title, NameSpace nameSpace, boolean redirect, boolean disambig) { this.language = language; this.localId = localId; this.title = title; this.nameSpace = nameSpace; isRedirect = redirect; isDisambig = disambig; } public int getLocalId() { return localId; } public Title getTitle() { return title; } public Language getLanguage() { return language; } public NameSpace getNameSpace() { return nameSpace; } public boolean isDisambig() { return isDisambig; } public boolean isRedirect() { return isRedirect; } public int hashCode(){ return (language.getId() + "_" + localId).hashCode(); //non-optimal } public LocalId toLocalId() { return new LocalId(language, localId); } public boolean equals(Object o){ if (o instanceof LocalPage){ LocalPage input = (LocalPage)o; return (input.getLanguage().equals(this.getLanguage()) && input.getLocalId() == this.getLocalId() ); } else { return false; } } /** * @return, for example "/w/en/1000/Hercule_Poirot" */ public String getCompactUrl() { String escapedTitle = getTitle().getCanonicalTitle().replace(" ", "_"); escapedTitle = escapedTitle.replaceAll("\\s+", ""); return "/w/" + getLanguage().getLangCode() + "/" + getLocalId() + "/" + escapedTitle; } @Override public String toString() { return "LocalPage{" + "nameSpace=" + nameSpace + ", title=" + title + ", localId=" + localId + ", language=" + language + '}'; } /** * Returns a set of local ids from a collection of local pages * @param localPages * @return */ public static Set<LocalId> toLocalIds(Iterable<LocalPage> localPages){ Set<LocalId> rVal = Sets.newHashSet(); for (LocalPage localPage : localPages){ rVal.add(localPage.toLocalId()); } return rVal; } /** * Converts a compact url representation of a page to a LocalPage. * @param s * @return The local page, or null if the string was not a url. */ public static LocalPage fromCompactUrl(String s) { String parts[] = s.split("/", 5); if (s.startsWith("/w/") && parts.length == 5 && Language.hasLangCode(parts[2])) { return new LocalPage( Language.getByLangCode(parts[2]), Integer.valueOf(parts[3]), parts[4] ); } else { return null; } } /** * Determines whether a Url is a compact representation of a title. * For example, "/w/en/1000/Hercule_Poirot" * @param s * @return */ public static boolean isCompactUrl(String s) { if (!s.startsWith("/w/")) { return false; } else { String parts[] = s.split("/"); return parts.length >= 5 && Language.hasLangCode(parts[2]); } } }