/* ZkdemoWebAppInit.java
{{IS_NOTE
Purpose:
Description:
History:
Nov 12, 2008 2:49:39 PM , Created by jumperchen
}}IS_NOTE
Copyright (C) 2008 Potix Corporation. All Rights Reserved.
{{IS_RIGHT
This program is distributed under GPL Version 3.0 in the hope that
it will be useful, but WITHOUT ANY WARRANTY.
}}IS_RIGHT
*/
package org.zkoss.zksandbox;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import org.zkoss.lang.Library;
import org.zkoss.util.logging.Log;
import org.zkoss.util.resource.ClassLocator;
import org.zkoss.zk.ui.WebApp;
import org.zkoss.zk.ui.util.WebAppInit;
/**
* @author jumperchen
*
*/
public class DemoWebAppInit implements WebAppInit {
private static final Log log = Log.lookup(DemoWebAppInit.class);
final static String PATH = "/";
final static String CONFIG = "zksandbox.properties";
final static String CATEGORY_TYPE = "CATEGORY";
final static String LINK_TYPE = "LINK";
private final static String THEME_CLASSICBLUE_NAME = Themes.CLASSICBLUE_THEME;
private final static String THEME_CLASSICBLUE_DISPLAY = "Classic blue";
private final static int THEME_CLASSICBLUE_PRIORITY = 1000;
private final static String THEME_SILVERGREY_NAME = "silvergray";
private final static String SILVERGREY_DISPLAY = "Silver Gray";
private final static int SILVERGREY_PRIORITY = 9000;
/*package*/ final static String KEY_SILVERGREY_PROPERTY = "org.zkoss.zul.themejar.silvergray";
/*package*/ final static String THEME_DEFAULT = "org.zkoss.theme.default";
private final static String PREFIX_KEY_PRIORITY = "org.zkoss.theme.priority.";
private final static String PREFIX_KEY_THEME_DISPLAYS = "org.zkoss.theme.display.";
private static Map _cateMap = new LinkedHashMap () {
public Object remove(Object key) {
throw new UnsupportedOperationException();
}
public void clear() {
throw new UnsupportedOperationException();
}
};
public void init(WebApp wapp) throws Exception {
loadProperites((ServletContext)wapp.getNativeContext());
setThemeProperites();
initThemes();
}
private static void initThemes() {
addTheme(THEME_CLASSICBLUE_NAME, THEME_CLASSICBLUE_DISPLAY, THEME_CLASSICBLUE_PRIORITY);
if(Themes.hasSilvergrayLib())
addTheme(THEME_SILVERGREY_NAME, SILVERGREY_DISPLAY, SILVERGREY_PRIORITY);
}
/**
* Sets silvergray library property if there is silvergray.jar
*/
private void setThemeProperites () {
String prop = Library.getProperty(KEY_SILVERGREY_PROPERTY);
if (prop == null) {
final ClassLocator loc = new ClassLocator();
try {
for (Enumeration en = loc.getResources("metainfo/zk/lang-addon.xml");
en.hasMoreElements();) {
final URL url = (URL)en.nextElement();
if (url.toString().lastIndexOf("silvergray-tod.jar") >= 0) {
Library.setProperty(KEY_SILVERGREY_PROPERTY, "true");
return;
}
}
} catch (Exception ex) {
log.error(ex); //keep running
}
Library.setProperty(KEY_SILVERGREY_PROPERTY, "false");
}
}
static Map getCateMap() {
return _cateMap;
}
private void loadProperites(ServletContext context) {
try {
BufferedReader bufReader = new BufferedReader(
new InputStreamReader(context.getResourceAsStream(PATH + CONFIG)));
String prop = null;
while ((prop = bufReader.readLine()) != null) {
int begin = prop.indexOf("=");
if (prop.startsWith("#") || prop.startsWith("!") || begin == -1)
continue;
final String key = prop.substring(0, begin).trim();
final String values = prop.substring(begin + 1, prop.length()).trim();
final String[] vals = values.split(",");
if (vals.length == 0)
continue;
final String arg0 = vals[0].trim();
if (CATEGORY_TYPE.equals(arg0)) {
if (vals.length < 3) {
log.error("This category has no enough argument: size less than 3, for example, CATEGORY,IconURL,Label");
continue;
}
Category cate = new Category(key, vals[1].trim(), vals[2].trim(), null);
_cateMap.put(key, cate);
} else if (LINK_TYPE.equals(arg0) ) {
if (vals.length < 4) {
log.error("This category has no enough argument: size less than 4, for example, LINK,IconURL,Label,Href");
continue;
}
Category cate = new Category(key, vals[1].trim(), vals[2].trim(), vals[3].trim());
_cateMap.put(key, cate);
} else {
Category cate = (Category) _cateMap.get(arg0);
if (cate == null) {
log.error("This category is undefined: " + arg0);
continue;
}
if (vals.length < 4) {
log.error("This demo item has no enough argument: size less than 4, for example, categoryId,FileURL,IconURL,Label");
continue;
}
// [ItemId=CategoryId, Demo File URL, Icon URL, Label]
DemoItem item = new DemoItem(key, arg0, vals[1].trim(), vals[2].trim(), vals[3].trim());
cate.addItem(item);
}
}
bufReader.close();
} catch (IOException e) {
log.error("Ingored: failed to load a properties file, \nCause: "
+ e.getMessage());
}
}
private static void appendThemeName(String theme) {
String themes = Library.getProperty(Themes.THEME_NAMES);
if (themes == null)
Library.setProperty(Themes.THEME_NAMES, theme + ";");
else if (!Themes.containTheme(themes, theme))
Library.setProperty(Themes.THEME_NAMES, themes + ";" + theme);
}
private static void setThemeDisplay(String name, String display) {
Library.setProperty(PREFIX_KEY_THEME_DISPLAYS + name, display);
}
private static void updateFirstPriority(String name, int priority) {
Library.setProperty(PREFIX_KEY_PRIORITY + name, "" + priority);
String defaultTheme = Library.getProperty(THEME_DEFAULT);
if (Library.getIntProperty(PREFIX_KEY_PRIORITY + defaultTheme, Integer.MAX_VALUE) < priority)
return;
Library.setProperty(THEME_DEFAULT, name);
}
private static void addTheme(String themeName, String themeDisplay, int themePriority){
appendThemeName(themeName);
setThemeDisplay(themeName, themeDisplay);
updateFirstPriority(themeName, themePriority);
}
}