/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.deployment.scanner;
import org.jboss.deployment.DefaultDeploymentSorter;
import java.util.Comparator;
import java.net.URL;
/**
* This is simialr to the PrefixDeploymentSorter in that it will order
* files that do not start with a numeric value before those that do.
* If two files begin with a number, will compare the numeric values.
* However, if the two files do not have numeric prefixes, will
* compare them using compareToIgnoreCase.
*
* @author <a href="mailto:tom@jboss.org">Tom Elrod</a>
*/
public class AlphaNumericDeploymentSorter implements Comparator, DefaultDeploymentSorter
{
private PrefixDeploymentSorter sorter = new PrefixDeploymentSorter();
public String[] getSuffixOrder()
{
return sorter.getSuffixOrder();
}
public void setSuffixOrder(String[] suffixOrder)
{
sorter.setSuffixOrder(suffixOrder);
}
public int compare(Object o1, Object o2)
{
int comp = sorter.compare(o1, o2);
return comp == 0 ? alphaCompare(o1, o2) : comp;
}
private String convertURLToString(URL url)
{
String path = url.getPath();
int nameEnd = path.length() - 1;
if (nameEnd <= 0) {
return "";
}
// ignore a trailing '/'
if (path.charAt(nameEnd) == '/') {
nameEnd--;
}
// find the previous URL separator: '/'
int nameStart = path.lastIndexOf('/', nameEnd) + 1;
return path.substring(nameStart);
}
public int alphaCompare(Object o1, Object o2)
{
String s1 = convertURLToString((URL)o1);
boolean s1IsDigit = Character.isDigit(s1.charAt(0));
String s2 = convertURLToString((URL)o2);
boolean s2IsDigit = Character.isDigit(s2.charAt(0));
if(s1IsDigit && !s2IsDigit)
{
return 1; // o1 is greater than o2, since has number and o2 does not
}
else if(!s1IsDigit && s2IsDigit)
{
return -1; //o1 is less than o2, since does not have number and o2 does
}
if(s1IsDigit && s2IsDigit) // numeric comapre
{
int num1 = getNumericPrefix(s1);
int num2 = getNumericPrefix(s2);
int diff = num1 - num2;
if(diff != 0) // do not begin with same number
{
return diff;
}
else //numbers are the same, so have to compare rest of the string
{
String s1Suf = getAlphaSuffix(s1);
String s2Sef = getAlphaSuffix(s2);
return s1Suf.compareToIgnoreCase(s2Sef);
}
}
else // alpha compare
{
return s1.compareToIgnoreCase(s2);
}
}
private String getAlphaSuffix(String s1)
{
int x = 0;
while(Character.isDigit(s1.charAt(x++)));
return s1.substring(x);
}
private int getNumericPrefix(String s1)
{
int x = 0;
String numS1 = null;
while(Character.isDigit(s1.charAt(x++)))
{
numS1 = s1.substring(0, x);
}
int number = Integer.parseInt(numS1);
return number;
}
}