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
MenuService
BillService
VatService
TipService
添加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;
}
}
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
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;
}
}
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里面的概念仔细说明
这个例子参照
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
生成的代码只有一个空壳,要在里面添加方法定义和实现。生成的代码的样子
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:
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.实现类
RestaurantServicepackagerestaurant2.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
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
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
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。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里面的概念仔细说明
相关文章推荐
- SCA概念与应用实践(5. 一个例子演示)
- SCA概念与应用实践(1. 介绍和内容)
- SCA概念与应用实践(3. SCA实现介绍)
- SCA概念与应用实践(2. SCA基本概念)
- SCA概念与应用实践(7.SCA装配模型--7.1 compoent)
- SCA概念与应用实践(7.SCA装配模型--7.6服务service & 7.7引用reference)
- SCA概念与应用实践(3. SCA实现介绍)
- SCA概念与应用实践(7.SCA装配模型--7.2 实现 implementation)
- SCA概念与应用实践(1. 介绍和内容)
- SCA概念与应用实践(7.SCA装配模型--7.4 composite)
- SCA概念与应用实践(4.环境安装和设置)
- SCA概念与应用实践(2. SCA基本概念)
- SCA概念与应用实践(7.SCA装配模型--7.2 实现 implementation)
- SCA概念与应用实践(4.环境安装和设置)
- SCA概念与应用实践(6. SCA装配图的解释)
- SCA概念与应用实践(7.SCA装配模型--7.3 接口 interface)
- SCA概念与应用实践(8.Tuscany中使用Domain Manager部署)
- SCA概念与应用实践(7.SCA装配模型--7.8连线 wire)
- SCA概念与应用实践(7.SCA装配模型--7.1 compoent)
- SCA概念与应用实践(6. SCA装配图的解释)