/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.core.model.extendable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Element;
import org.dom4j.Text;
import org.dom4j.tree.DefaultElement;
import org.dom4j.tree.DefaultText;
import org.eclipse.core.runtime.IConfigurationElement;
import com.hundsun.ares.studio.core.ARESCore;
import com.hundsun.ares.studio.core.model.converter.IExtendModelConverter;
import com.hundsun.ares.studio.core.util.ExtendPointUtil;
/**
* ��չ�ڵ�洢�ṹ����
*<extendMap>
* <entity>
* <key>realkey</key>
* <value>valueElement</value>
* </entity>
* <entity>
* <key>realkey</key>
* <value>valueElement</value>
* </entity>
* ......
*</extendMap>
* @author maxh
*
*
*
* ��չģ�Ͷ�д���߷���
*/
public class ExtendModelConverterManager {
//����
Map<ExtendModelMapKey, IExtendModelConverter> map = new HashMap<ExtendModelMapKey, IExtendModelConverter>();
//��չģ����XML�еĽڵ�ؼ���
public static final String MAP_STRING = "extendMap";
public static final String ENTITY_STRING = "entity";
public static final String KEY_STRING = "key";
public static final String VALUE_STRING = "value";
//��չģ�Ͷ�д����չ��
public static final String EXTEND_POINT_ID = ARESCore.PLUGIN_ID + ".ares_extend_model_serializer";
//��չģ�Ͷ�д�������ֶ�
public static final String POINT_TARGET_CLASS_STRING = "targetClassName";
public static final String POINT_KEY_STRING = "key";
//�û��Զ���ҳ��ı������
public static final String USER_CONFIG_PAGE_STRING = "userConfigPageString";
private ExtendModelConverterManager() {}
static ExtendModelConverterManager extendModelConverterManager;
public static ExtendModelConverterManager getDefault(){
if(extendModelConverterManager == null){
extendModelConverterManager = new ExtendModelConverterManager();
}
return extendModelConverterManager;
}
//����������key����չ�����ҵ���д�� �л���
IExtendModelConverter getConverter(ExtendModelMapKey mapKey){
IExtendModelConverter converter = null;
if(map.containsKey(mapKey)){
return map.get(mapKey);
}
for(IConfigurationElement ce:ExtendPointUtil.readAllConfiguredElements(EXTEND_POINT_ID)){
if(mapKey.getKey().equals(ce.getAttribute(POINT_KEY_STRING)) && mapKey.getClassName().equals(ce.getAttribute(POINT_TARGET_CLASS_STRING))){
try {
converter = (IExtendModelConverter)ce.createExecutableExtension("class");
break;
} catch (Exception e) {
}
}
}
map.put(mapKey, converter);
return converter;
}
//��ȡ��չMAP
public void readExtendMap(IExtendAbleModel model,Element root){
Element mapElement = root.element(MAP_STRING);
if(mapElement == null && root.getName().equals(MAP_STRING)){
mapElement = root;
}
String className = model.getClass().getName();
if(mapElement != null){
List list = mapElement.elements(ENTITY_STRING);
if(list != null){
for(Object o:list){
if(o instanceof Element){
Element entityElment = (Element)o;
Element keyElement = entityElment.element(KEY_STRING);
Element valueElement = entityElment.element(VALUE_STRING);
if(keyElement != null && valueElement != null){
String keyString = keyElement.getText();
IExtendModelConverter converter = getConverter(new ExtendModelMapKey(keyString,className));
//���û�ж�Ӧ����չ���д����Ϊ�˷�ֹ��Ϣ��ʧ��ģ����ֱ�ӻ���Element
if(converter != null){
model.getMap().put(keyString, converter.readExtendModel(valueElement));
}else if("true".equalsIgnoreCase(keyElement.attributeValue(USER_CONFIG_PAGE_STRING))){
model.getMap().put(keyString, readUserConfigMap(valueElement,keyString));
}else{
model.getMap().put(keyString,valueElement.clone());
}
}
}
}
}
}
}
/**
* @param valueElement
* @param keyString
* @return
*/
private UserConfigMap readUserConfigMap(Element valueElement, String keyString) {
UserConfigMap map = new UserConfigMap();
Element element = valueElement.element(keyString);
if(element != null){
for(Attribute attr:(List<Attribute>)element.attributes()){
map.put(attr.getName(), attr.getValue());
}
}
return map;
}
//д����չMAP
public void writeExtendMap(IExtendAbleModel model,Element root){
String className = model.getClass().getName();
Element mapElment = root.addElement(MAP_STRING);
if(model.getMap() != null){
for(String keyString:model.getMap().keySet()){
Element entityElment = mapElment.addElement(ENTITY_STRING);
Element keyElment = entityElment.addElement(KEY_STRING);
keyElment.setText(keyString);
Object value = model.getMap().get(keyString);
IExtendModelConverter converter = getConverter(new ExtendModelMapKey(keyString,className));
if(converter != null){
Element valueElment = entityElment.addElement(VALUE_STRING);
converter.writeExtendModel(value,valueElment);
}else if(value instanceof UserConfigMap){
//�û��Զ���ҳ�� ������
keyElment.addAttribute(USER_CONFIG_PAGE_STRING, "true");
Element valueElment = entityElment.addElement(VALUE_STRING);
writeUserConfigMap((UserConfigMap)value,valueElment,keyString);
}else {
((Element)value).setText(((Element)value).getTextTrim());
entityElment.add(((Element)value));
}
}
}
}
/**
* @param value
* @param valueElment
* @param keyString
*/
private void writeUserConfigMap(UserConfigMap value, Element valueElment, String keyString) {
Element element = valueElment.addElement(keyString);
for(String key:value.keySet()){
element.addAttribute(key, value.get(key));
}
}
}
class ExtendModelMapKey{
String key = "";
String className = "";
public ExtendModelMapKey(String key,String className) {
this.key = key;
this.className = className;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof ExtendModelMapKey){
return ((ExtendModelMapKey)obj).getKey().equals(key)
&& ((ExtendModelMapKey)obj).getClassName().equals(className);
}
return super.equals(obj);
}
public String getClassName() {
return className;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public String getKey() {
return key;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
return key.hashCode()*17+className.hashCode();
}
public void setClassName(String className) {
this.className = className;
}
public void setKey(String key) {
this.key = key;
}
}