/* ShowWindowEventListener.java
{{IS_NOTE
Purpose:
Description:
History:
Thu Dec 27 11:32:06 2006, Created by Henri
}}IS_NOTE
Copyright (C) 2006 Potix Corporation. All Rights Reserved.
{{IS_RIGHT
}}IS_RIGHT
*/
package org.zkoss.zkplus.acegi;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.zkoss.util.CollectionsX;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Page;
import org.zkoss.zk.ui.UiException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.SerializableEventListener;
import org.zkoss.zul.Window;
/**
* <p>The default listener to show a modal window for login and other things.</p>
* <p>The event data is the url page and it expects:</p>
* <ul>
* <li>The url page must be a zul defined page (*.zul).</li>
* <li>The url page must enclosed with a window component so it can be doModal().</li>
* </ul>
* <p>This implementation would automatically remove the added eventlistener from the target component.</p>
* <p>Applicable to Acegi Security version 1.0.3</p>
* @author Henri
* @deprecated As of release 7.0.0
*/
public class ShowWindowEventListener<T extends Event> implements SerializableEventListener<T> {
@SuppressWarnings("unchecked")
public void onEvent(T event) {
//fetch old Event stored in Session and post again
final Component comp = event.getTarget();
final Page page = comp.getPage();
final String url = (String) event.getData();
final Execution exec = Executions.getCurrent();
try {
doModal(page, url);
} finally {
if (comp.isListenerAvailable(event.getName(), true)) {
EventListener listener = (EventListener) comp.getAttribute(event.getName());
if (listener != null) {
comp.removeEventListener(event.getName(), listener);
comp.removeAttribute(event.getName());
}
}
}
}
private void doModal(Page page, String url) {
final Execution exec = Executions.getCurrent();
final Object[] urls = parseUrl(url);
final Component modalwin = exec.createComponents((String) urls[0], null, (Map) urls[1]);
if (!(modalwin instanceof Window)) {
throw new UiException("The page must enclosed with a Window component. Check url definition: " + url);
}
modalwin.setPage(page);
((Window) modalwin).doModal();
}
//Object[0]: url, Object[1]: Map
private Object[] parseUrl(String url) {
Object[] result = new Object[2];
int j = url.indexOf("?");
if (j < 0) {
result[0] = url;
return result;
}
result[0] = url.substring(0, j);
if ((j + 1) >= url.length()) {
return result;
}
url = url.substring(j + 1);
List<String> list = new LinkedList<String>();
CollectionsX.parse(list, url, '&');
Map<String, String> args = new HashMap<String, String>();
for (String s : list) {
List<String> pair = new ArrayList<String>(2);
CollectionsX.parse(pair, s, '=');
args.put(pair.get(0), pair.get(1));
}
result[1] = args;
return result;
}
}