001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020 package org.apache.directory.server.core.event; 021 022 import java.util.ArrayList; 023 024 import org.apache.directory.shared.ldap.codec.search.controls.persistentSearch.PersistentSearchControl; 025 026 027 028 /** 029 * The different kinds of events a {@link DirectoryListener} may register for 030 * notification on using the {@link EventService}. Sometimes an entry is 031 * moved and renamed at the same time. These notifications are sent when 032 * either RENAME or MOVE notifications are enabled. 033 * 034 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 035 * @version $Rev$, $Date$ 036 */ 037 public enum EventType 038 { 039 ADD(1), DELETE(2), MODIFY(4), RENAME(8), MOVE(16); 040 041 042 public static final int ALL_EVENT_TYPES_MASK = getAllEventTypesMask(); 043 public static final int MOVE_OR_RENAME_MASK = MOVE.mask | RENAME.mask; 044 private static final EventType[] EMPTY_EVENT_ARRAY = new EventType[0]; 045 046 private int mask; 047 048 049 private EventType( int mask ) 050 { 051 this.mask = mask; 052 } 053 054 055 public int getMask() 056 { 057 return mask; 058 } 059 060 061 /** 062 * Gets an array of EventTypes from the PSearchControl changeTypes 063 * parameter value. According to the documentation of the changeTypes 064 * field of the Persistent Search Control: 065 * 066 * <code> 067 * The changeTypes field is the logical OR of one or more of these values: 068 * add (1), delete (2), modify (4), modDN (8). By default this is set to 1 | 069 * 2 | 4 | 8 which is the integer value 0x0F or 15. 070 * </code> 071 * 072 * NOTE: When the changeTypes mask includes a modDN(8) we include both the 073 * RENAME and MOVE EventType objects in the array. 074 * 075 * @see PersistentSearchControl 076 * @param psearchChangeTypes the value of the changeTypes parameter 077 * @return array of EventType objects 078 */ 079 public static EventType[] getEventTypes( int psearchChangeTypes ) 080 { 081 ArrayList<EventType> types = new ArrayList<EventType>(); 082 083 if ( isAdd( psearchChangeTypes ) ) 084 { 085 types.add( ADD ); 086 } 087 088 if ( isDelete( psearchChangeTypes ) ) 089 { 090 types.add( DELETE ); 091 } 092 093 if ( isModify( psearchChangeTypes ) ) 094 { 095 types.add( MODIFY ); 096 } 097 098 if ( ( psearchChangeTypes & 8 ) > 0 ) 099 { 100 types.add( MOVE ); 101 types.add( RENAME ); 102 } 103 104 return types.toArray( EMPTY_EVENT_ARRAY ); 105 } 106 107 108 private static int getAllEventTypesMask() 109 { 110 int allTypes = 0; 111 112 for ( EventType type : values() ) 113 { 114 allTypes |= type.getMask(); 115 } 116 117 return allTypes; 118 } 119 120 121 public static boolean isAdd( int mask ) 122 { 123 if ( ( mask & ADD.mask ) > 0 ) 124 { 125 return true; 126 } 127 128 return false; 129 } 130 131 132 public static boolean isDelete( int mask ) 133 { 134 if ( ( mask & DELETE.mask ) > 0 ) 135 { 136 return true; 137 } 138 139 return false; 140 } 141 142 143 public static boolean isModify( int mask ) 144 { 145 if ( ( mask & MODIFY.mask ) > 0 ) 146 { 147 return true; 148 } 149 150 return false; 151 } 152 153 154 public static boolean isMove( int mask ) 155 { 156 if ( ( mask & MOVE.mask ) > 0 ) 157 { 158 return true; 159 } 160 161 return false; 162 } 163 164 165 public static boolean isRename( int mask ) 166 { 167 if ( ( mask & RENAME.mask ) > 0 ) 168 { 169 return true; 170 } 171 172 return false; 173 } 174 175 176 public static boolean isMoveAndRename( int mask ) 177 { 178 if ( ( mask & MOVE_OR_RENAME_MASK ) > 0 ) 179 { 180 return true; 181 } 182 183 return false; 184 } 185 186 187 public static int getMask( EventType ...eventTypes ) 188 { 189 int mask = 0; 190 191 for ( EventType type : eventTypes ) 192 { 193 mask |= type.getMask(); 194 } 195 196 return mask; 197 } 198 }