您的位置:首页 > 运维架构

SCA概念与应用实践(7.SCA装配模型--7.5属性 property)

2010-07-03 21:34 591 查看
7.5. 属性 (Property)
7.5.1. 解释
通过属性可以对实现内的变量进行设置。一个实现可以定义0个或多个属性。每个属性都有一个类型,可以是简单类型也可以是复杂类型。实现内可以为属性设置一个默认值。在运行时,实现会查看对应的component是否定义了该属性,如果定义了,那么实现使用component上定义的属性值。属性也可以定义在composite上,component可以通过source直接使用composite上定义的属性。
7.5.2. 一个简单的例子
打开TipServiceImpl, 会发现这个定义了一个property tipRate, 缺省值是10,这里计算含小费的价格公式是price * this.tipRate/100 + price。我们在component TipServiceInnerComponent上定义一个属性tipRate, 然后把值设为0, 那么最后价格就不包含tip。
Ø 在palette上选择property


图7_5_1
Ø 点到component上,给属性填上名字为tipRate



图7_5_2
Ø 在property的属性上,value上填入0



图7_5_3
Ø 运行TipServiceServer和RestaurantServiceServer, 用soapUI测试,运行后得到到的结果是38.5.而之前含小费的账单是42.35。



图7_5_4
7.5.3. property的属性
打开TipServiceInnerComponent,会看到属性定义的行
<sca:component name="TipServiceInnerComponent">
<sca:implementation.java class="restaurant2.lib.TipServiceImpl"/>
<sca:service name="TipService">
<sca:interface.java callbackInterface="restaurant2.api.TipServiceCallback" interface="restaurant2.api.TipService"/>
<sca:binding.ws uri="http://localhost:8086/TipServiceComponent"/>
</sca:service>
<sca:property name="tipRate">0</sca:property>
</sca:component>
这个是最简单的属性定义,只有名称和值。看上面那个property的属性的图,会看到它有其他的属性。
Name,必填。
Type,属性的类型 –XML schema类型的限定名
Element,属性的类型为某个XML schema全局元素的类型
Many,false属性的值是一个值;false属性的值是多个值. 多值情况下,在实现中的属性变量类型一定是集合。
mustSupply, 是否必须有值
file,定义属性值的文件
source,引用的属性来源,component可以引用composite上的property
value,属性值

7.5.4. 一个复杂的例子
Ø 在Restaurant2TipInner的Composite上添加属性allTipRatesComposite. 由于eclipsse sca tools不支持复杂类型的属性定义,所以这个只能直接编辑Restaurant2Tip.composite文件
<sca:property element="foo:PropertyRate" many="true" name="allTipRatesComposite">
<PropertyRate xmlns="">
<country>China</country>
<tipSet>
<low>0</low>
<normal>0</normal>
<high>0</high>
</tipSet>
</PropertyRate>
<PropertyRate>
<country>US</country>
<tipSet>
<low>5</low>
<normal>10</normal>
<high>15</high>
</tipSet>
</PropertyRate>
<PropertyRate xmlns="">
<country>Canada</country>
<tipSet>
<low>5</low>
<normal>10</normal>
<high>15</high>
</tipSet>
</PropertyRate>
</sca:property>

Ø Component上添加属性country,值使用文件country.property
<sca:property file="country.property" name="country"/>
Ø Component 上添加属性allTipRates,引用composite上定义的属性
<sca:property name="allTipRates" source="$allTipRatesComposite"/>
Ø 最后结果为



图7_5_5
<?xml version="1.0" encoding="UTF-8"?>
<sca:composite xmlns:foo="http://foo" xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" xmlns:tip="http://eclipse.org/Restaurant2Tip/src/Restaurant2Tip" name="Restaurant2TipInner" targetNamespace="http://eclipse.org/Restaurant2Tip/src/Restaurant2Tip">
<sca:component name="TipServiceInnerComponent">
<sca:implementation.java class="restaurant2.lib.TipServiceImpl"/>
<sca:service name="TipService">
<sca:interface.java callbackInterface="restaurant2.api.TipServiceCallback" interface="restaurant2.api.TipService"/>
<sca:binding.ws uri="http://localhost:8086/TipServiceComponent"/>
</sca:service>
<sca:property name="tipRate">0</sca:property>
<sca:property file="country.property" name="country"/>
<sca:property name="allTipRates" source="$allTipRatesComposite"/>
</sca:component>
<sca:property element="foo:PropertyRate" many="true" name="allTipRatesComposite">
<PropertyRate xmlns="">
<country>China</country>
<tipSet>
<low>0</low>
<normal>0</normal>
<high>0</high>
</tipSet>
</PropertyRate>
<PropertyRate>
<country>US</country>
<tipSet>
<low>10</low>
<normal>15</normal>
<high>20</high>
</tipSet>
</PropertyRate>
<PropertyRate xmlns="">
<country>Canada</country>
<tipSet>
<low>5</low>
<normal>10</normal>
<high>15</high>
</tipSet>
</PropertyRate>
</sca:property>
</sca:composite>
Ø 在项目Restaurant2Tip的src添加文件country.property
内容为:
<country>China</country>
Ø 在项目Restaurant2Tip下的包restaurant2.api下添加一个java bean TipPropertyBean来传递属性值
package restaurant2.api;

