/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.portal.engine.model;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import com.jinhe.tss.core.util.XMLDocUtil;
import com.jinhe.tss.portal.helper.IElement;
/**
* 元素(修饰器/布局器/portlet)节点超类对象。
*
* 用于解析门户中使用到的修饰器/布局器/portlet
*
*/
public abstract class AbstractElementNode extends AbstractSubNode {
protected IElement element; // 元素对象本身
protected PortalNode portal; // 所属Portal节点对象
protected PageNode page; // 所属页面节点对象
protected String html; // HTML代码
protected String script; // Script代码
protected String style; // style代码
protected String prototypeStyle; // 修饰器/布局器/portlet【公用的Style代码】
protected Map<String, String> events = new HashMap<String, String>(); // 事件定义:onload/onunload
protected Map<String, String> parameters = new HashMap<String, String>(); // 自定义参数的默认值列表 + 动态配置的参数
public Map<String, String> getEvents() { return events; }
public Map<String, String> getParameters() { return parameters; }
public String getHtml() { return html; }
public String getScript() { return script; }
public String getStyle() { return style; }
public String getPrototypeStyle() { return prototypeStyle; }
public PageNode getPage() { return page; }
public PortalNode getPortal() { return portal; }
public void setPage(PageNode page) { this.page = page; }
public void setPortal(PortalNode portal) { this.portal = portal; }
// 无儿子节点,本身为叶子节点
public void addChild( Node node ) {
// do nothing
}
/**
* @param element
* 元素实体
* @param parent
* 元素所在的门户结构Node(PageNode、SectionNode 或 PortletInstanceNode)
* @param parametersOnPs
* 元素所在门户结构配置的该元素的参数列表
*/
public AbstractElementNode(IElement element, SubNode parent, String parametersOnPs) {
this(element, parent);
//先放入元素自定义参数的默认值(parse()方法里已经放进去了),然后再放入具体门户结构上定义的参数以覆盖默认的(如下)
if(parametersOnPs != null) {
Document paramsDoc = XMLDocUtil.dataXml2Doc(parametersOnPs);
Element paramsNode = (Element) paramsDoc.selectSingleNode("/params/" + element.getElementName());
Map<String, String> configParamsMap = XMLDocUtil.dataNode2Map(paramsNode);
if(configParamsMap != null) {
getParameters().putAll(configParamsMap);
}
}
}
public AbstractElementNode(IElement element, SubNode parent) {
this.element = element;
this.id = element.getId();
this.name = element.getName();
this.code = element.getCode();
this.parent = parent;
this.page = parent.getPage();
this.portal = parent.getPortal();
parse(element.getDefinition(), element.getElementName());
}
protected Document parse(String definition, String elementName) {
Document doc = XMLDocUtil.dataXml2Doc(definition);
org.dom4j.Node htmlNode = doc.selectSingleNode("/" + elementName + "/html");
org.dom4j.Node scriptNode = doc.selectSingleNode("/" + elementName + "/script");
org.dom4j.Node styleNode = doc.selectSingleNode("/" + elementName + "/style");
org.dom4j.Node ptStyleNode = doc.selectSingleNode("/" + elementName + "/prototypeStyle");
this.html = XMLDocUtil.getNodeText(htmlNode);
this.script = XMLDocUtil.getNodeText(scriptNode);
this.style = XMLDocUtil.getNodeText(styleNode);
this.prototypeStyle = XMLDocUtil.getNodeText(ptStyleNode);
List<Element> eventNodes = XMLDocUtil.selectNodes(doc, "/" + elementName + "/events/attach");
if(eventNodes != null){
for( Element eventNode : eventNodes ){
this.events.put(eventNode.attributeValue("event"), eventNode.attributeValue("onevent"));
}
}
List<Element> paramNodes = XMLDocUtil.selectNodes(doc, "/" + elementName + "/parameters/param");
if(paramNodes != null){
for( Element paramNode : paramNodes ){
getParameters().put(paramNode.attributeValue("name"), paramNode.attributeValue("defaultValue"));
}
}
return doc;
}
public IElement getElement() {
return element;
}
public String getResourcePath(){
return element.getResourcePath();
}
public Object clone(){
AbstractElementNode copy = (AbstractElementNode) super.clone();
copy.parameters = new HashMap<String, String>(this.parameters);
copy.events = new HashMap<String, String>(this.events);
return copy;
}
}