/*
Copyright 2012-2013, Polyvi Inc. (http://polyvi.github.io/openxface)
This program is distributed under the terms of the GNU General Public License.
This file is part of xFace.
xFace is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
xFace is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with xFace. If not, see <http://www.gnu.org/licenses/>.
*/
package com.polyvi.xface.configXml;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.polyvi.xface.extension.XExtensionEntry;
import com.polyvi.xface.util.XLog;
import com.polyvi.xface.util.XXmlUtils;
import com.polyvi.xface.xmlParser.XXmlParser;
public class XSysConfigParser {
private static final String CLASS_NAME = XSysConfigParser.class.getName();
protected XXmlParser mParser;
protected static final String TAG_APP_PACKAGE = "app_package";
protected static final String TAG_EXTENSION = "extension";
protected static final String TAG_PLUGIN = "plugin";
protected static final String ATTR_NAME = "name";
protected static final String ATTR_VALUE = "value";
protected static final String ATTR_ID = "id";
protected static final String ATTR_LOG_LEVEL = "LogLevel";
protected static final String ATTR_FULLSCREEN = "FullScreen";
protected static final String ATTR_WORK_DIR = "WorkDir";
protected static final String ATTR_ENGINE_VERSION = "EngineVersion";
protected static final String ATTR_ENGINE_BUILD = "EngineBuild";
protected static final String ATTR_SPLASH_DELAY = "SplashScreenDelayDuration";
protected static final String ATTR_SHOW_SPLASH = "ShowSplashScreen";
protected static final String ATTR_AUTO_HIDE_SPLASH = "AutoHideSplashScreen";
protected static final String ATTR_UPDATE_ADDRESS = "UpdateAddress";
protected static final String ATTR_CHECK_UPDATE = "CheckUpdate";
protected static final String ATTR_LOADURL_TIMEOUT = "LoadUrlTimeout";
protected Document mDoc;
public XSysConfigParser() {
mParser = new XXmlParser();
}
/**
* 设置要解析的源
*
* @param is
* 要解析的流
*/
public void setInput(InputStream is) {
mParser.setInput(is);
}
/**
* 设置要解析的源
*
* @param inputStr
* 要解析的字符流
*/
public void setInput(String inputStr) {
mParser.setInput(inputStr);
}
/**
* 设置要解析文件的路径
* @param path
*/
public void setPath(String path) {
mParser.setPath(path);
}
/**
* 对设置的源进行解析,得到Document对象
* @return
*/
private Document parse() {
mDoc = mParser.parse();
return mDoc;
}
/**
* 对config文件进行解析
*
* @return
*/
public XSysConfigInfo parseConfig() throws XTagNotFoundException{
parse();
if(null == mDoc)
{
throw new XTagNotFoundException("error_format_config_xml");
}
XSysConfigInfo sysConfigInfo = new XSysConfigInfo();
sysConfigInfo.setPreinstallPackages(parsePreInstallPackagesTag());
sysConfigInfo.setStartAppId(parseStartAppId());
sysConfigInfo.setSysExtensions(parseExtensionTag());
sysConfigInfo.setLogLevel(XXmlUtils.parsePrefValue(mDoc, ATTR_LOG_LEVEL));
sysConfigInfo.setFullscreen(XXmlUtils.parsePrefValue(mDoc, ATTR_FULLSCREEN));
sysConfigInfo.setSplashDelay(XXmlUtils.parsePrefValue(mDoc, ATTR_SPLASH_DELAY));
sysConfigInfo.setShowSplash(XXmlUtils.parsePrefValue(mDoc, ATTR_SHOW_SPLASH));
sysConfigInfo.setAutoHideSplash(XXmlUtils.parsePrefValue(mDoc, ATTR_AUTO_HIDE_SPLASH));
sysConfigInfo.setWorkDir(XXmlUtils.parsePrefValue(mDoc, ATTR_WORK_DIR));
sysConfigInfo.setEngineVersion(XXmlUtils.parsePrefValue(mDoc, ATTR_ENGINE_VERSION));
sysConfigInfo.setEngineBuild(XXmlUtils.parsePrefValue(mDoc, ATTR_ENGINE_BUILD));
sysConfigInfo.setUpdateAddress(XXmlUtils.parsePrefValue(mDoc, ATTR_UPDATE_ADDRESS));
sysConfigInfo.setUpdateCheck(XXmlUtils.parsePrefValue(mDoc, ATTR_CHECK_UPDATE));
sysConfigInfo.setLoadUrlTimeout(XXmlUtils.parsePrefValue(mDoc, ATTR_LOADURL_TIMEOUT));
sysConfigInfo.setPluginsConfig(parsePluginsConfig());
sysConfigInfo.setPluginDesciptions(parsePluginDesciptions());
return sysConfigInfo;
}
/**
* 解析config中配置的预安装包
* <pre_install_packages>
* <app_package>startapp_1350033381203_normal.xpa</app_package>
* <app_package>normal.xpa</app_package>
* </pre_install_packages>
* @return 预安装包列表
*/
private List<XPreInstallPackageItem> parsePreInstallPackagesTag() throws XTagNotFoundException {
NodeList nodes = mDoc.getElementsByTagName(TAG_APP_PACKAGE);
int len = (null == nodes ? 0 : nodes.getLength());
if(len == 0)
{
throw new XTagNotFoundException(TAG_APP_PACKAGE);
}
ArrayList<XPreInstallPackageItem> preinstallPackages = new ArrayList<XPreInstallPackageItem>(len);
for (int i = 0; i < len; i++) {
Element packageNode = (Element) nodes.item(i);
String appId = packageNode.getAttribute("id");
Node textChild = packageNode.getFirstChild();
if (textChild == null)
continue;
String packageName = textChild.getNodeValue();
preinstallPackages.add(new XPreInstallPackageItem(packageName,
appId));
}
if(preinstallPackages.size() == 0)
{
throw new XTagNotFoundException(TAG_APP_PACKAGE);
}
return preinstallPackages;
}
/**
* 解析config中startApp的id,默认规定第一个就是startapp
* <pre_install_packages>
* <app_package id = "app">startapp_1350033381203_normal.xpa</app_package>
* </pre_install_packages>
* @return startApp的id
* @throws XTagNotFoundException
*/
private String parseStartAppId(){
Element packageNode = (Element) mDoc.getElementsByTagName(
TAG_APP_PACKAGE).item(0);
if(null == packageNode) {
XLog.e(CLASS_NAME, "Parse StartApp Id failed!");
return null;
}
return packageNode.getAttribute(ATTR_ID);
}
/**
* 解析config中配置的扩展集合,如:
* <extensions>
* <extension name="Accelerometer" value="XAccelerometerExt" />
* <extension name="App" value="XAppExt" />
* </extension>
* @return 扩展集合
*/
private HashMap<String, XExtensionEntry> parseExtensionTag() {
NodeList nodes = mDoc.getElementsByTagName(TAG_EXTENSION);
int len = (null == nodes ? 0 : nodes.getLength());
HashMap<String, XExtensionEntry> extensions = new HashMap<String, XExtensionEntry>(len);
for (int i = 0; i < len; i++) {
Node textChild = nodes.item(i);
if(null != textChild) {
String name = ((Element) textChild).getAttribute(ATTR_NAME);
String className = ((Element) textChild).getAttribute(ATTR_VALUE);
XExtensionEntry entry = new XExtensionEntry(name, className);
extensions.put(name, entry);
}
}
return extensions;
}
/**
* 解析加载的插件配置
* <plugins>
* <plugin value = "com.polyvi.external.plugin.XPluginMemory" name = "T_Memory" />
* </plugins>
* @return 加载的插件配置
*/
private HashMap<String, String> parsePluginsConfig() {
HashMap<String, String> pluginConfig = new HashMap<String, String>();
NodeList nodes = mDoc.getElementsByTagName(TAG_PLUGIN);
int len = (null == nodes ? 0 : nodes.getLength());
for (int i = 0; i < len; i++) {
Node textChild = nodes.item(i);
if(null != textChild) {
String className = ((Element) textChild).getAttribute(ATTR_VALUE);
String pluginName = ((Element) textChild).getAttribute(ATTR_NAME);
pluginConfig.put(className, pluginName);
}
}
return pluginConfig;
}
/**
* 解析加载的插件的描述信息
* <plugins>
* <plugin value = "com.polyvi.external.plugin.XPluginMemory"/>
* </plugins>
* @return 加载的插件的描述信息
*/
private Set<String> parsePluginDesciptions() {
Set<String> desciptions = new HashSet<String>();
NodeList nodes = mDoc.getElementsByTagName(TAG_PLUGIN);
int len = (null == nodes ? 0 : nodes.getLength());
for (int i = 0; i < len; i++) {
Node textChild = nodes.item(i);
if(null != textChild) {
desciptions.add(((Element) textChild).getAttribute(ATTR_VALUE));
}
}
return desciptions;
}
}