/* AjaxDevice.java
Purpose:
Description:
History:
Mon May 14 19:13:07 2007, Created by tomyeh
Copyright (C) 2007 Potix Corporation. All Rights Reserved.
{{IS_RIGHT
This program is distributed under LGPL Version 2.1 in the hope that
it will be useful, but WITHOUT ANY WARRANTY.
}}IS_RIGHT
*/
package org.zkoss.zk.device;
import java.io.IOException;
import java.util.Locale;
import org.zkoss.util.Locales;
import org.zkoss.zk.au.out.AuScript;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.http.Wpds;
import org.zkoss.zk.ui.metainfo.LanguageDefinition;
import org.zkoss.zk.ui.metainfo.MessageLoader;
import org.zkoss.zk.ui.util.Clients;
/**
* Represents a Web browser with the Ajax support.
*
* @author tomyeh
* @since 2.4.0
*/
public class AjaxDevice extends GenericDevice {
/** Return false to indicate it is not cacheable.
*/
public boolean isCacheable() {
return false;
}
public Boolean isCompatible(String userAgent) {
userAgent = userAgent.toLowerCase(java.util.Locale.ENGLISH);
return userAgent.indexOf("mozilla") >= 0 || userAgent.indexOf("msie ") >= 0 || userAgent.indexOf("gecko/") >= 0
|| userAgent.indexOf("safari") >= 0 || userAgent.indexOf("opera") >= 0 ? Boolean.TRUE : null;
}
/** Returns <code>text/html</code>
*/
public String getContentType() {
return "text/html";
}
/** Returns <code><!DOCTYPE html></code>. (since 7.0.0)
*/
public String getDocType() {
return "<!DOCTYPE html>";
}
/** Converts a package to a path that can be accessible by the class loader
* (classpath).
* <p>Default: "/js/" + pkg + ".wpd";
* @since 5.0.4
*/
public String packageToPath(String pkg) {
return "/js/" + pkg + ".wpd";
}
/** Converts a relative path to an absolute path that can be accessible by
* the class loader (classpath).
* <p>Default: "/js/" + path (if path doesn't start with '/' or '~').
* @param path the path (never null).
* It is assumed to be a relative path if not starting with '/' or '~'.
* @since 5.0.4
*/
public String toAbsolutePath(String path) {
final char cc = path.length() > 0 ? path.charAt(0) : (char) 0;
return cc != '/' && cc != '~' ? "/js/" + path : path;
}
public void reloadMessages(Locale locale) throws IOException {
if (locale == null)
locale = Locales.getCurrent();
final StringBuffer sb = new StringBuffer(4096);
final Locale oldl = Locales.setThreadLocal(locale);
try {
final Execution exec = Executions.getCurrent();
sb.append(Devices.loadJavaScript(exec, "~./js/zk/lang/msgzk*.js"));
sb.append(Wpds.outLocaleJavaScript());
for (LanguageDefinition langdef : LanguageDefinition.getByDeviceType(getType()))
for (MessageLoader loader : langdef.getMessageLoaders())
loader.load(sb, exec);
} finally {
Locales.setThreadLocal(oldl);
}
Clients.response("zk.reload", new AuScript(null, sb.toString()));
}
}