/* * 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; } } }