/* * WPCleaner: A tool to help on Wikipedia maintenance tasks. * Copyright (C) 2013 Nicolas Vervelle * * See README.txt file for licensing information. */ package org.wikipediacleaner.api.data; import java.io.Externalizable; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.LinkedList; import java.util.List; import org.wikipediacleaner.i18n.GT; /** * A comparator for pages. */ public abstract class PageComparator implements NamedComparator<Page>, Externalizable { private final static PageComparator namespaceComparator = new NamespaceComparator(); private final static PageComparator pageIdComparator = new PageIdComparator(); private final static PageComparator redirectComparator = new RedirectComparator(); private final static PageComparator revisionIdComparator = new RevisionIdComparator(); private final static PageComparator templateComparator = new TemplateComparator(); private final static PageComparator titleComparator = new TitleComparator(); private static List<CompositeComparator<Page>> comparators; /** * @return Page comparator with template first (Default for disambiguation window). */ public static CompositeComparator<Page> getTemplateFirstComparator() { List<NamedComparator<Page>> unitComparators = new LinkedList<NamedComparator<Page>>(); unitComparators.add(templateComparator); unitComparators.add(redirectComparator); unitComparators.add(namespaceComparator); unitComparators.add(titleComparator); unitComparators.add(revisionIdComparator); unitComparators.add(pageIdComparator); CompositeComparator<Page> comparator = new CompositeComparator<Page>( "Template first", unitComparators); return comparator; } /** * @return Page comparator with revision first. */ public static CompositeComparator<Page> getRevisionIdFirstComparator() { List<NamedComparator<Page>> unitComparators = new LinkedList<NamedComparator<Page>>(); unitComparators.add(revisionIdComparator); unitComparators.add(templateComparator); unitComparators.add(redirectComparator); unitComparators.add(namespaceComparator); unitComparators.add(titleComparator); unitComparators.add(pageIdComparator); CompositeComparator<Page> comparator = new CompositeComparator<Page>( "Revision Id first", unitComparators); return comparator; } /** * @return Page comparator with namespace first (Default for analysis window). */ public static CompositeComparator<Page> getNamespaceFirstComparator() { List<NamedComparator<Page>> unitComparators = new LinkedList<NamedComparator<Page>>(); unitComparators.add(namespaceComparator); unitComparators.add(titleComparator); unitComparators.add(revisionIdComparator); unitComparators.add(pageIdComparator); unitComparators.add(templateComparator); unitComparators.add(redirectComparator); CompositeComparator<Page> comparator = new CompositeComparator<Page>( "Namespace first", unitComparators); return comparator; } /** * @return Page comparator with title first. */ public static CompositeComparator<Page> getTitleFirstComparator() { List<NamedComparator<Page>> unitComparators = new LinkedList<NamedComparator<Page>>(); unitComparators.add(titleComparator); unitComparators.add(revisionIdComparator); unitComparators.add(pageIdComparator); unitComparators.add(namespaceComparator); unitComparators.add(templateComparator); unitComparators.add(redirectComparator); CompositeComparator<Page> comparator = new CompositeComparator<Page>( "Title first", unitComparators); return comparator; } /** * @param name Comparator name. * @return Comparator initialized with default order. */ public static CompositeComparator<Page> createComparator(String name) { List<NamedComparator<Page>> unitComparators = new LinkedList<NamedComparator<Page>>(); unitComparators.add(namespaceComparator); unitComparators.add(titleComparator); unitComparators.add(revisionIdComparator); unitComparators.add(pageIdComparator); unitComparators.add(templateComparator); unitComparators.add(redirectComparator); CompositeComparator<Page> comparator = new CompositeComparator<Page>( name, unitComparators); return comparator; } /** * @return List of default comparators. */ public static List<CompositeComparator<Page>> getDefaultComparators() { List<CompositeComparator<Page>> defComparators = new LinkedList<CompositeComparator<Page>>(); defComparators.add(getNamespaceFirstComparator()); defComparators.add(getTemplateFirstComparator()); defComparators.add(getRevisionIdFirstComparator()); return defComparators; } /** * @return List of available comparators. */ public static List<CompositeComparator<Page>> getComparators() { if (comparators != null) { return comparators; } comparators = getDefaultComparators(); return comparators; } /** * @param comps List of comparators. */ public static void setComparators(List<CompositeComparator<Page>> comps) { comparators = comps; } /* (non-Javadoc) * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput) */ @Override public void writeExternal(@SuppressWarnings("unused") ObjectOutput output) { // } /* (non-Javadoc) * @see java.io.Externalizable#readExternal(java.io.ObjectInput) */ @Override public void readExternal(@SuppressWarnings("unused") ObjectInput input) { // } /** * A comparator for Namespace. */ static class NamespaceComparator extends PageComparator { /** * Restricted to Externalisation. */ public NamespaceComparator() { // } /* (non-Javadoc) * @see org.wikipediacleaner.api.data.NamedComparator#getName() */ @Override public String getName() { return "Namespace"; } /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ @Override public int compare(Page o1, Page o2) { if (o1.getNamespace() == null) { if (o2.getNamespace() == null) { return 0; } return 1; } if (o2.getNamespace() == null) { return -1; } return o1.getNamespace().compareTo(o2.getNamespace()); } @Override public String toString() { return GT._("Namespace"); } } /** * A comparator for Title. */ static class TitleComparator extends PageComparator { /** * Restricted to Externalisation. */ public TitleComparator() { // } /* (non-Javadoc) * @see org.wikipediacleaner.api.data.NamedComparator#getName() */ @Override public String getName() { return "Title"; } /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ @Override public int compare(Page o1, Page o2) { if (o1.getTitle() == null) { if (o2.getTitle() == null) { return 0; } return 1; } if (o2.getTitle() == null) { return -1; } return o1.getTitle().compareTo(o2.getTitle()); } @Override public String toString() { return GT._("Title"); } } /** * A comparator for RevisionId. */ static class RevisionIdComparator extends PageComparator { /** * Restricted to Externalisation. */ public RevisionIdComparator() { // } /* (non-Javadoc) * @see org.wikipediacleaner.api.data.NamedComparator#getName() */ @Override public String getName() { return "RevisionId"; } /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ @Override public int compare(Page o1, Page o2) { if (o1.getRevisionId() == null) { if (o2.getRevisionId() == null) { return 0; } return 1; } if (o2.getRevisionId() == null) { return -1; } return o2.getRevisionId().compareTo(o1.getRevisionId()); } @Override public String toString() { return GT._("Revision Id"); } } /** * A comparator for PageId. */ static class PageIdComparator extends PageComparator { /** * Restricted to Externalisation. */ public PageIdComparator() { // } /* (non-Javadoc) * @see org.wikipediacleaner.api.data.NamedComparator#getName() */ @Override public String getName() { return "PageId"; } /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ @Override public int compare(Page o1, Page o2) { if (o1.getPageId() == null) { if (o2.getPageId() == null) { return 0; } return 1; } if (o2.getPageId() == null) { return -1; } return o1.getPageId().compareTo(o2.getPageId()); } @Override public String toString() { return GT._("Page Id"); } } /** * A comparator for Templates. */ static class TemplateComparator extends PageComparator { /** * Restricted to Externalisation. */ public TemplateComparator() { // } /* (non-Javadoc) * @see org.wikipediacleaner.api.data.NamedComparator#getName() */ @Override public String getName() { return "Template"; } /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ @Override public int compare(Page o1, Page o2) { if (o1.getNamespace() == null) { if (o2.getNamespace() == null) { return 0; } return 1; } if (o2.getNamespace() == null) { return -1; } if (o1.getNamespace().intValue() == Namespace.TEMPLATE) { if (o2.getNamespace().intValue() == Namespace.TEMPLATE) { return 0; } return -1; } if (o2.getNamespace().intValue() == Namespace.TEMPLATE) { return 1; } return 0; } @Override public String toString() { return GT._("Template"); } } /** * A comparator for Redirects. */ static class RedirectComparator extends PageComparator { /** * Restricted to Externalisation. */ public RedirectComparator() { // } /* (non-Javadoc) * @see org.wikipediacleaner.api.data.NamedComparator#getName() */ @Override public String getName() { return "Redirect"; } /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ @Override public int compare(Page o1, Page o2) { if (o1.isRedirect() == o2.isRedirect()) { return 0; } if (o1.isRedirect()) { return -1; } return 1; } @Override public String toString() { return GT._("Redirect"); } } }