KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jahia > content > comparators > ObjectTypeDispatcherComparator


1 package org.jahia.content.comparators;
2
3 import java.util.Comparator JavaDoc;
4 import org.jahia.content.JahiaObject;
5 import java.util.Map JavaDoc;
6 import java.util.HashMap JavaDoc;
7
8 /**
9  * <p>Title: A comparator that uses the JahiaObject's type to dispatch
10  * to a sub comparator. This allows our comparators to avoid type-specific
11  * hardcoded logic. </p>
12  * <p>Description: The type is exctracted from the object key of the
13  * JahiaObject we give to compare. Note that in the case of a comparison
14  * between different types of JahiaObject descendants, the objects will be
15  * tested for a compliance to the Comparable interface and compared that
16  * way. If they do not implement that interface, the objects will be
17  * converted to String using their toString() method and comparing the
18  * resulting String objects.</p>
19  * <p>Copyright: Copyright (c) 2002</p>
20  * <p>Company: Jahia Ltd</p>
21  * @author Serge Huber
22  * @version 1.0
23  */

24
25 public class ObjectTypeDispatcherComparator implements Comparator JavaDoc {
26
27     private static org.apache.log4j.Logger logger =
28         org.apache.log4j.Logger.getLogger(ObjectTypeDispatcherComparator.class);
29
30     private Map JavaDoc typeComparators = new HashMap JavaDoc();
31
32     public ObjectTypeDispatcherComparator() {
33     }
34
35     public void addTypeComparator(String JavaDoc typeName, Comparator JavaDoc typeComparator) {
36         typeComparators.put(typeName, typeComparator);
37     }
38
39     public int compare(Object JavaDoc o1, Object JavaDoc o2) {
40         if ( (o1 instanceof JahiaObject) && (o2 instanceof JahiaObject)) {
41             JahiaObject leftJahiaObject = (JahiaObject) o1;
42             JahiaObject rightJahiaObject = (JahiaObject) o2;
43             if (!leftJahiaObject.getObjectKey().getType().equals(rightJahiaObject.getObjectKey().getType())) {
44                 return leftJahiaObject.getObjectKey().compareTo(rightJahiaObject.getObjectKey());
45             }
46             // object key types are equals if we got this far, we must now
47
// dispatch to a type-specific comparator.
48
Comparator JavaDoc typeComparator = (Comparator JavaDoc) typeComparators.get(leftJahiaObject.getObjectKey().getType());
49             return typeComparator.compare(o1, o2);
50         } else {
51             // these comparators should only be used with subclasses of JahiaObject,
52
// never with anything else
53
if ((o1 instanceof Comparable JavaDoc) && (o2 instanceof Comparable JavaDoc)) {
54                 Comparable JavaDoc leftComparable = (Comparable JavaDoc) o1;
55                 Comparable JavaDoc rightComparable = (Comparable JavaDoc) o2;
56                 return leftComparable.compareTo(rightComparable);
57             } else {
58                 return o1.toString().compareTo(o2.toString());
59             }
60         }
61     }
62
63     public boolean equals(Object JavaDoc obj) {
64         if (obj instanceof ObjectTypeDispatcherComparator) {
65             ObjectTypeDispatcherComparator otherComparator = (
66                 ObjectTypeDispatcherComparator) obj;
67             return otherComparator.typeComparators.equals(typeComparators);
68         } else {
69             return false;
70         }
71     }
72
73 }
Popular Tags