基于RSA开发SOA Pattern(四)

日期: 2007-12-14 作者:田晨 来源:TechTarget中国

  1. 两个基本扩展点:

  public boolean expand(PatternParameterValue value) 在参数被绑定时触发,完成绑定参数的动作,同时可以观察到该方法返回值为boolean类型,但是不要以为返回false该动作不会发生,即无论扩展后该方法返回何值,bind事件都会被触发。若想改变这种状况,则必须进行验证,验证方法后面会提到。下面代码为在Service内部类扩展该方法的代码:

  public boolean expand(PatternParameterValue value) {
 Object obj = value.getValue();
 if( obj instanceof Classifier ) {
  Classifier classifier = (Classifier) obj;
  // instance — instance of the pattern in the model which
  gives values specified for this pattern.
  com.ibm.xtools.patterns.framework.AbstractPatternInstance patternInstance =
  value.getOwningInstance();
  CachePatternImplementation impl;
  impl = (CachePatternImplementation) instanceToImplMap.get(patternInstance);
  if (impl == null) {
   impl = new CachePatternImplementation (patternInstance);
   instanceToImplMap.put(patternInstance, impl);
  }
  impl.expandService(classifier);
  }
   return true;
  }

  该段代码完成在绑定Service参数时,根据绑定的类生成相应的UML2 元素,其中主要的实现在CachePatternImplementation类中完成,以减少项目主类中的代码数量。

  public boolean expand(PatternParameterValue.Removed value) 该方法在解除参数绑定时所触发,只要解除动作发生了,那么该方法将被执行。下面代码仍为在Service内部类扩展该方法的代码:比如,我们以在该例中的Service的expand方法编程,我们在该例子中为该Pattern的Service方法添加代码如下:

  public boolean expand(PatternParameterValue.Removed value) {
 Object obj = value.getValue();
 if( obj instanceof Classifier ) {
  Classifier classifier = (Classifier) obj;
  // instance — instance of the pattern in the model which gives
  values specified for this pattern.
  com.ibm.xtools.patterns.framework.AbstractPatternInstance patternInstance =
  value.getOwningInstance();
  CachePatternImplementation impl;
  impl = (CachePatternImplementation) instanceToImplMap.get(patternInstance);
  if (impl == null) {
   impl = new CachePatternImplementation (patternInstance);
   instanceToImplMap.put(patternInstance, impl);
  }
  impl.removeService(classifier);
  }
   return true;
  }

  2. 依赖关系扩展点:

  生成的依赖关系扩展点有如下三个

  public boolean update(PatternParameterValue value, PatternParameterValue dependencyValue)
  public boolean update(PatternParameterValue.Maintained value, PatternParameterValue.Removed dependencyValue)
  public boolean update(PatternParameterValue.Removed value, PatternParameterValue.Maintained dependencyValue)

  我们在此例中只有getEntry参数建立了依赖关系,而至扩展了第二个方法,因为第二个方法是在getEntry所依赖的Service方法删除时调用,而getEntry所绑定的参数的提供这恰为Service的参数,所以在Service参数解除绑定时,对应的getEntry也应该解除绑定,代码如下所示:

public boolean update(PatternParameterValue.Maintained value,
PatternParameterValue.Removed dependencyValue){
 Object obj = value.getValue();
 if( obj instanceof Operation) {
  Operation oper = (Operation) obj;
  // instance — instance of the pattern in the model which gives values
  specified for this pattern.
  com.ibm.xtools.patterns.framework.AbstractPatternInstance patternInstance =
  value.getOwningInstance();
  CachePatternImplementation impl;
  impl = (CachePatternImplementation) instanceToImplMap.get(patternInstance);
  if (impl == null) {
   impl = new CachePatternImplementation (patternInstance);
   instanceToImplMap.put(patternInstance, impl);
  }
  impl.unbindOperation(oper);
  }
   return true;
  }

  这段代码利用CachePatternImplementation类中的方法解除了getEntry方法的参数绑定。

  3. 验证扩展点:

  在此例中我们注意到Service的参数应当为Interface或是Class,而我们在指定类型时只能将其指定为Classifier,而Classifer作为UML2种的一个类型,包含许多子类型,比如Component、UseCase等等,而将这些类型作为Service的参数是不允许的,所以我们必须使用验证扩展点来保证这一点。在此例中我们扩展的方法及代码如下所示是:

protected  IStatus validToAddArgument(PatternParameterValue.Proposed proposed){
 // Use to judge whether the parameter can be bound.
 IStatus status = super.validToAddArgument(proposed);  
 if (status.isOK()){
  Object obj = proposed.getValue();
           if ((obj instanceof Class)||( obj instanceof Interface)) ;
           else return Status.CANCEL_STATUS;  
 }
 return status;
}

  至此,基本Pattern Authoring 的工作就算完成了,下面进行调试。

  步骤四:调试

  调试是必须运行一个runtime_workbench,这里我们建议选择eclipse的JVM,并设置参数为-Xj9,这样可以支持"hotcode-replacement"方便我们减少我们在调试过程中启动runtime_workbench的次数。调试界面如下图所示:

  1. 在Runtime_workbench中切换到Model perspective,并打开Pattern Explorer视图,如上图所示。

  2. 可以看到我们刚刚创建的Cache Pattern已经在Tutorial Pattern组中,将其拖至建好的空的Model中,建立测试用的接口或类,绑定适当的参数,就可以借助RSA提供的强大功能进行调试了。

  调试完成,也就完成了这个简单而又实用的Cache Pattern的开发工作。

  结语

  通过本文的介绍,我们可以看到,模式是一种抽象的软件解决方案,用来解决一个在特定场景中的连续的或反复出现的问题。开发设计过程中大量地使用模式有很多的优点,我们可以利用已有的模式来解决一些软件问题,从而节省了设计人员的时间。模式的用户并不需要知道如何去设计一个具体的模式,但是用户需要有好的模式文档,好的模式文档能帮助模式的用户定位、选择和应用不同的模式。用户需要了解这个模式是用来解决什么问题的,这个问题是如何被解决的以及应用这个模式的结果。模式的作者能够创造多种类型的与模式打包在一起的模式文档,在模式应用过程中,用户可以使用这些文档。

  模式的可重用性还能够节省大量的设计开发时间。 可重用的特性增加了软件的可靠性和编码设计的连续性。一个模式可以在一个项目中、一个公司内部以至不同公司间共享。模式的局限性由模式的设计以及模式开发者的设计意图所决定。而RSA中的模式都由标准的Eclipse插件构成,我们可以通过将包含模式的插件打包成可重用的资产(Reusable Asset Specifications)并且在RAS资产库中注册和管理它们来实现最大程度的模式可重用性。通过由模式开发者提供的模式的关键字和描述的匹配,潜在的模式用户可以从RAS资产库里搜索和选择所需的模式。模式这种特殊的资产遵循RAS(Reusable Asset Specifications)所制定的标准, 通过遵循这些统一的规范,模式用户和模式开发者之间可以非常便利地交换模式。

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