您的位置:首页 > 其它

SCA概念与应用实践(5. 一个例子演示)

2010-06-23 22:23 363 查看
5.一个例子演示

这个例子参照http://wiki.eclipse.org/STP/SCA_Component/SCA_First_Steps_With_Composite_Designer,但过程有些不同。

5.1.Application定义
下图是我们要实现的application



图5_1
这个只有一层composite,命名为restaurant,
它包含5个component
RestaurantServiceComponent
显示餐馆菜单
结帐账单.
MenuServiceComponent
提供菜单名字和价格.
BillServiceComponent
计算账单,包括消费税和小费.
VATServiceComponent
计算包含消费税的账单价格.
TipServiceComponent
计算小费的价格.

5.2.过程
5.2.1.创建一个javaproject
Ø选择菜单【New>JavaProject】.
ØProject名字为"Restaurant2".选择“Createseparatefoldersforsourcesandclassfiles”,点击next
Ø在Libraries里面,添加UserLibraryTUSCANY



图5_2
Ø点击”next”和”finish”.

5.3.创建SCACompositediagram
Ø在project上右键,选择【New>Other....】
Ø在SCA目录下,选择SCACompositeDiagram,点击next



图5_3
Ø文件名字设为Restaurant2.composite_diagram,点击Finish.

完成后SCACompositeDesigner自动打开新创建的文件.在diagram上右键,选择ShowProperties来打开Propertiesview



图5_4
5.4.添加component
使用palette创建component



图5_5



图5_6

填入RestaurantServiceComponent作为component的名字。同样创建其他的compoent,MenuServiceComponent,BillServiceComponent,VatServiceComponent,andTipServiceComponent.



图5_7
5.5.添加Service
有两种方式给component添加service
一个是使用palette,在palette上选择service,然后在要添加的component上点一下,一个service就添加到component上
第二个方法是把鼠标移到component上,一个工具条自动就出现,选择绿色的那个。



图5_8
*在RestaurantServiceComponent上添加RestaurantService,
*在MenuServiceComponent上添加MenuService,
*在BillServiceComponent上添加BillService,
*在VatServiceComponent上添加VatService,
*在TipServiceComponent上添加TipService.



图5_9
5.6.添加References
类似方法给component添加reference
*在RestaurantServiceComponent上添加menuService,
*在RestaurantServiceComponent上添加billService,
*在BillServiceComponent上添加vatService,
*在BillServiceComponent上添加tipService



图5_10
5.7.wirereference到service
有palette上的wire把reference和service连起来
RestaurantServiceComponent上的reference(menuService)连到MenuServiceComponent的service(MenuService),以此类推,把所有reference都连到相应service



图5_11
5.8.Promoteservice
把RestaurantServiceComponent上的serivce(RestaurantService)promote到composite层,这样外面就可以调用这个application提供的功能。
在RestaurantService绿色图标上右键,选择promot



图5_12

5.9.用SCACompositeModelEditor打开Restaurant2.comosite,在Restaurant2.comosite右键选openwith



图5_13
用TextEditor打开



图5_14
可以在这两个editor里编辑composite,会自动同步

5.10.给service定义javainterface
把鼠标移到RestaurantServiceComponent上的service上,会自动有一个工具条出现,选择addJavaInterface



图5_15
选中新添加的JavaInterface图标,在properties中设置Interface的类名,包括package,restaurant2.api.RestaurantService



图5_16
以此类推给所有service添加JavaInterface
名字分别为restaurant2.api.MenuService
restaurant2.api.BillService
restaurant2.api.VatService
restaurant2.api.TipService



图5_17
5.11.给component定义javaimplementationclass的名字
鼠标移到RestaurantServiceComponent上,会自动有一个工具条出现,选择addJavaImplementation



图5_18
选中新添加的JavaImplementation图标,在properties中设置class,包括package,restaurant2.lib.RestaurantServiceImpl



图5_19
以此类推,给所有component添加JavaImplementation,类名分别为
restaurant2.lib.MenuServiceImpl
restaurant2.lib.BillServiceImpl
restaurant2.lib.VatServiceImpl
restaurant2.lib.TipServiceImpl



图5_20
5.12.生成代码框架
首先在project上右键选择AddSCANature



图5_21
然后在Restaurant2.composite上右键选择SCA>GenerateJavaSkeleton…



图5_22
出现确认窗口,点ok



图5_23
生成后项目结构是



