JAVA项目开发笔记(3)Shark部分: Shark API

本文对比了Shark1.1与Shark2.0之间的主要差异,包括事务处理方式的变化、管理接口的调整、用户认证流程的改进以及异常处理的不同。特别介绍了如何在Shark2.0中进行用户管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  本文主要列出项目中使用的Shark API ,并列出已知的Shark1.1和shark2.0(TWS)的差别,不定时更新。

转载请注明出处(Cooper的专栏    http://blog.youkuaiyun.com/cooper_lyt

 

Shark1.1和shark2.0的设计上的总体差别

1.事务:

        Shark2.0支持jotm 所以在API中把所有方法中带有 SharkTransaction 参数的重载版本都去掉了,转而使用jotm来对事物进行控制,这么做的后果就是你要像shark的demo中一样在调用shark API时都要手动启动一个事务,不然会报 Transaction is not begun(没有事务曾经被启动)的错误。这样很麻烦,因为Spring 提供了一个jotm的事务管理器所为我在项目中使用了Spring声明式事务,这样就不用在代码中夹杂着jotm事务处理的代码了,有关这方式的使用我会在框架融合部分的文章中加以说明。

2.管理接口:

    Shark2.0去掉了 AdminInterface接口和取得该接口实例的方法Shark.getInstance().getAdminInterface(),(在shark1.1中该接口提供取得其它管理接口的方法,如AdminMisc、PackageAdministrator等),而把AdminInterface的方法直接拿到了Shark.getInstance()中去。

也就是说在shark1.0中要取得AdminMisc的代码为

Shark.getInstance().getAdminInterface().getAdminMisc()
而在Shark2.0中是这样的

 

Shark.getInstance().getAdminMisc()

 

3.Shark用户管理

    在shark1.1中用个用户管理的接口:UserGroupAdministration,在文档中有明确的体现,用法如下

 


  1.       UserGroupAdministration ugAdmin = Shark.getInstance()
  2.          .getAdminInterface()
  3.          .getUserGroupAdministration();
  4.       ugAdmin.createGroup("developers""sweat-shop");
  5.       ugAdmin.createUser("developers",
  6.                          "user",
  7.                          "secret",
  8.                          "Jane",
  9.                          "Doe",
  10.                          "some@email.address");
  11.       System.out.println("Group and user created!");

可以使用这个类来管理用户、用户组、权限,之后使用Sharkconnection的connect方法来登录,如果用户名或密码错误会抛出异常。但是在Shark2.0中这个UserGroupAdministration 被去掉了,在shark的文档中也没找到可以达到相同功能的接口,而且Sharkconnection的connect方法表现的也十分怪异,当使用connect方法时无论你提供的密码是对是错都会成功返回Sharkconnection而且不抛出任何异常,如果用户名也是错误的话,那么Shark 引擎会创建这个用户。后来想想设计者也对的,因为connect方法是“连接”而不是“验证”,那么shark2.0怎样来管理用户、用户组、权限和用户的登录呢。这个问题我找了很久后来终于在shark 的源码中找到了答案原来shark2.0提供了另一个接口来做这些事,那就是org.enhydra.shark.api.admin.UserGroupManagerAdmin(注意,这个包下的类在Shark API文档中并没有被提到,但是文档中有对它的父类org.enhydra.shark.api.internal.usergroup.UserGroupManager的说明,方法差不多大家可以参考一下 ),但是怎么得到这个接口的实例呢(为了这个问题我可是看了好长时间shark的源码,你们有福了有我告诉你们),我根据shark源码改动后的方法如下,可以返回这个接口的实例:

  1.     public UserGroupManagerAdmin getUserGroupAdmin() {
  2.         UserGroupManagerAdmin userGroupAdmin = null;
  3.         try {
  4.             Object ama = Shark.getInstance().getPlugIn(
  5.                     SharkConstants.PLUGIN_USER_GROUP);
  6.             if (ama instanceof UserGroupManagerAdmin) {
  7.                 userGroupAdmin = (UserGroupManagerAdmin) ama;
  8.             }
  9.         } catch (Exception e) {
  10.         }
  11.         return userGroupAdmin;
  12.     }

有了这个接口用可以实现用户管理相关的功能了,如验证用户的登录:

  1.         if (getUserGroupAdmin().validateUser(
  2.                 connectInfo.getUserIdentification(), connectInfo.getPassword())) {
  3.             System.out.println("********************Vaildateuser is true");
  4.         } else {
  5.             System.out.println("********************Vaildateuser is False");
  6.         }

注:因为加入了单独的验证功能,所以Shark1.1中的connect方法也就不会再抛出ConnectFailed, NotConnected 异常了。

4.管理接口中的用户认证

    在shark1.1中有的管理接口在使用之前需要对登录的用户进行认证如ExecutionAdministration在使用之前要有如下代码(shark2.0的SharkConnection的connect方法的参数也进行了改动):

  1. private ExecutionAdministration ea = null;
  2.         ea = Shark.getInstance().getAdminInterface()
  3.                 .getExecutionAdministration();
  4. ea.connect(userName, password, SharkAdapter.engineName, null);

这样在使用时不但要对SharkConnection进行登录而且还需要对使用到的管理接口进行登录,  而在Shark2.0中则不需要这么做了,shark2.0去掉了ExecutionAdministration 等管理接口的connect方法,可以在获得管理接口后直接调用管理接口的方法,而在方法中加入了一个用户会话信息的参数:WMSessionHandle.而这个参数可以 通过SharkConnection 的getSessionHandle()获得。代码如下(项目中的代码片断,取得所有加载的包,getSharkLogon().getSConn()返回的是已认证的SharkConnection ):

  1.         PackageAdministration pa = Shark.getInstance()
  2.                 .getPackageAdministration();
  3.         packageInfos.clear();
  4.         String pkIDs[] = pa.getOpenedPackageIds(getSharkLogon().getSConn()
  5.                 .getSessionHandle());

5.异常处理:

    不知是什么原因Shark2.0的API方法不再抛出某些Shark自定义的异常,目前本人只发现好像BaseException不会再被抛出了,而是直接抛出Exception类的异常,而某些方法还是会抛出Shark自定义的异常,如complete会抛出CannotComplete异常,我们在使用时可能捕获不同的异常进行不同的处理是很方便的如(代码中使用了JSF,shark版本为1.1):

  1.     public String logonActive() {
  2.         FacesContext facesContext = FacesContext.getCurrentInstance();
  3.         try {
  4.             LogonInfo logonInfo = new LogonInfo();
  5.             logonInfo.logon(userName, password);
  6.             HttpServletRequest request = (HttpServletRequest) facesContext
  7.                     .getExternalContext().getRequest();
  8.             HttpSession session = request.getSession();
  9.             session.setAttribute("logonInfo", logonInfo);
  10.             return "success";
  11.         } catch (BaseException e) {
  12.             FacesMessage msg = MessageFactory.getMessage(facesContext,
  13.                     "error_cannot_login""");
  14.             msg.setSeverity(FacesMessage.SEVERITY_ERROR);
  15.             facesContext.addMessage(null, msg);
  16.             return "error";
  17.         } catch (ConnectFailed e) {
  18.             FacesMessage msg = MessageFactory.getMessage(facesContext,
  19.                     "error_userorpassword""");
  20.             msg.setSeverity(FacesMessage.SEVERITY_WARN);
  21.             facesContext.addMessage(null, msg);
  22.             return "failure";
  23.         } catch (NotConnected e) {
  24.             FacesMessage msg = MessageFactory.getMessage(facesContext,
  25.                     "error_cannot_login""");
  26.             msg.setSeverity(FacesMessage.SEVERITY_ERROR);
  27.             facesContext.addMessage(null, msg);
  28.             return "error";
  29.         }
  30.     }

但是shark1.1中的异常类并没有被删除,通过import还可以正常导入使用只是shark API不会再抛出这种异常了。

 

 

具体的API用法及Shark1.1同2.0的差别:

    本来想在这部分写一些shark的API方法的,可是发现这么做不如只接去看shark API的javadoc(安装shark自带,很全)所以只列出某些用法上有说道的方法

    待继...........

 

转载请注明出处(Cooper的专栏    http://blog.youkuaiyun.com/cooper_lyt

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值