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.backends.jeb; 028 029 import org.opends.server.types.Attribute; 030 import org.opends.server.types.Entry; 031 import org.opends.server.types.Modification; 032 import org.opends.server.types.AttributeType; 033 034 import java.util.Comparator; 035 import java.util.List; 036 import java.util.Set; 037 import java.util.Map; 038 039 /** 040 * An implementation of an Indexer for attribute presence. 041 */ 042 public class PresenceIndexer extends Indexer 043 { 044 045 046 /** 047 * The comparator for index keys generated by this class. 048 */ 049 private static final Comparator<byte[]> comparator = 050 new AttributeIndex.KeyComparator(); 051 052 /** 053 * The attribute type for which this instance will 054 * generate index keys. 055 */ 056 private AttributeType attributeType; 057 058 /** 059 * Create a new attribute presence indexer. 060 * @param attributeType The attribute type for which the indexer 061 * is required. 062 */ 063 public PresenceIndexer(AttributeType attributeType) 064 { 065 this.attributeType = attributeType; 066 } 067 068 /** 069 * Get a string representation of this object. 070 * @return A string representation of this object. 071 */ 072 public String toString() 073 { 074 return attributeType.getNameOrOID() + ".presence"; 075 } 076 077 /** 078 * Get the comparator that must be used to compare index keys 079 * generated by this class. 080 * 081 * @return A byte array comparator. 082 */ 083 public Comparator<byte[]> getComparator() 084 { 085 return comparator; 086 } 087 088 089 090 /** 091 * Generate the set of index keys for an entry. 092 * 093 * @param entry The entry. 094 * @param keys The set into which the generated keys will be inserted. 095 */ 096 public void indexEntry(Entry entry, Set<byte[]> keys) 097 { 098 List<Attribute> attrList = 099 entry.getAttribute(attributeType); 100 if (attrList != null) 101 { 102 if (!attrList.isEmpty()) 103 { 104 keys.add(AttributeIndex.presenceKey.getData()); 105 } 106 } 107 } 108 109 110 111 /** 112 * Generate the set of index keys to be added and the set of index keys 113 * to be deleted for an entry that has been replaced. 114 * 115 * @param oldEntry The original entry contents. 116 * @param newEntry The new entry contents. 117 * @param modifiedKeys The map into which the modified keys will be inserted. 118 */ 119 public void replaceEntry(Entry oldEntry, Entry newEntry, 120 Map<byte[], Boolean> modifiedKeys) 121 { 122 List<Attribute> newAttributes = newEntry.getAttribute(attributeType, true); 123 List<Attribute> oldAttributes = oldEntry.getAttribute(attributeType, true); 124 if(oldAttributes == null) 125 { 126 if(newAttributes != null) 127 { 128 modifiedKeys.put(AttributeIndex.presenceKey.getData(), true); 129 } 130 } 131 else 132 { 133 if(newAttributes == null) 134 { 135 modifiedKeys.put(AttributeIndex.presenceKey.getData(), false); 136 } 137 } 138 } 139 140 141 142 /** 143 * Generate the set of index keys to be added and the set of index keys 144 * to be deleted for an entry that was modified. 145 * 146 * @param oldEntry The original entry contents. 147 * @param newEntry The new entry contents. 148 * @param mods The set of modifications that were applied to the entry. 149 * @param modifiedKeys The map into which the modified keys will be inserted. 150 */ 151 public void modifyEntry(Entry oldEntry, Entry newEntry, 152 List<Modification> mods, 153 Map<byte[], Boolean> modifiedKeys) 154 { 155 List<Attribute> newAttributes = newEntry.getAttribute(attributeType, true); 156 List<Attribute> oldAttributes = oldEntry.getAttribute(attributeType, true); 157 if(oldAttributes == null) 158 { 159 if(newAttributes != null) 160 { 161 modifiedKeys.put(AttributeIndex.presenceKey.getData(), true); 162 } 163 } 164 else 165 { 166 if(newAttributes == null) 167 { 168 modifiedKeys.put(AttributeIndex.presenceKey.getData(), false); 169 } 170 } 171 } 172 }