图5_24
生成的代码只有一个空壳,要在里面添加方法定义和实现。生成的代码的样子
/* *GeneratedfromRestaurant2.compositeon06/17/10at16:37:42. */ packagerestaurant2.api; importorg.osoa.sca.annotations.Remotable; @Remotable publicinterfaceBillService{ //TODO:addtheserviceoperations. }

5.13.接口类的定义

RestaurantService

packagerestaurant2.api;

publicinterfaceRestaurantService{
Menu[]getMenus();
doublegetBill(Menumenu);
}



MenuService

packagerestaurant2.api;

publicinterfaceMenuService{
Menu[]getMenu();
doublegetPrice(Menumenu);
}


BillService

packagerestaurant2.api;

publicinterfaceBillService{
doublegetBill(doublemenuPrice);
}


VatService

packagerestaurant2.api;

publicinterfaceVatService{
doublegetPriceWithVat(doubleprice);
}


TipService

packagerestaurant2.api;

publicinterfaceTipService{
doublegetPriceWithTip(doubleprice);
}

添加DTOMenu:

packagerestaurant2.api;

importjava.io.Serializable;

publicclassMenuimplementsSerializable{

privateintid;

privateStringdetails;
publicMenu(){}

publicMenu(intidC,StringdetailsC){

this.id=idC;

this.details=detailsC;

}
publicStringprintMenu(){
returnthis.details;
}
publicintgetId(){

returnthis.id;

}

publicStringgetDetails(){

returndetails;
}
publicvoidsetDetails(Stringdetails){

this.details=details;
}

publicvoidsetId(intid){
this.id=id;
}

}

5.14.实现类

RestaurantService

packagerestaurant2.lib;

importorg.osoa.sca.annotations.Reference;
importorg.osoa.sca.annotations.Service;

importrestaurant2.api.BillService;
importrestaurant2.api.Menu;
importrestaurant2.api.MenuService;
importrestaurant2.api.RestaurantService;

@Service(RestaurantService.class)
publicclassRestaurantServiceImplimplementsRestaurantService{

privateMenuServicemenuService;
privateBillServicebillService;

@Reference
publicvoidsetMenuService(MenuServicemenuService){
this.menuService=menuService;
}

@Reference
publicvoidsetBillService(BillServicebillService){
this.billService=billService;
}

publicdoublegetBill(Menumenu){
doublemenuPrice=this.menuService.getPrice(menu);
returnthis.billService.getBill(menuPrice);
}

publicMenu[]getMenus(){
returnthis.menuService.getMenu();
}
}



MenuService

packagerestaurant2.lib;

importorg.osoa.sca.annotations.Init;

importorg.osoa.sca.annotations.Service;

importrestaurant2.api.Menu;

importrestaurant2.api.MenuService;

@Service(MenuService.class)

publicclassMenuServiceImplimplementsMenuService{

privateMenu[]menus;

privatedouble[]prices;

@Init

publicvoidinit(){

this.menus=newMenu[]{

newMenu(0,"GrilledhamburgerwithFrenchfries"),

newMenu(1,"Roastedchickenwithvegetables"),

newMenu(2,"Duckbreastinanorangesauce"),

newMenu(3,"Duckfoiegras&mangochutney")};

this.prices=newdouble[]{10,15,35,50};

}

publicMenu[]getMenu(){

returnthis.menus;

}

publicdoublegetPrice(Menumenu){

returnthis.prices[((Menu)menu).getId()];

}

}
publicdoublegetPrice(Menumenu){
returnthis.prices[((MenuImpl)menu).getId()];
}
}



Billservice

packagerestaurant2.lib;

importorg.osoa.sca.annotations.Reference;
importorg.osoa.sca.annotations.Service;

importrestaurant2.api.BillService;
importrestaurant2.api.TipService;
importrestaurant2.api.VatService;

@Service(BillService.class)
publicclassBillServiceImplimplementsBillService{

privateVatServicevatService;
privateTipServicetipService;

@Reference
publicvoidsetVatService(VatServicevatService){
this.vatService=vatService;
}

@Reference
publicvoidsetTipService(TipServicetipService){
this.tipService=tipService;
}

publicdoublegetBill(doublemenuPrice){
doublepricewithTaxRate=
this.vatService.getPriceWithVat(menuPrice);
doublepriceWithTipRate=
this.tipService.getPriceWithTip(pricewithTaxRate);
returnpriceWithTipRate;
}
}


VatService

packagerestaurant2.lib;

importorg.osoa.sca.annotations.Service;

importrestaurant2.api.VatService;

@Service(VatService.class)
publicclassVatServiceImplimplementsVatService{

publicdoublevatRate;

publicVatServiceImpl(){
this.vatRate=19.6;
}

publicdoublegetPriceWithVat(doubleprice){
returnprice*this.vatRate/100+price;
}
}


Tipservice

packagerestaurant2.lib;

importorg.osoa.sca.annotations.Property;
importorg.osoa.sca.annotations.Service;

importrestaurant2.api.TipService;

@Service(TipService.class)
publicclassTipServiceImplimplementsTipService{

@Property
publicdoubletipRate;

publicTipServiceImpl(){
this.tipRate=10;
}

publicdoublegetPriceWithTip(doubleprice){
returnprice*this.tipRate/100+price;
}
}

5.15.测试Restaurant

创建一个新的测试类Client。这个client会把Restaurant2发布到tuscany里面,然后调用promote出来的那个service的interface。

packagetest;

importorg.apache.tuscany.sca.host.embedded.SCADomain;

importrestaurant2.api.Menu;
importrestaurant2.api.RestaurantService;

publicclassClient{

publicstaticvoidmain(String[]args)throwsException{
SCADomainscaDomain=SCADomain.newInstance("Restaurant2.composite");
RestaurantServicerestaurantService=scaDomain.getService(
RestaurantService.class,"RestaurantServiceComponent");
Menu[]menus=restaurantService.getMenus();
System.out.println("---Menu---");
for(Menum:menus){
System.out.println("-"+m.printMenu());
}
System.out.println();
Menumenu=menus[3];
System.out.println("Mychoice:"+menu.printMenu());
System.out.println();
doubleprice=restaurantService.getBill(menu);
System.out.println("Price("+menu.printMenu()+"):"+price);
scaDomain.close();
}
}

5.16.运行client:
在classClient上右键选择【Runas>JavaApplication
运行结果为



图5_25
到此一个简单的application就开发完了。后面会使用这个例子,结合SCA里面的概念仔细说明
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: