📄 entityfieldpropertysource.java
字号:
package com.cownew.studio.modelDev.propertiesSheet;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.DocumentException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;
import com.cownew.studio.Activator;
import com.cownew.studio.modelDev.common.EntityFieldModelBean;
import com.cownew.studio.modelDev.common.EntityModelBean;
import com.cownew.studio.modelDev.common.EntityModelFileHandler;
import com.cownew.studio.modelDev.common.enumdef.CascadeEnum;
import com.cownew.studio.modelDev.common.enumdef.DataTypeEnum;
import com.cownew.studio.modelDev.common.enumdef.LinkTypeEnum;
import com.cownew.studio.modelDev.common.enumdef.OuterJoinEnum;
import com.cownew.studio.modelDev.common.properties.BooleanPropertyDescriptor;
import com.cownew.studio.modelDev.common.properties.EnumPropertyDescriptor;
import com.cownew.studio.modelDev.common.properties.IntegerPropertyDescriptor;
import com.cownew.studio.modelDev.common.properties.StandardComboBoxPropertyDescriptor;
public class EntityFieldPropertySource implements IPropertySource
{
private final int PROPID_NAME = 1;
private final int PROPID_ALIAS = 2;
private final int PROPID_DATATYPE = 4;
private final int PROPID_DBFIELDNAME = 5;
private final int PROPID_ALLOWNULL = 6;
private final int PROPID_LENGTH = 7;
private final int PROPID_ISLINKPROPERTY = 8;
private final int PROPID_LINKTYPE = 9;
private final int PROPID_LINKENTITY = 10;
private final int PROPID_CASCADETYPE = 11;
private final int PROPID_OUTERJOINTYPE = 12;
private final int PROPID_CONSTRAINED = 13;
private final int PROPID_INVERSE = 14;
private final int PROPID_LINKSERVERFIELD = 90;
private EntityFieldModelBean bean;
private IProject project;
public EntityFieldPropertySource(EntityFieldModelBean bean, IProject project)
{
super();
this.bean = bean;
this.project = project;
}
public IPropertyDescriptor[] getPropertyDescriptors()
{
List<IPropertyDescriptor> propList = new ArrayList<IPropertyDescriptor>();
propList.add(new TextPropertyDescriptor(PROPID_NAME, "name"));
propList.add(new TextPropertyDescriptor(PROPID_ALIAS, "alias"));
String[] typeDisplayStrings = new String[] { "String", "Int",
"BigDecimal", "Date", "Bool", "Clob", "Blob" };
DataTypeEnum[] typeItems = DataTypeEnum.values();
IPropertyDescriptor typePropDesc = new StandardComboBoxPropertyDescriptor(
PROPID_DATATYPE, "FieldType", typeDisplayStrings, typeItems);
propList.add(typePropDesc);
propList.add(new TextPropertyDescriptor(PROPID_DBFIELDNAME,
"DBFieldName"));
IPropertyDescriptor allowNullPropDesc = new BooleanPropertyDescriptor(PROPID_ALLOWNULL,
"allowNull");
propList.add(allowNullPropDesc);
Object dataType = getPropertyValue(PROPID_DATATYPE);
//数据类型为日期、布尔之外的类型的时候“长度”属性才有意义
if (dataType != null && dataType != DataTypeEnum.DATE
&& dataType != DataTypeEnum.BOOLEAN)
{
IPropertyDescriptor lenPropDesc = new IntegerPropertyDescriptor(
PROPID_LENGTH, "length");
propList.add(lenPropDesc);
}
//我们规定所有关联字段都必须是字符串类型
//所以这里判断只有类型为STRING类型的时候“是否连接实体属性”属性才有意义
if (dataType == DataTypeEnum.STRING)
{
BooleanPropertyDescriptor linkPropDesc = new BooleanPropertyDescriptor(PROPID_ISLINKPROPERTY,
"isLinkProperty");
propList.add(linkPropDesc);
Object isLinkProp = getPropertyValue(PROPID_ISLINKPROPERTY);
if (isLinkProp.equals(Boolean.TRUE))
{
//如果是“连接实体属性”则构造实体连接相关的属性描述者
fillLinkPropertyPart(propList);
}
}
return propList.toArray(new IPropertyDescriptor[propList.size()]);
}
/**
* 构造实体连接相关的属性描述者
*/
private void fillLinkPropertyPart(List<IPropertyDescriptor> propList)
{
propList.add(new EntityPropertyDescriptor(
PROPID_LINKENTITY, "LinkedEntity", project));
LinkTypeEnum[] linkTypeEnums = new LinkTypeEnum[] {
LinkTypeEnum.ONETOONE, LinkTypeEnum.ONETOMANY,LinkTypeEnum.MANYTOONE };
String[] linkTypeStrings = new String[] { "OneToOne",
"OneToMany","ManyToOne" };
propList.add(new StandardComboBoxPropertyDescriptor(
PROPID_LINKTYPE, "linkType", linkTypeStrings, linkTypeEnums));
propList.add(new EnumPropertyDescriptor(PROPID_CASCADETYPE,
"cascadeType", CascadeEnum.class));
propList.add(new EnumPropertyDescriptor(PROPID_OUTERJOINTYPE,
"outerJoinType", OuterJoinEnum.class));
Object linkType = getPropertyValue(PROPID_LINKTYPE);
if (linkType == LinkTypeEnum.ONETOONE)
{
propList.add(new BooleanPropertyDescriptor(PROPID_CONSTRAINED,
"constrained"));
} else if (linkType == LinkTypeEnum.ONETOMANY)
{
propList.add(new BooleanPropertyDescriptor(PROPID_INVERSE,
"inverse"));
String linkEntity = (String) getPropertyValue(PROPID_LINKENTITY);
if (linkEntity != null)
{
//只有关联类型为ONETOMANY并且关联的实体不为空的时候构造keycolumn属性描述者
String[] colArray = getLinkEntityCols(linkEntity);
IPropertyDescriptor keyColPropDesc = new StandardComboBoxPropertyDescriptor(
PROPID_LINKSERVERFIELD, "keycolumn", colArray,colArray);
propList.add(keyColPropDesc);
}
}
}
/**
* 得到实体linkEntity的所有的字段
* @param linkEntity
* @return
*/
private String[] getLinkEntityCols(String linkEntity)
{
EntityModelBean linkBean;
try
{
IFile linkFile = project.getFile(linkEntity);
linkBean = EntityModelFileHandler.xmlToBean(linkFile);
} catch (DocumentException e)
{
Activator.logException(e);
return null;
}
List<EntityFieldModelBean> fieldList = linkBean.getFieldList();
String[] fieldArray = getAllColumns(fieldList);
return fieldArray;
}
/**
* 从字段列表得到字段名
* @param fieldList
* @return
*/
private static String[] getAllColumns(
List<EntityFieldModelBean> fieldList)
{
int size = fieldList.size();
String[] fields = new String[size];
for (int i = 0, n = size; i < n; i++)
{
fields[i] = fieldList.get(i).getDbFieldName();
}
return fields;
}
public Object getPropertyValue(Object id)
{
int i = ((Integer) id).intValue();
switch (i) {
case PROPID_NAME:
return bean.getName();
case PROPID_ALIAS:
return bean.getAlias();
case PROPID_DATATYPE:
return bean.getDataype();
case PROPID_DBFIELDNAME:
return bean.getDbFieldName();
case PROPID_ALLOWNULL:
return bean.isAllowNull();
case PROPID_LENGTH:
return Integer.valueOf(bean.getLength());
case PROPID_ISLINKPROPERTY:
return Boolean.valueOf(bean.isLinkProperty());
case PROPID_LINKTYPE:
return bean.getLinkType();
case PROPID_LINKENTITY:
return bean.getLinkEntity();
case PROPID_CASCADETYPE:
return bean.getCascadeType();
case PROPID_OUTERJOINTYPE:
return bean.getOuterJoinType();
case PROPID_CONSTRAINED:
return Boolean.valueOf(bean.isConstrained());
case PROPID_INVERSE:
return Boolean.valueOf(bean.isInverse());
case PROPID_LINKSERVERFIELD:
return bean.getKeyColumn();
default:
throw new IllegalArgumentException();
}
}
public void setPropertyValue(Object id, Object value)
{
int i = ((Integer) id).intValue();
switch (i) {
case PROPID_NAME:
bean.setName((String) value);
break;
case PROPID_ALIAS:
bean.setAlias((String) value);
break;
case PROPID_DATATYPE:
bean.setDataType((DataTypeEnum) value);
break;
case PROPID_DBFIELDNAME:
bean.setDbFieldName((String) value);
break;
case PROPID_ALLOWNULL:
Boolean allowNull = (Boolean) value;
bean.setAllowNull(allowNull.booleanValue());
break;
case PROPID_LENGTH:
Integer length = (Integer) value;
bean.setLength(length.intValue());
break;
case PROPID_ISLINKPROPERTY:
Boolean isLinkProp = (Boolean) value;
bean.setLinkProperty(isLinkProp.booleanValue());
break;
case PROPID_LINKTYPE:
bean.setLinkType((LinkTypeEnum) value);
break;
case PROPID_LINKENTITY:
bean.setLinkEntity((String) value);
break;
case PROPID_CASCADETYPE:
bean.setCascadeType((CascadeEnum) value);
break;
case PROPID_OUTERJOINTYPE:
bean.setOuterJoinType((OuterJoinEnum) value);
break;
case PROPID_CONSTRAINED:
Boolean constrained = (Boolean) value;
bean.setConstrained(constrained.booleanValue());
break;
case PROPID_INVERSE:
Boolean inverse = (Boolean) value;
bean.setInverse(inverse.booleanValue());
break;
case PROPID_LINKSERVERFIELD:
bean.setKeyColumn((String) value);
break;
default:
throw new IllegalArgumentException();
}
}
public Object getEditableValue()
{
return null;
}
public boolean isPropertySet(Object id)
{
return true;
}
public void resetPropertyValue(Object id)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -