/* EventListenerInfo.java
Purpose:
Description:
History:
Thu Dec 15 19:29:49 TST 2011, Created by tomyeh
Copyright (C) 2011 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.zk.ui;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.zkoss.io.Serializables;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.util.ComponentActivationListener;
import org.zkoss.zk.ui.util.ComponentSerializationListener;
/**
* Used by {@link AbstractComponent} to hold the information of the event listener.
* @author tomyeh
* @since 6.0.0
*/
/*package*/ class EventListenerInfo
implements ComponentSerializationListener, ComponentActivationListener, java.io.Serializable {
/*package*/ final int priority;
/*package*/ final EventListener<? extends Event> listener;
/*package*/ EventListenerInfo(int priority, EventListener<? extends Event> listener) {
this.priority = priority;
this.listener = listener;
}
//Utilities//
/**
* @param comp the component used to invoke ComponentSerializationListener.
* Ignored if null.
*/
/*package*/ static final void write(java.io.ObjectOutputStream s, AbstractComponent comp,
Map<String, List<EventListenerInfo>> listeners) throws IOException {
if (listeners != null) {
final Logger logio = Serializables.logio;
final boolean debug = logio.isDebugEnabled();
for (Map.Entry<String, List<EventListenerInfo>> me : listeners.entrySet()) {
boolean keyWritten = false;
final List<EventListenerInfo> ls = me.getValue();
for (EventListenerInfo li : ls) {
if (comp != null)
comp.willSerialize(li.listener);
if ((li.listener instanceof java.io.Serializable)
|| (li.listener instanceof java.io.Externalizable)) {
if (!keyWritten) {
keyWritten = true;
s.writeObject(me.getKey());
}
try {
s.writeObject(li);
} catch (java.io.NotSerializableException ex) {
logio.error("Unable to serialize item: " + li.listener);
throw ex;
}
} else if (debug) {
logio.debug("Skip not-serializable item: " + li.listener);
}
}
if (keyWritten)
s.writeObject(null); //end of list for a particular event
}
}
s.writeObject(null); //end of event listeners
}
/**
* @param comp the component used to invoke ComponentSerializationListener.
* Ignored if null.
*/
/*package*/ static final Map<String, List<EventListenerInfo>> read(java.io.ObjectInputStream s,
AbstractComponent comp) throws IOException, ClassNotFoundException {
Map<String, List<EventListenerInfo>> listeners = null;
for (;;) {
final String evtnm = (String) s.readObject();
if (evtnm == null)
break; //no more
if (listeners == null)
listeners = new HashMap<String, List<EventListenerInfo>>(4);
final List<EventListenerInfo> ls = Serializables.smartRead(s, (List<EventListenerInfo>) null);
//OK to use Serializables.smartRead to read back
if (ls != null) {
if (comp != null)
for (EventListenerInfo li : ls)
comp.didDeserialize(li.listener);
listeners.put(evtnm, ls);
}
}
return listeners;
}
//ComponentSerializationListener//
public void willSerialize(Component comp) {
((AbstractComponent) comp).willSerialize(this.listener);
}
public void didDeserialize(Component comp) {
((AbstractComponent) comp).didDeserialize(this.listener);
}
//ComponentActivationListener//
public void didActivate(Component comp) {
((AbstractComponent) comp).didActivate(this.listener);
}
public void willPassivate(Component comp) {
((AbstractComponent) comp).willPassivate(this.listener);
}
public String toString() {
return "[" + this.priority + ": " + this.listener.toString() + "]";
}
}