/* DownloadHandler.java
Purpose:
Description:
History:
May 28, 2012 Created by pao
Copyright (C) 2011 Potix Corporation. All Rights Reserved.
*/
package org.zkoss.zats.mimic.impl.response;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.zkoss.zats.mimic.Client;
import org.zkoss.zats.mimic.DesktopAgent;
import org.zkoss.zats.mimic.Resource;
import org.zkoss.zats.mimic.impl.ClientCtrl;
import org.zkoss.zats.mimic.impl.DesktopCtrl;
import org.zkoss.zats.mimic.impl.LayoutResponseHandler;
import org.zkoss.zats.mimic.impl.UpdateResponseHandler;
import org.zkoss.zats.mimic.impl.au.AuUtility;
import org.zkoss.zk.au.AuResponse;
/**
* The response handler for download event.
* @author pao
*/
public class DownloadHandler implements UpdateResponseHandler, LayoutResponseHandler{
public final static String REGISTER_KEY = "download";
private final static Logger logger = Logger.getLogger(DownloadHandler.class.getName());
public void process(DesktopAgent desktop, Map<String, Object> jsonObject) {
// clean downloadable file first
((DesktopCtrl) desktop).setDownloadable(null);
// fetch all commands and find the last download command
List<AuResponse> resp = AuUtility.convertToResponses(jsonObject);
Map<String, AuResponse> map = new HashMap<String, AuResponse>();
for (AuResponse r : resp)
map.put(r.getCommand(), r);
AuResponse download = map.get("download");
// get path and create downloadable file
if (download != null) {
Object[] data = download.getRawData();
String path = data[0].toString().replaceAll("\\\\", ""); // remove unnecessary char.
if (logger.isLoggable(Level.FINEST))
logger.finest("download event: " + path);
Resource downloadable = new DownloadableImpl(desktop, path);
((DesktopCtrl) desktop).setDownloadable(downloadable);
}
}
private static class DownloadableImpl implements Resource {
private DesktopAgent desktop;
private String path;
public DownloadableImpl(DesktopAgent desktop, String path) {
this.desktop = desktop;
this.path = path;
}
public String getName() {
return path.substring(path.lastIndexOf("/") + 1);
}
public InputStream getInputStream() throws IOException{
Client client = desktop.getClient();
ClientCtrl cc = (ClientCtrl) client;
return cc.openConnection(path);
}
}
public void process(DesktopAgent desktopAgent, String response) {
// ZATS-11: in most ZK version, the <script> doesn't have <![CDATA[]]>, so, escape "&"
response = response.replaceAll("[&]", "&");
Map<String, Object> map = AuUtility.parseAuResponseFromLayout(response);
if (map != null) {
process(desktopAgent, map);
}
}
}