KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sleepycat > persist > impl > PersistComparator


1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 2002,2006 Oracle. All rights reserved.
5  *
6  * $Id: PersistComparator.java,v 1.8 2006/10/30 21:14:32 bostic Exp $
7  */

8
9 package com.sleepycat.persist.impl;
10
11 import java.io.Serializable JavaDoc;
12 import java.util.Comparator JavaDoc;
13 import java.util.List JavaDoc;
14
15 import com.sleepycat.persist.model.FieldMetadata;
16
17 /**
18  * The btree comparator for persistent key classes. The serialized form of
19  * this comparator is stored in the BDB JE database descriptor so that the
20  * comparator can be re-created during recovery.
21  *
22  * @author Mark Hayes
23  */

24 public class PersistComparator implements Comparator JavaDoc<Object JavaDoc>, Serializable JavaDoc {
25
26     private static final long serialVersionUID = 5221576538843355317L;
27
28     private String JavaDoc keyClassName;
29     private String JavaDoc[] comositeFieldOrder;
30     private transient PersistKeyBinding binding;
31
32     public PersistComparator(String JavaDoc keyClassName,
33                              List JavaDoc<FieldMetadata> compositeKeyFields,
34                              PersistKeyBinding binding) {
35         this.keyClassName = keyClassName;
36         this.binding = binding;
37
38         if (compositeKeyFields != null) {
39             comositeFieldOrder =
40                 CompositeKeyFormat.getFieldNameArray(compositeKeyFields);
41         }
42     }
43
44     public int compare(Object JavaDoc o1, Object JavaDoc o2) {
45
46         /*
47          * The binding will be null after the comparator is deserialized, i.e.,
48          * during BDB JE recovery. We must construct it here, without access
49          * to the stored catalog since recovery is not complete.
50          */

51         if (binding == null) {
52             Class JavaDoc keyClass;
53             try {
54                 keyClass = SimpleCatalog.classForName(keyClassName);
55             } catch (ClassNotFoundException JavaDoc e) {
56                 throw new IllegalStateException JavaDoc(e);
57             }
58             binding = new PersistKeyBinding(keyClass, comositeFieldOrder);
59         }
60
61         byte[] b1 = (byte[]) o1;
62         byte[] b2 = (byte[]) o2;
63
64         Comparable JavaDoc k1 = (Comparable JavaDoc) binding.bytesToObject(b1, 0, b1.length);
65         Comparable JavaDoc k2 = (Comparable JavaDoc) binding.bytesToObject(b2, 0, b2.length);
66
67         return k1.compareTo(k2);
68     }
69 }
70
Popular Tags