/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. * * This program and the accompanying materials are made available under * the terms of the Common Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/cpl-v10.html * * $Id: ItemComparator.java,v 1.1.1.1 2004/05/09 16:57:37 vlad_r Exp $ */ package com.vladium.emma.report; import java.util.Comparator; // ---------------------------------------------------------------------------- /** * @author Vlad Roubtsov, (C) 2003 */ public interface ItemComparator extends Comparator { // public: ................................................................ ItemComparator NULL_COMPARATOR = new Factory.NullComparator (); abstract class Factory { public static ItemComparator create (final int [] attributeIDsWithDir, final int unitsID) { if (attributeIDsWithDir == null) throw new IllegalArgumentException ("null input: attributeIDsWithDir"); if (attributeIDsWithDir.length == 0) return NULL_COMPARATOR; // TODO: validate against duplicates // TODO: memoize // TODO: move the code below into the attr factory final Comparator [] comparators = new Comparator [attributeIDsWithDir.length >> 1]; for (int a = 0; a < attributeIDsWithDir.length; a += 2) { final int attributeID = attributeIDsWithDir [a]; final Comparator comparator = IItemAttribute.Factory.getAttribute (attributeID, unitsID).comparator (); comparators [a >> 1] = attributeIDsWithDir [a + 1] < 0 ? new ReverseComparator (comparator) : comparator; } return new CompositeComparator (comparators); } private static final class NullComparator implements ItemComparator { public int compare (final Object l, final Object g) { return 0; } } // end of nested class private static final class ReverseComparator implements ItemComparator { public int compare (final Object l, final Object g) { return m_comparator.compare (g, l); } ReverseComparator (final Comparator comparator) { m_comparator = comparator; } private final Comparator m_comparator; } // end of nested class private static final class CompositeComparator implements ItemComparator { public int compare (final Object l, final Object g) { // TODO: this needs to check whether both items have a given attr type for (int c = 0; c < m_comparators.length; ++ c) { final int diff = m_comparators [c].compare (l, g); if (diff != 0) return diff; } return 0; } CompositeComparator (final Comparator [] comparators) { m_comparators = comparators; } private final Comparator [] m_comparators; } // end of nested class } // end of nested interface } // end of interface // ----------------------------------------------------------------------------