package com.hundsun.ares.studio.jres.basicdata.ui.extend;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.IARESElement;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.model.CoreFactory;
import com.hundsun.ares.studio.core.model.CorePackage;
import com.hundsun.ares.studio.core.model.ExtensibleModelConfigProperty;
import com.hundsun.ares.studio.core.util.PersistentUtil;
import com.hundsun.ares.studio.jres.basicdata.constant.IBasicdataConstants;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicDataBaseModel;
import com.hundsun.ares.studio.ui.editor.extend.AbstractEMPropertyDescriptor;
import com.hundsun.ares.studio.ui.editor.extend.AbstractExtensibleModelEditingSupport;
import com.hundsun.ares.studio.ui.editor.extend.BooleanMapEMPropertyDescriptor;
import com.hundsun.ares.studio.ui.editor.extend.ComboMapEMPropertyDescriptor;
import com.hundsun.ares.studio.ui.editor.extend.IExtensibleModelPropertyDescriptor;
import com.hundsun.ares.studio.ui.editor.extend.LongTextMapEMPropertyDescriptor;
import com.hundsun.ares.studio.ui.editor.extend.RefExtendedPropertyDescriptor;
import com.hundsun.ares.studio.ui.editor.extend.TextMapEMPropertyDescriptor;
public class BasicDataExtensibleModelEditingSupport extends AbstractExtensibleModelEditingSupport {
@Override
public String getName() {
return "����������չ";
}
@Override
public String getKey() {
return IBasicdataConstants.BASICDATA_EXTEND_KEY;
}
@Override
public EObject createMapValueObject() {
return CoreFactory.eINSTANCE.createUserExtensibleProperty();
}
@Override
public boolean isEnable(IARESElement aresElement, EClass eClass) {
//��Դ�п��ܲ�����
if(null == aresElement) {
return false;
}
if(aresElement instanceof IARESResource){
IARESResource resource = (IARESResource)aresElement;
try {
BasicDataBaseModel info = resource.getInfo(BasicDataBaseModel.class);
if(info != null){
//����༭���е���չģ�ͣ�������չģ������д��uri��ֻ���ж϶�Ӧclass�Ƿ���ڣ�
EPackage epackage = info.eClass().getEPackage();
for(Element element : getExsibleModelConfigList(info)){
EClass cls = (EClass) epackage.getEClassifier(element.attributeValue("class"));
if(cls != null && cls.isSuperTypeOf(eClass)){
return true;
}
}
}
} catch (ARESModelException e) {
e.printStackTrace();
}
}
//��Ŀ�����е���չģ�ͣ������ж϶�Ӧclass�Ƿ���ڣ���Ҫ�ж�uri�Ƿ�һ��
for(Element element : getProjectExsibleModelConfigList(aresElement.getARESProject())){
EClass cls = (EClass) eClass.getEPackage().getEClassifier(element.attributeValue("class"));
if(cls != null && cls.isSuperTypeOf(eClass) && StringUtils.equalsIgnoreCase( eClass.getEPackage().getNsURI(), element.attributeValue("uri"))){
return true;
}
}
return false;
}
@Override
public IExtensibleModelPropertyDescriptor[] getPropertyDescriptors(
IARESElement aresElement, EClass eClass) {
List<IExtensibleModelPropertyDescriptor> descriptors = new ArrayList<IExtensibleModelPropertyDescriptor>();
//��ֹ�ظ�id���֣����������չ����Ŀ��չ��һ����id����ֻȡ�������չ
Set<String> idSet = new HashSet<String>();
if(aresElement instanceof IARESResource){
try {
BasicDataBaseModel info = ((IARESResource)aresElement).getInfo(BasicDataBaseModel.class);
//����༭���е���չ����
for (Element element : getExsibleModelConfigList(info)) {
descriptors.addAll(getPropertyDescriptors(element, eClass, aresElement.getARESProject(),idSet));
}
} catch (ARESModelException e) {
e.printStackTrace();
}
}
//��Ŀ�����ж������չ����
EPackage epackage = eClass.getEPackage();
for(Element element : getProjectExsibleModelConfigList(aresElement.getARESProject())){
if(StringUtils.equalsIgnoreCase(epackage.getNsURI(), element.attributeValue("uri"))){
descriptors.addAll(getPropertyDescriptors(element, eClass, aresElement.getARESProject(),idSet));
}
}
return descriptors.toArray(new IExtensibleModelPropertyDescriptor[descriptors.size()]) ;
}
/**
* ��ȡ��չ���������
* @param element
* @param eClass
* @param project
* @return
*/
private List<IExtensibleModelPropertyDescriptor> getPropertyDescriptors(Element element,EClass eClass,IARESProject project,Set<String>idSet){
EClass cls = (EClass) eClass.getEPackage().getEClassifier(element.attributeValue("class"));
List<IExtensibleModelPropertyDescriptor> descriptors = new ArrayList<IExtensibleModelPropertyDescriptor>();
if(cls != null && cls.isSuperTypeOf(eClass)){
for (Element attributeElement : (List<Element>)element.elements("Attribute")) {
String name = attributeElement.attributeValue("name");
String id = attributeElement.attributeValue("id");
String type = attributeElement.attributeValue("type");
if(idSet.contains(id)){
//�Ѿ������ˣ�����һ��
continue;
}
idSet.add(id);
AbstractEMPropertyDescriptor attribute = null;
if ("boolean".equalsIgnoreCase(type)) {
attribute = new BooleanMapEMPropertyDescriptor(CorePackage.Literals.USER_EXTENSIBLE_PROPERTY__MAP, id,getKey());
} else if ("bigstring".equalsIgnoreCase(type)) {
attribute = new LongTextMapEMPropertyDescriptor(CorePackage.Literals.USER_EXTENSIBLE_PROPERTY__MAP, id,getKey());
} else if ("combo".equalsIgnoreCase(type)) {
String value = attributeElement.attributeValue("value");
String[] values = null;
if(StringUtils.isBlank(value)){
values = ArrayUtils.EMPTY_STRING_ARRAY;
}else {
if(StringUtils.contains(value, ",")){
values = value.split(",");
}else {
values = new String[]{value};
}
}
attribute = new ComboMapEMPropertyDescriptor(values , CorePackage.Literals.USER_EXTENSIBLE_PROPERTY__MAP, id,getKey());
}else if (StringUtils.equals(type, "ref")) {
Map<String, String> config = new HashMap<String, String>();
for (Object obj : attributeElement.attributes()) {
Attribute attr = (Attribute) obj;
config.put(attr.getName(), attr.getValue());
}
attribute = new RefExtendedPropertyDescriptor(config, project);
} else {
attribute = new TextMapEMPropertyDescriptor(CorePackage.Literals.USER_EXTENSIBLE_PROPERTY__MAP, id,getKey());
}
if (attribute != null) {
attribute.setDisplayName(name);
descriptors.add(attribute);
}
}
}
return descriptors;
}
//��ȡ��ǰ�༭�������е���չ���Զ���
private List<Element> getExsibleModelConfigList(BasicDataBaseModel model) {
List<Element> elements = new ArrayList<Element>();
try {
//��������ģ���е���չ
if(model != null){
String xml = model.getExtend();
if (StringUtils.isNotBlank(xml)) {
Document doc = PersistentUtil.readDocument(new StringReader(xml));
if (doc != null) {
elements.addAll(doc.getRootElement().elements("ExtensibleModel"));
}
}
}
} catch (Exception e) {
}
return elements;
}
//��ȡ��ǰ��Ŀ�����е�������չ���Զ���
private List<Element> getProjectExsibleModelConfigList(IARESProject project) {
List<Element> elements = new ArrayList<Element>();
try {
//������Ŀ�����е���չ
ExtensibleModelConfigProperty config = (ExtensibleModelConfigProperty) project.getInfo().getMap().get("ExtensibleModelConfigProperty");
if (config == null) {
config = CoreFactory.eINSTANCE.createExtensibleModelConfigProperty();
}
String xml = config.getXml();
if (StringUtils.isNotBlank(xml)) {
Document doc = config.getXmlCache();
if (doc != null) {
elements.addAll(doc.getRootElement().elements("ExtensibleModel"));
}
}
} catch (Exception e) {
}
return elements;
}
}