001 /* 002 * CDDL HEADER START 003 * 004 * The contents of this file are subject to the terms of the 005 * Common Development and Distribution License, Version 1.0 only 006 * (the "License"). You may not use this file except in compliance 007 * with the License. 008 * 009 * You can obtain a copy of the license at 010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE 011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE. 012 * See the License for the specific language governing permissions 013 * and limitations under the License. 014 * 015 * When distributing Covered Code, include this CDDL HEADER in each 016 * file and include the License file at 017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, 018 * add the following below this CDDL HEADER, with the fields enclosed 019 * by brackets "[]" replaced with your own identifying information: 020 * Portions Copyright [yyyy] [name of copyright owner] 021 * 022 * CDDL HEADER END 023 * 024 * 025 * Copyright 2006-2008 Sun Microsystems, Inc. 026 */ 027 package org.opends.server.replication.plugin; 028 029 import org.opends.server.admin.std.server.OrderingMatchingRuleCfg; 030 import org.opends.server.api.OrderingMatchingRule; 031 import org.opends.server.protocols.asn1.ASN1OctetString; 032 import org.opends.server.types.ByteString; 033 034 /** 035 * Used to establish an order between historical information and index them. 036 */ 037 public class HistoricalCsnOrderingMatchingRule 038 extends OrderingMatchingRule 039 { 040 /** 041 * The serial version identifier required to satisfy the compiler because this 042 * class implements the <CODE>java.io.Serializable</CODE> interface. This 043 * value was generated using the <CODE>serialver</CODE> command-line utility 044 * included with the Java SDK. 045 */ 046 private static final long serialVersionUID = -3424403930225609943L; 047 048 049 050 /** 051 * Construct a new HistoricalCsnOrderingMatchingRule object. 052 * 053 */ 054 public HistoricalCsnOrderingMatchingRule() 055 { 056 super(); 057 } 058 059 /** 060 * Compare two ByteString values containing historical information. 061 * @param value1 first value to compare 062 * @param value2 second value to compare 063 * @return 0 when equals, -1 or 1 to establish order 064 */ 065 @Override 066 public int compareValues(ByteString value1, ByteString value2) 067 { 068 String[] token1 = value1.stringValue().split(":", 3); 069 String[] token2 = value2.stringValue().split(":", 3); 070 071 if ((token1[1] == null) || (token2[1] == null)) 072 return -1; 073 074 return token1[1].compareTo(token2[1]); 075 } 076 077 /** 078 * {@inheritDoc} 079 */ 080 @Override 081 public void initializeMatchingRule(OrderingMatchingRuleCfg configuration) 082 { 083 // No implementation needed here. 084 } 085 086 /** 087 * Get the name of this class. 088 * @return name of the class in String form 089 */ 090 @Override 091 public String getName() 092 { 093 return "historicalCsnOrderingMatch"; 094 } 095 096 /** 097 * Get the OID of the class. 098 * @return the OID of the class in String form. 099 */ 100 @Override 101 public String getOID() 102 { 103 return "1.3.6.1.4.1.26027.1.4.4"; 104 } 105 106 /** 107 * Get the description of this Class. 108 * @return the Class description in String form, currently not used. 109 */ 110 @Override 111 public String getDescription() 112 { 113 return null; 114 } 115 116 /** 117 * Get the Syntax OID for this class. 118 * @return the syntax OID in String form 119 */ 120 @Override 121 public String getSyntaxOID() 122 { 123 return "1.3.6.1.4.1.26027.1.3.5"; 124 } 125 126 /** 127 * Normalize historical information representation. 128 * @param value the value that must be normalized 129 * @return The String form that must be used for historical information 130 * comparison 131 */ 132 @Override 133 public ByteString normalizeValue(ByteString value) 134 { 135 String[] token = value.stringValue().split(":", 3); 136 return new ASN1OctetString(token[1]); 137 } 138 139 /** 140 * Compares two normalized representation of historical information. 141 * @param b1 first value to compare 142 * @param b2 second value to compare 143 * @return 0, -1 or 1 depending on relative positions 144 */ 145 public int compare(byte[] b1, byte[] b2) 146 { 147 int minLength = Math.min(b1.length, b2.length); 148 149 for (int i=0; i < minLength; i++) 150 { 151 if (b1[i] == b2[i]) 152 { 153 continue; 154 } 155 else if (b1[i] < b2[i]) 156 { 157 return -1; 158 } 159 else if (b1[i] > b2[i]) 160 { 161 return 1; 162 } 163 } 164 165 if (b1.length == b2.length) 166 { 167 return 0; 168 } 169 else if (b1.length < b2.length) 170 { 171 return -1; 172 } 173 else 174 { 175 return 1; 176 } 177 } 178 179 }