public class TipPropertyBean {

private String country;
private double low;
private double normal;
private double high;

private TipPropertyBean[] tipSet;

public String getCountry() {
return country;
}

public void setCountry(String country) {
this.country = country;
}

public double getLow() {
return low;
}

public void setLow(double low) {
this.low = low;
}

public double getNormal() {
return normal;
}

public void setNormal(double normal) {
this.normal = normal;
}

public double getHigh() {
return high;
}

public void setHigh(double high) {
this.high = high;
}

public TipPropertyBean[] getTipSet() {
return tipSet;
}

public void setTipSet(TipPropertyBean[] tipSet) {
this.tipSet = tipSet;
}
}
Ø 修改TipServiceImpl 来使用这些属性。新添加两个属性变量country 和allTipRates,在方法getPriceWithTip里,利用country的值,去allTipRates里找相应的tip值,然后利用这个tip值进行计算。
package restaurant2.lib;

import org.osoa.sca.annotations.Callback;

import org.osoa.sca.annotations.ConversationAttributes;

import org.osoa.sca.annotations.Property;

import org.osoa.sca.annotations.Scope;

import org.osoa.sca.annotations.Service;

import restaurant2.api.TipPropertyBean;

import restaurant2.api.TipService;

import restaurant2.api.TipServiceCallback;

@Service(TipService.class)

@Scope("CONVERSATION")

@ConversationAttributes(maxAge="1 seconds")

public class TipServiceImpl implements TipService {

@Property

public double tipRate;

@Property

public String country;

@Property

public TipPropertyBean[] allTipRates;

private TipServiceCallback tipServiceCallback;

/**

* The setter used by the runtime to set the callback reference

* @param tipServiceCallback

*/

@Callback

public void setTipServiceCallback(TipServiceCallback tipServiceCallback) {

System.out.println("setTipServiceCallback on thread " + Thread.currentThread());

this.tipServiceCallback = tipServiceCallback;

}

public TipServiceImpl(){

this.tipRate=10;

}

public void getPriceWithTip(double price) {

//return price * this.tipRate/100 + price;

System.out.println("getPriceWithTip on thread " + Thread.currentThread());

// invoke the callback

try {

//Thread.sleep(100);

if(country != null && allTipRates != null && allTipRates.length > 0){

for(TipPropertyBean tip : allTipRates){

if(tip.getCountry().equals(country)){

this.tipRate = tip.getTipSet()[0].getNormal();

break;

}

}

}

tipServiceCallback.receiveResult(price * this.tipRate/100 + price);

} catch(RuntimeException e) {

System.out.println("RuntimeException invoking receiveResult: " + e.toString());

e.printStackTrace();

} catch(Exception e) {

System.out.println("Exception invoking receiveResult: " + e.toString());

e.printStackTrace();

}

}

}

Ø 运行TipServiceServer和RestaurantServiceServer, 用soapUI测试,运行后得到到的结果是38.5
Ø 修改文件country.property
内容为:
<country>Canada</country>
运行TipServiceServer和RestaurantServiceServer, 用soapUI测试,运行后得到到的结果是42.35
Ø 修改文件country.property
内容为:
<country>US</country>
运行TipServiceServer和RestaurantServiceServer, 用soapUI测试,运行后得到到的结果是44.275

7.5.5. 属性值支持xpath表达式
修改tipRate的属性值为
<sca:property name="tipRate" source="$allTipRatesComposite/PropertyRate[country='US']/tipSet/normal"/>
那么在TipServiceImpl里面获得的tipRate的值就为15.0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: