前言:常年离线在线开发实施Windchill9.0和Windchill10.0。
带人经验极其丰富,可帮公司创建Windchill开发团队。
高效,务实,认真,负责!
所有文章全部原创,均经过测试,如有不对,欢迎留言指正。
以下是Windchill中可以监听的部分事件类型,一般是按功能划分:
wt.fc.PersistenceManagerEvent
wt.vc.VersionControlServiceEvent
wt.vc.wip.WorkInProgressServiceEvent
wt.events.summary.ModifyContentSummaryEvent
以PersistenceManagerEvent为例,所有可监听的事件在该类的静态常量中,定义如下:
public static final String PRE_STORE = "PRE_STORE";
public static final String POST_STORE = "POST_STORE";
public static final String PRE_MODIFY = "PRE_MODIFY";
public static final String POST_MODIFY = "POST_MODIFY";
public static final String PREPARE_FOR_MODIFICATION = "PREPARE_FOR_MODIFICATION";
public static final String PREPARE_FOR_VIEW = "PREPARE_FOR_VIEW";
public static final String UPDATE = "UPDATE";
public static final String PRE_REMOVE = "PRE_REMOVE";
public static final String REMOVE = "REMOVE";
public static final String PRE_DELETE = "PRE_DELETE";
public static final String POST_DELETE = "POST_DELETE";
public static final String CLEANUP_LINK = "CLEANUP_LINK";
public static final String COPY_LINK = "COPY_LINK";
所有的事件监听原理相同,我们以删除事件为例(对应的事件类型为PersistenceManagerEvent.POST_DELETE),假定存在名字为postdelete的文档对象,如果对此文档进行删除操作,则在提交确认的时候阻止并进行信息提示,实现该监听的方法如下:
创建一个空的接口ListenerService,这个是必须的。
package com.wclistener;
/**
* 空接口,什么也不做,但这是必须的
* <p>Description: </p>
* @author:
* @time: May 22, 2010 6:08:24 PM
* @version 1.0
*/
public interface ListenerService {
}
创建具体的实现类,这个类需要继承wt.services.StandardManager类并实现我们定义的空接口ListenerService,其他解释见类中的注释。
package com.wclistener;
import java.io.Serializable;
import wt.doc.WTDocument;
import wt.events.KeyedEvent;
import wt.events.KeyedEventListener;
import wt.fc.PersistenceManagerEvent;
import wt.services.ManagerException;
import wt.services.ServiceEventListenerAdapter;
import wt.services.StandardManager;
import wt.util.WTException;
/**
*
* <p>Description: </p>
* @author:
* @time: May 22, 2010 6:09:20 PM
* @version 1.0
*/
public class StandardListenerService extends StandardManager implements
ListenerService, Serializable {
private static final long serialVersionUID = 1L;
private static final String CLASSNAME = StandardListenerService.class.getName();
private KeyedEventListener listener;
public String getConceptualClassname() {
return CLASSNAME;
}
public static StandardListenerService newStandardListenerService()
throws WTException {
StandardListenerService instance = new StandardListenerService();
instance.initialize();
return instance;
}
/**
* 添加需要监听的事件
*/
protected void performStartupProcess() throws ManagerException {
listener = new WCListenerEventListener(this.getConceptualClassname());
//添加需要监听的事件,可以添加多个,这里添加的是删除事件POST_DELETE和修改事件 POST_MODIFY
getManagerService().addEventListener(listener,PersistenceManagerEvent.generateEventKey(PersistenceManagerEvent.POST_DELETE));
getManagerService().addEventListener(listener,PersistenceManagerEvent.generateEventKey(PersistenceManagerEvent.POST_MODIFY));
}
/**
* 定义内部类,用来处理相应的事件
* <p>Description: </p>
* @author:
* @time: May 18, 2010 5:53:55 PM
* @version 1.0
*/
class WCListenerEventListener extends ServiceEventListenerAdapter {
private String post_delete = PersistenceManagerEvent.POST_DELETE;
private String post_modify = PersistenceManagerEvent.POST_MODIFY;
public WCListenerEventListener(String manager_name) {
super(manager_name);
}
public void notifyVetoableEvent(Object eve) throws Exception {
if (!(eve instanceof KeyedEvent))
return;
//获取当前触发的事件对象
KeyedEvent event = (KeyedEvent) eve;
//获取当前被操作的持久化对象,如部件,文档,容器等
Object target = event.getEventTarget();
String eventType = event.getEventType();
/************************以下代码可根据实际业务进行修改******************************/
if(eventType.equals(post_delete)){
System.out.println("删除操作执行!");
}else if(eventType.equals(post_modify)){
System.out.println("修改操作执行!");
}
if (target instanceof WTDocument&& eventType.equals(post_delete)) {
WTDocument document = (WTDocument) target;
if("postdelete".equals(document.getName())){
//抛出WTException阻止删除操作的确认并提示必要的信息
throw new WTException("名字为postdelete的文档是不可被删除的!");
}
}
}
}
}
代码写完,同样需要在site.xconf中配置以便让其生效,添加如下内容:
<Property name="wt.services.service.5007" overridable="true"
targetFile="codebase/wt.properties"
value="com.wclistener.ListenerService/com.wclistener.StandardListenerService"/>
添加完毕,windchill shell中执行命令让其生效并重启methodserver:
xconfmanager -p&windchill stop&windchill start
全部配置完毕,请在任意容器中创建名字为postdelete的文档并对其执行删除操作,观察页面的提示信息和methodserver的输出信息。
整理好的代码在附件,直接拿来修改修改业务逻辑就可以用了。
前言:常年离线在线开发实施Windchill9.0和Windchill10.0。
带人经验极其丰富,可帮公司创建Windchill开发团队。
高效,务实,认真,负责!