到目前为止,一个完整的流程设计器已基本完成,为了增加系统的可扩展性,比如目前活动的类型有三种,假如以后我们要增加活动的类型,怎么办?按照目前的做法,我们只能修改代码,为了使系统的扩展性更好,即我们如果要增加活动类型,只需要修改配置文件,而无须修改现有系统的代码,为此,我们把活动类型定义一个扩展点,用户以后要增加活动类型,只需扩展这个扩展点就可以了。(代码)
在plugin.xml文件中,增加扩展点,Id为activity,Name为Activity,Schema为schema/activity.exsd
activity.exsd具体内容如下:
<? xml version='1.0' encoding='UTF-8' ?>
<!-- Schema file written by PDE -->
< schema targetNamespace ="com.example.workflow" >
< annotation >
< appInfo >
< meta .schema plugin ="com.example.workflow" id ="activity" name ="Activity" />
</ appInfo >
< documentation >
[Enter description of this extension point.]
</ documentation >
</ annotation >
< element name ="extension" >
< complexType >
< sequence >
< element ref ="activity" minOccurs ="1" maxOccurs ="unbounded" />
</ sequence >
< attribute name ="point" type ="string" use ="required" >
< annotation >
< documentation >
</ documentation >
</ annotation >
</ attribute >
< attribute name ="id" type ="string" >
< annotation >
< documentation >
</ documentation >
</ annotation >
</ attribute >
< attribute name ="name" type ="string" >
< annotation >
< documentation >
</ documentation >
< appInfo >
< meta .attribute translatable ="true" />
</ appInfo >
</ annotation >
</ attribute >
</ complexType >
</ element >
< element name ="activity" >
< complexType >
< attribute name ="name" type ="string" use ="required" >
< annotation >
< documentation >
</ documentation >
</ annotation >
</ attribute >
< attribute name ="description" type ="string" >
< annotation >
< documentation >
</ documentation >
</ annotation >
</ attribute >
< attribute name ="icon" type ="string" use ="required" >
< annotation >
< documentation >
</ documentation >
</ annotation >
</ attribute >
< attribute name ="type" type ="string" use ="required" >
< annotation >
< documentation >
</ documentation >
</ annotation >
</ attribute >
< attribute name ="figure" type ="string" use ="required" >
< annotation >
< documentation >
</ documentation >
< appInfo >
< meta .attribute kind ="java" basedOn =":org.eclipse.draw2d.IFigure" />
</ appInfo >
</ annotation >
</ attribute >
</ complexType >
</ element >
< annotation >
< appInfo >
< meta .section type ="since" />
</ appInfo >
< documentation >
[Enter the first release in which this extension point appears.]
</ documentation >
</ annotation >
< annotation >
< appInfo >
< meta .section type ="examples" />
</ appInfo >
< documentation >
[Enter extension point usage example here.]
</ documentation >
</ annotation >
< annotation >
< appInfo >
< meta .section type ="apiInfo" />
</ appInfo >
< documentation >
[Enter API information here.]
</ documentation >
</ annotation >
< annotation >
< appInfo >
< meta .section type ="implementation" />
</ appInfo >
< documentation >
[Enter information about supplied implementation of this extension point.]
</ documentation >
</ annotation >
< annotation >
< appInfo >
< meta .section type ="copyright" />
</ appInfo >
< documentation >
</ documentation >
</ annotation >
</ schema >
定义这个扩展点有若干个活动节点组成,每个活动节点具有name,description,type,figure,icon属性,其中icon属性代表活动在编辑器托盘中显示的图标,有大小两种图标,而figure是活动要在编辑器区域显示图形对应的类,这个类必须实现IFigure接口,type代表活动类型。
定义完这个扩展点后,我们再在plugin.xml中自己扩展这个扩展点,代码如下:
point ="com.example.workflow.activity" >
< activity
description ="Create a StartActivity"
figure ="org.eclipse.draw2d.Ellipse"
icon ="start16.gif,start24.gif"
name ="Start"
type ="1" >
</ activity >
< activity
description ="Create a Activity"
figure ="org.eclipse.draw2d.RectangleFigure"
icon ="activity16.gif,activity24.gif"
name ="Activity"
type ="2" ></ activity >
< activity
description ="Create a EndActivity"
figure ="org.eclipse.draw2d.Triangle"
icon ="end16.gif,end24.gif"
name ="End"
type ="3" >
</ activity >
</ extension >
如果以后要增加活动类型的话,直接在这里扩展就可以了,要实现不修改原来的代码,就增加活动类型的话,还必须修改一些地方。
首先新建一个模型,来对应扩展点中对应的各个活动,代码如下:public class CreationEntry {
private String name;//活动名称
private String description;//活动描述
private String icon;//编辑器托盘上活动的图标
private String type;//活动类型
private String figure;//活动在编辑器中显示的图形
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getFigure() {
return figure;
}
public void setFigure(String figure) {
this.figure = figure;
}
}
同时我们要新建一个模型工厂类,功能类似于原来的SimpleFactory,代码如下:
import org.eclipse.gef.requests.CreationFactory;
import com.example.workflow.model.CreationEntry;
public class CreationEntryFactory implements CreationFactory {
private CreationEntry entry;
public CreationEntryFactory(CreationEntry entry){
this.entry = entry;
}
public Object getNewObject() {
AbstractActivity activity = new AbstractActivity();
activity.setName(entry.getName());
activity.setFigure(entry.getFigure());
return activity;
}
public Object getObjectType() {
return entry.getType();
}
}
同时修改一下WorkflowProcessXYLayoutEditPolicy类中的方法getCreateCommand,如下:
return new AbstractActivityCreateCommand((AbstractActivity) request
.getNewObject(), (WorkflowProcess) getHost().getModel(),
(Rectangle) getConstraintFor(request));
}
另外还要修改一下类AbstractActivityEditPart中的方法createFigureForModel()
try {
return (IFigure)Class.forName(getCastedModel().getFigure()).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
还有给模型AbstractActivity增加属性figure,以及该属性的get/set方法。
修改原来WorkflowProcessEditorPaletteFactory中方法createActivitiesDrawer,同时增加一个方法getCreationEntry(),这个方法的目的就是取得所用扩展我们定义活动扩展点地方。
IExtensionPoint point = Platform.getExtensionRegistry()
.getExtensionPoint(Activator.PLUGIN_ID + ".activity");
List<CreationEntry> entry = new ArrayList<CreationEntry>();
CreationEntry model = null;
if(point != null){
for (IExtension extension : point.getExtensions()){
for (IConfigurationElement config : extension
.getConfigurationElements()){
model = new CreationEntry();
model.setName(config.getAttribute("name"));
model.setDescription(config.getAttribute("description"));
model.setIcon(config.getAttribute("icon"));
model.setType(config.getAttribute("type"));
model.setFigure(config.getAttribute("figure"));
entry.add(model);
}
}
return entry;
}
return null;
}
/** */ /** */
/** */ /** Create the "Activities" drawer. */
private static PaletteContainer createActivitiesDrawer() {
PaletteDrawer componentsDrawer = new PaletteDrawer("Process");
for(CreationEntry entry : getCreationEntry()){
componentsDrawer.add(new CombinedTemplateCreationEntry(
entry.getName(), entry.getDescription(), entry.getType(),
new CreationEntryFactory(entry),
ImageDescriptor
.createFromFile(Activator.class, "icons/" +
entry.getIcon().substring(0, entry.getIcon().indexOf(","))),
ImageDescriptor.createFromFile(Activator.class,
"icons/" + entry.getIcon().substring(entry.getIcon().indexOf(",")+1))));
}
return componentsDrawer;
}
至此,扩展点定义完成,以后要增加活动类型,我们只需扩展这个扩展点,指定一下活动的类型,名称,活动在托盘和编辑器中显示的图标就可以了,再也不需要去修改原来的代码了。