/*
 * Copyright (C) 2003-2007 eXo Platform SAS.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation; either version 3
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see<http://www.gnu.org/licenses/>.
 */
package org.exoplatform.ecm.jcr;

import java.util.Comparator;
import java.util.StringTokenizer;

import javax.jcr.Node;

import org.exoplatform.ecm.jcr.model.Preference;
import org.exoplatform.ecm.webui.utils.Utils;

public class TypeNodeComparator implements Comparator<javax.jcr.Node> {

  private String order_;

  public TypeNodeComparator(String pOrder) {
    order_ = pOrder ;
  }

  public int compareOld(Object o1, Object o2) throws ClassCastException {
    StringTokenizer key1 = new StringTokenizer((String) o1, "//") ;
    StringTokenizer key2 = new StringTokenizer((String) o2, "//") ;
    String type1 = key1.nextToken() ;
    String type2 = key2.nextToken() ;
    int res = 0 ;
    if ("folder".equals(type1) && "folder".equals(type2)) {
      // mime type
      key1.nextToken() ;
      key2.nextToken() ;
      // sort by name
      res = key1.nextToken().compareToIgnoreCase(key2.nextToken());
      if(Preference.ASCENDING_ORDER.equals(order_)) return res ;
      return -res ;
    } else if ("file".equals(type1) && "file".equals(type2)) {
      String mimeType1 = key1.nextToken() ;
      String mimeType2 = key2.nextToken() ;
      // sort by mime type
      res = mimeType1.compareToIgnoreCase(mimeType2) ;
      if (res == 0) return key1.nextToken().compareToIgnoreCase(key2.nextToken()) ;
      // same mime type -> sort by name
      else if(Preference.ASCENDING_ORDER.equals(order_)) return res ;
      else return -res ;
    } else {
      if(Preference.ASCENDING_ORDER.equals(order_)) res = 1 ;
      else res = -1 ;
      // folder before file in ascending order
      if ("folder".equals(type1)) return -res ;
      return res ;
    }
  }

  public int compare(Node node1, Node node2) {
    try{
      String nodeType1 = node1.getPrimaryNodeType().getName();
      String nodeType2 = node2.getPrimaryNodeType().getName();
      if("nt:file".equals(nodeType1) && "nt:file".equals(nodeType2)) {
        String mimeType1 = node1.getNode(Utils.JCR_CONTENT).getProperty(Utils.JCR_MIMETYPE).getString();
        String mimeType2 = node2.getNode(Utils.JCR_CONTENT).getProperty(Utils.JCR_MIMETYPE).getString();
        if(Preference.ASCENDING_ORDER.equals(order_)) {
          return mimeType1.compareToIgnoreCase(mimeType2);
        }
        return mimeType2.compareToIgnoreCase(mimeType1);
      }
      if(Preference.ASCENDING_ORDER.equals(order_)) {
        return nodeType1.compareToIgnoreCase(nodeType2) ;
      }
      return nodeType2.compareToIgnoreCase(nodeType1) ;
    }catch (Exception e) {
      return 0;
    }
  }
}
