/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package javax.naming.event;
import java.util.EventObject;
import javax.naming.Binding;
/**
* An event from a directory or naming service, for passing to a listener.
* <p>
* The source of the event is always the <code>EventContext</code> that the
* listener registered with. Names in the <code>NamingEvent</code> object are
* all relative to this context.
* </p>
* <p>
* Note the discussion about threads and synchronization in the description for
* this package.
* </p>
*/
public class NamingEvent extends EventObject {
/*
* This constant is used during deserialization to check the version which
* created the serialized object.
*/
private static final long serialVersionUID = 0x9d18b00289d22f45L;
/**
* A <code>NamingEvent</code> type constant, indicating that an object was
* added.
*/
public static final int OBJECT_ADDED = 0;
/**
* A <code>NamingEvent</code> type constant, indicating that an object was
* changed.
*/
public static final int OBJECT_CHANGED = 3;
/**
* A <code>NamingEvent</code> type constant, indicating that an object was
* removed.
*/
public static final int OBJECT_REMOVED = 1;
/**
* A <code>NamingEvent</code> type constant, indicating that an object was
* renamed.
*/
public static final int OBJECT_RENAMED = 2;
/**
* Some information about the event, whose format is specified by the
* service provider.
*
* @serial
*/
protected Object changeInfo;
/**
* The binding after the event.
*
* @serial
*/
protected Binding newBinding;
/**
* The binding before the event.
*
* @serial
*/
protected Binding oldBinding;
/**
* The type of this event. Its value is one of the constant event types
* above.
*
* @serial
*/
protected int type;
// the context that generated this event
private transient EventContext eventContext;
/**
*
* Constructs an <code>NamingEvent</code> with all parameters.
*
* @param eventContext
* the context that generated this event. It is the originator of
* this event and cannot be null.
* @param type
* the constant value that specifies the type of event
* @param newBinding
* binding after the event. <code>newBinding</code> might be
* null depending on the value of the <code>type</code>
* parameter as follows:
* <ul>
* <li> <code>OBJECT_ADDED</code> - <code>newBinding</code>
* cannot be null </li>
* <li> <code>OBJECT_CHANGED</code> - <code>newBinding</code>
* cannot be null </li>
* <li> <code>OBJECT_REMOVED</code> - <code>newBinding</code>
* can be null </li>
* <li> <code>OBJECT_RENAMED</code> - <code>newBinding</code>
* can be null </li>
* </ul>
* The names are relative to the <code>eventContext</code>
* @param oldBinding
* the binding before the event. <code>oldBinding</code> might
* be null depending on the value of the <code>type</code>
* parameter as follows:
* <ul>
* <li> <code>OBJECT_ADDED</code> - <code>oldBinding</code>
* can be null </li>
* <li> <code>OBJECT_CHANGED</code> - <code>oldBinding</code>
* cannot be null </li>
* <li> <code>OBJECT_REMOVED</code> - <code>oldBinding</code>
* cannot be null </li>
* <li> <code>OBJECT_RENAMED</code> - <code>oldBinding</code>
* can be null </li>
* </ul>
* The names are relative to the <code>eventContext</code>
* @param changeInfo
* contain some information about the event and maybe null, the
* format of which is specified by the service provider.
*/
public NamingEvent(EventContext eventContext, int type, Binding newBinding,
Binding oldBinding, Object changeInfo) {
super(eventContext);
this.type = type;
this.changeInfo = changeInfo;
this.newBinding = newBinding;
this.oldBinding = oldBinding;
this.eventContext = eventContext;
}
/**
* Calls a method to notify the listener of this event.
* <p>
* For <code>OBJECT_ADDED</code>, <code>OBJECT_REMOVED</code> or
* <code>OBJECT_RENAMED</code> type events this method calls the
* corresponding method in the <code>NamespaceChangedListener</code>
* interface. For <code>OBJECT_CHANGED</code> type events this method
* calls <code>objectChanged()</code> in the
* <code>ObjectChangeListener</code> interface.
* </p>
*
* @param naminglistener
* the listener of this event
*/
public void dispatch(NamingListener naminglistener) {
switch (type) {
case OBJECT_ADDED:
((NamespaceChangeListener) naminglistener).objectAdded(this);
break;
case OBJECT_REMOVED:
((NamespaceChangeListener) naminglistener).objectRemoved(this);
break;
case OBJECT_RENAMED:
((NamespaceChangeListener) naminglistener).objectRenamed(this);
break;
case OBJECT_CHANGED:
((ObjectChangeListener) naminglistener).objectChanged(this);
break;
}
}
/**
* Gets the change information.
*
* @return the change information object provided by the service provider,
* which may be null.
*/
public Object getChangeInfo() {
return changeInfo;
}
/**
* Gets the <code>EventContext</code> that generated this event.
*
* @return the <code>EventContext</code> that generated this event.
*/
public EventContext getEventContext() {
return eventContext;
}
/**
* Gets the binding after this event.
* <p>
* If it exists and is inside the scope that was specified when the listener
* was registered using <code>EventContext.addNamingListener</code>.
* Returns null otherwise. Therefore for an <code>OBJECT_RENAMED</code>
* event, the return value will be non-null if the new name places the
* binding within the scope for the listener.
* </p>
*
* @return the binding after this event
*/
public Binding getNewBinding() {
return newBinding;
}
/**
* Gets the binding before this event.
* <p>
* If it existed and was inside the scope that was specified when the
* listener was registered using <code>EventContext.addNamingListener</code>.
* Returns null otherwise. Therefore for an <code>OBJECT_RENAMED</code>
* event, the return value will be non-null if the old name placed the
* binding within the scope for the listener.
* </p>
*
* @return the binding before this event
*/
public Binding getOldBinding() {
return oldBinding;
}
/**
* Gets the type of the event.
* <p>
* The return value is constrained to a choice from:
* <code>OBJECT_ADDED</code>, <code>OBJECT_REMOVED</code>,
* <code>OBJECT_RENAMED</code>, <code>OBJECT_CHANGED</code>.
* </p>
*
* @return the type of the event
*/
public int getType() {
return type;
}
}