blob: 64d69d68c3f8cbcb1f4073ec13d01f97b4511743 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 Eugene Kuleshov and others.
* 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
*
* Contributors:
* Eugene Kuleshov - initial API and implementation for bug 129511
* Tasktop Technologies - improvements
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.ui.views;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Eugene Kuleshov
*/
public class TaskKeyComparator implements Comparator<String[]> {
private static final String MODULE_TASK_PATTERN = "(?:([A-Za-z]*[:_\\-]?)(\\d+))?"; //$NON-NLS-1$
private static final Pattern ID_PATTERN = Pattern.compile(MODULE_TASK_PATTERN);
public static final Pattern PATTERN = Pattern.compile(MODULE_TASK_PATTERN + "(.*)"); //$NON-NLS-1$
public int compare2(String o1, String o2) {
String[] a1 = split(o1);
String[] a2 = split(o2);
return compare(a1, a2);
}
public int compare(String a1[], String a2[]) {
if (a1[0] == null && a1[1] == null) {
a1 = split(a1[2]);
} else if ((a1[0] == null || a1[0].length() == 0) && a1[1] != null && a1[1].length() > 0) {
String b1[] = splitTask(a1[1]);
a1[0] = b1[0];
a1[1] = b1[1];
}
if (a2[0] == null && a2[1] == null) {
a2 = split(a2[2]);
} else if ((a2[0] == null || a2[0].length() == 0) && a2[1] != null && a2[1].length() > 0) {
String b2[] = splitTask(a2[1]);
a2[0] = b2[0];
a2[1] = b2[1];
}
return compare(a1[0], a1[1], a1[2], a2[0], a2[1], a2[2]);
}
private static int compare(final String component1, final String key1, final String value1,
final String component2, final String key2, final String value2) {
if (component1 == null && component2 != null) {
return -1;
}
if (component1 != null && component2 == null) {
return 1;
}
if (component1 != null && component2 != null) {
int n = component1.compareToIgnoreCase(component2);
if (n != 0) {
return n;
}
if (key1 == null && key2 != null) {
return -1;
}
if (key1 != null && key2 == null) {
return 1;
}
if (key1 != null && key2 != null) {
if (key1.length() == key2.length() || key1.length() == 0 || key2.length() == 0) {
n = key1.compareTo(key2);
} else {
n = Integer.valueOf(key1).compareTo(Integer.valueOf(key2));
}
if (n != 0) {
return n;
}
}
}
return value1.compareToIgnoreCase(value2);
}
public String[] split(String s) {
Matcher matcher = PATTERN.matcher(s);
if (!matcher.find()) {
return new String[] { null, null, s };
}
int n = matcher.groupCount();
String[] res = new String[n];
for (int i = 1; i < n + 1; i++) {
res[i - 1] = matcher.group(i);
}
return res;
}
private static String[] splitTask(final String s) {
Matcher matcher = ID_PATTERN.matcher(s);
if (!matcher.find()) {
return new String[] { null, s };
}
int n = matcher.groupCount();
String[] res = new String[n];
for (int i = 1; i < n + 1; i++) {
res[i - 1] = matcher.group(i);
}
return res;
}
}