/*******************************************************************************
* Copyright (c) 2013 hangum.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* hangum - initial API and implementation
******************************************************************************/
package com.hangum.tadpole.engine.sql.util.tables;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.StringTokenizer;
import org.apache.log4j.Logger;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import com.hangum.tadpole.commons.libs.core.utils.BasicViewerSorter;
public abstract class DefaultViewerSorter extends BasicViewerSorter {
private static final Logger logger = Logger.getLogger(DefaultViewerSorter.class);
public enum COLUMN_TYPE { Date, String, Long, Double, IP };
protected int getPrefix(Viewer viewer) {
int prefix = 1;
int sortDir = ((TableViewer)viewer).getTable().getSortDirection();
if (sortDir == SWT.DOWN) {
prefix = -1;
}
return prefix;
}
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
TableViewer tableViewer = (TableViewer)viewer;
ITableLabelProvider tlprov = (ITableLabelProvider)tableViewer.getLabelProvider();
String name1 = tlprov.getColumnText(e1, propertyIndex);
String name2 = tlprov.getColumnText(e2, propertyIndex);
int prefix = getPrefix(viewer);
if ( isEmpty(name1) ) {
if ( isEmpty(name2) ) {
return 0;
} else {
return prefix;
}
} else {
if ( isEmpty(name2) ) {
return prefix*-1;
} else {
COLUMN_TYPE type = getColumnType(propertyIndex);
switch(type) {
case Date :
try {
Date date1 = dateToStr(name1);
Date date2 = dateToStr(name2);
Long long1 = date1.getTime();
Long long2 = date2.getTime();
return prefix * long1.compareTo(long2);
} catch(Exception e) {
logger.error("Date column sort", e);
}
case String :
return prefix * name1.compareTo(name2);
case Long :
try {
Long long1 = Long.parseLong(name1);
Long long2 = Long.parseLong(name2);
return prefix * long1.compareTo(long2);
} catch(NumberFormatException nfe) {
logger.error("", nfe);
}
break;
case Double :
try {
Double double1 = Double.parseDouble(name1);
Double double2 = Double.parseDouble(name2);
return prefix * double1.compareTo(double2);
} catch(NumberFormatException nfe) {
logger.error("", nfe);
}
break;
case IP :
if ( "".equals(name1) || "".equals(name2) ) {
System.out.println();
}
StringTokenizer st1 = new StringTokenizer(name1, ".");
StringTokenizer st2 = new StringTokenizer(name2, ".");
String s1,s2;
while( st1.hasMoreTokens() && st2.hasMoreTokens() ) {
int a = -1;
int b = -1;
s1 = st1.nextToken();
s2 = st2.nextToken();
try { a = Integer.parseInt(s1); } catch(Exception e){};
try { b = Integer.parseInt(s2); } catch(Exception e){};
if ( a != -1 && b != -1 ) { //integer both
if ( a == b ) continue;
return prefix*(a - b);
} else if ( a == -1 && b == -1 ) { //not-integer both
int comp = s1.compareTo(s2);
if ( comp == 0 ) continue;
if ( "*".equals(s1) ) {
return prefix*1;
} else if ( "*".equals(s2) ) {
return prefix*(-1);
} else {
return prefix*comp;
}
} else {
return prefix*(-1)*a;
}
}
return 0;
}
}
}
return prefix;
}
private boolean isEmpty(String value) {
return value == null || "".equals(value);
}
abstract public COLUMN_TYPE getColumnType(int propertyIndex);
/**
* date converter
*
* @param date
* @return
*/
private Date dateToStr(String str) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.parse(str);
}
}