• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2  *
3  * This program and the accompanying materials are made available under
4  * the terms of the Common Public License v1.0 which accompanies this distribution,
5  * and is available at http://www.eclipse.org/legal/cpl-v10.html
6  *
7  * $Id: ItemComparator.java,v 1.1.1.1 2004/05/09 16:57:37 vlad_r Exp $
8  */
9 package com.vladium.emma.report;
10 
11 import java.util.Comparator;
12 
13 // ----------------------------------------------------------------------------
14 /**
15  * @author Vlad Roubtsov, (C) 2003
16  */
17 public
18 interface ItemComparator extends Comparator
19 {
20     // public: ................................................................
21 
22 
23     ItemComparator NULL_COMPARATOR = new Factory.NullComparator ();
24 
25 
26     abstract class Factory
27     {
create(final int [] attributeIDsWithDir, final int unitsID)28         public static ItemComparator create (final int [] attributeIDsWithDir, final int unitsID)
29         {
30             if (attributeIDsWithDir == null)
31                 throw new IllegalArgumentException ("null input: attributeIDsWithDir");
32 
33             if (attributeIDsWithDir.length == 0)
34                 return NULL_COMPARATOR;
35 
36             // TODO: validate against duplicates
37             // TODO: memoize
38 
39             // TODO: move the code below into the attr factory
40             final Comparator [] comparators = new Comparator [attributeIDsWithDir.length >> 1];
41             for (int a = 0; a < attributeIDsWithDir.length; a += 2)
42             {
43                 final int attributeID = attributeIDsWithDir [a];
44 
45                 final Comparator comparator = IItemAttribute.Factory.getAttribute (attributeID, unitsID).comparator ();
46                 comparators [a >> 1] = attributeIDsWithDir [a + 1] < 0 ? new ReverseComparator (comparator) : comparator;
47             }
48 
49             return new CompositeComparator (comparators);
50         }
51 
52         private static final class NullComparator implements ItemComparator
53         {
54             public int compare (final Object l, final Object g)
55             {
56                 return 0;
57             }
58 
59         } // end of nested class
60 
61 
62         private static final class ReverseComparator implements ItemComparator
63         {
64             public int compare (final Object l, final Object g)
65             {
66                 return m_comparator.compare (g, l);
67             }
68 
69 
70             ReverseComparator (final Comparator comparator)
71             {
72                 m_comparator = comparator;
73             }
74 
75 
76             private final Comparator m_comparator;
77 
78         } // end of nested class
79 
80 
81         private static final class CompositeComparator implements ItemComparator
82         {
83             public int compare (final Object l, final Object g)
84             {
85                 // TODO: this needs to check whether both items have a given attr type
86 
87                 for (int c = 0; c < m_comparators.length; ++ c)
88                 {
89                     final int diff = m_comparators [c].compare (l, g);
90                     if (diff != 0) return diff;
91                 }
92 
93                 return 0;
94             }
95 
96 
97             CompositeComparator (final Comparator [] comparators)
98             {
99                 m_comparators = comparators;
100             }
101 
102 
103             private final Comparator [] m_comparators;
104 
105         } // end of nested class
106 
107     } // end of nested interface
108 
109 } // end of interface
110 // ----------------------------------------------------------------------------