SCA开发:开发示例 SCA 应用程序(二)

日期: 2007-12-13 作者:Sreedevi Penugonda 来源:TechTarget中国

  清单 2 显示了 PayrollDataService Java 接口。

  清单 2. PayrollDataService Java 接口
       
package services.payrolldata;
public interface PayrollDataService {
float getBasic(String employeeID);
float getvariablePay(String employeeID);
float getHRA(String employeeID);
float getProvidentFund(String employeeID);
float getConveyance(String employeeID);
float getIncomeTax(String employeeID);
float getProfessionalTax(String employeeID);
float getNetPay(String employeeID);
}  

  清单 3 说明了 PayrollDataServiceImpl Java 实现。

  清单 3. PayrollDataServiceImpl Java 实现
       
package services.payrolldata;
@Service(PayrollDataService.class)
public class payrollDataServiceImpl implements payrollDataService {
public float getBasic(String employeeID){  . . . }
public float getVariablePay(String employeeID){  . . . }
public float getHRA(String employeeID){  . . . }
public float getProvidentFund(String employeeID){ . . . }
float getConveyance(String employeeID){  . . .}
float getProfessionalTax(String employeeID){ . . . }
public float getNetPay(String employeeID){  . . . }
}  

  上面的代码片段实现了之前的 PayrollDataService 接口。在实现中使用了一个 @Service Annotation 来声明服务及其接口。

  清单 4 显示了上述实现的组件类型、side 文件。

  清单 4. 组件类型、side 文件
       
<xml version="1.0" encoding="ASCII"?>
<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
<service name="payrollDataService">
<interface.java interface="services.payrolldata.PayrollDataService"/>
</service>
</componentType>

  Payroll Data Service Component:SCA 组件是通过配置实现的引用和属性创建的。配置引用需要将其连接到其他组件提供的服务或外部服务。此处,我们将通过配置 PayrollDataServiceImpl 创建 PayrollDataServiceComponent。

  将使用 component 元素将所创建的 SCA 组件添加到 sca.module 文件,该元素具有一个 name 属性,指定组件的名称。

  清单 5 显示了创建 payrollDataServiceComponent 后的 sca.module 文件。

  清单 5. 创建了 payrollDataServiceComponent 后的 sca.module 文件
       
<?xml version="1.0" encoding="ASCII"?>
<module xmlns="http://www.osoa.org/xmlns/sca/0.9"
name="innovasolutions.payrollmodule">
<component name="payrollDataServiceComponent">
<implementation.java class="services.payrolldata.PayrollDataServiceImpl">
</component>
</module>

  创建 TaxRateRules Web 服务外部服务:此处我们将创建一个外部服务 TaxRateRulesService,以提供向 innovasolutions.payrollmodule 的员工提供 TaxRateRulesService 接口的服务。

  我们首先创建一个名为 services/taxraterules 的子目录,以将 TaxRateRulesService 外部服务所需的所有文件放入其中。业务合作伙伴实际实现此外部服务,将提供一个 TaxRateRulesService.wsdl。为了处理静态数据类型,我们为 wsdl portType 创建了对应的 Java 接口。

  清单 6 显示了 wsdl portType 的 Java 接口的大致情况。

  清单 6. wsdl portType 的 Java 接口
       
package services.taxrate;
public interface TaxRateRulesService {
public float getTaxRate (Float taxableIncome);
}

  接下来,我们将以下代码添加到前面指定的 sca.module 文件,以创建名为 TaxrateRulesService 的外部服务。

  清单 7 显示了添加 TaxrateRulesService 后的 sca.module 文件。

  清单 7. 添加 TaxrateRulesService 后的 sca.module 文件
       
<externalService name="TaxRateRulesService">
<interface.java interface="services.taxraterules.TaxRateRulesService"/>
<binding.ws port="http://www.taxrules.com/ TaxRateRulesService #
wsdl.endpoint(TaxRateRulesService / TaxRateRulesService SOAP)"/>
</externalService>

  Payroll Service Implementation:此处我们将讨论 PayrollServiceImpl 的实现,该实现提供一个服务,此服务在 innovasolutions.payrollmodule 中向其员工提供 PayrollService 接口。此实现使用两个其他服务提供的接口引用这两个服务,即 PayrollDataService 接口(本地服务)和 TaxRateRulesService 接口(外部服务)。

  我们将首先创建名为 services/payroll 的子目录,并将所有组成 PayrollServiceImpl 实现的文件放入其中。

  清单 8 显示了 PayrollService Java 接口。

  清单 8. PayrollService Java 接口
       
package services.payroll;
import org.osoa.sca.annotations.Remotable;
@Remotable
public interface PayrollService{
public PayrollStatement getPayrollStatement(String employeeID);

  上面的 PayrollService Java 接口包含一个 getPayrollStatement() 方法,其参数是 employeeID,将返回 PayrollStatement 对象。由于这需要为外部服务,因此使用 @Remotable Annotation 将接口声明为远程接口。在此实现中,通过远程服务交换的所有参数都是服务数据对象(Service Data Objects,SDO)类型的数据。

  清单 9 显示了 PayrollStatement Java 接口。

  清单 9. PayrollStatement Java 接口
       
package services.payroll;
import java.util.List;
public interface PayrollStatement {
List getPayrollDetails();
float getNetPay();
}
 
  清单 10 显示了 PaySplitUP Java 接口。

  清单 10. PaySplitUP Java 接口
  
package services.payroll;
public interface PaySplitUP {
String getPaycategory();
void setPaycategory(String payCategory);
void setEarnings();
void setDeductions();
float getEarnings();
float getDeductions();
}
 
  清单 11 说明了 PayrollServiceImpl Java 实现类。

  清单 11. PayrollServiceImpl Java 实现类
   
package services.payroll;
import java.util.List;
import commonj.sdo.DataFactory;
import org.osoa.sca.annotations.Property;
import org.osoa.sca.annotations.Reference;
import services.payrolldata.PayrollDataService;
import services.taxrate.TaxRateRulesService;
public class PayrollServiceImpl implements PayrollService {
@Property
private String currency = "INR";
@Reference
private PayrollDataService payrollDataService;
@Reference
private TaxRateRulesService taxraterulesService;
public PayrollStatement getPayrollStatement (String employeeID) {
DataFactory dataFactory = DataFactory.INSTANCE;
PayrollStatement payrollStatement =
(PayrollStatement)dataFactory.create(PayrollStatement.class);
List payslip = payrollStatement.getPayrollDetails();
float basic = payrollDataService.getBasic(employeeID);
PlaySplitUP basicSalary
 = (PlaySplitUP)dataFactory.create(PlaySplitUP.class);
basicSalary.setPaycategory("BASIC");
basicSalary.setEarnings(currencyConverter(basic));
payslip.add(basicSalary);
. . . . . . . code for HRA . . . .
. . . . . . . code for Variable pay . . . .
. . . . . . . code for conveyance. . . .
. . . . . . . code for Profident fund . . . .
float IncomeTaxAmount = payrollDataService.getIncomeTax(employeeID);
PlaySplitUP IncomeTax
 = (PlaySplitUP)dataFactory.create(PlaySplitUP.class);
IncomeTax.setPaycategory("INCOMETAX");
IncomeTax.setDeductions(currencyConverter(IncomeTaxAmount));
payslip.add(IncomeTax);
. . . . . . . code for Professional Tax . . . . . .
return payrollStatement;
}
private float currencyConverter(float value){
if (currency.equals("INR")) return value;
else
if (currency.equals("USD")) return value * 45.5f;
 else return 0.0f;
}
}
 
  上面所示的 PayrollServiceImpl 类实现了 PayrollService 接口。PayrollServiceImpl 使用 @Reference Annotation 定义了两个成员变量,以引用另外两个服务,即 PayrollDataService 和 TaxRateRulesService。SCA 运行时通过注入解析这些引用。PayrollServiceImpl 使用 @Property Annotation 在运行时配置成员变量 currency。PayrollStatement 对象是使用 SDO 数据工厂 API 作为服务数据对象 (SDO) 创建的。

  清单 12 显示了上述 PayrollServiceImpl 的组件类型文件。
 
  清单 12. PayrollServiceImpl 的组件类型文件
   
<?xml version="1.0" encoding="ASCII"?>
<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<service name="PayrollService">
<interface.java interface="services.payroll.PayrollService"/>
</service>
<reference name="payrollDataService">
<interface.java interface="services.payrolldata.PayrollDataService"/>
</reference>
<reference name="stockRatestockQuoteService">
<interface.java interface="services.taxRateRules.TaxRateRulesService"/>
</reference>
<property name="currency" type="xsd:string" default="INR"/>
</componentType>

  Payroll Service Component:现在我们将通过配置上面实现的 PayrollServiceImpl 来创建 PayrollServiceComponent。我们将对上面指定的 sca.module 文件添加若干行代码来包括 PayrollServiceComponent,如清单 13 中所示。

  清单 13. 添加了额外代码行的 sca.module 文件
   
<component name="PayrollServiceComponent">
<implementation.java class="services.payroll.payrollServiceImpl"/>
<properties>
<v:currency>INR</v:currency>
</properties>
<references>
<v:payrollDataService>PayrollDataServiceComponent</v:payrollDataService>
<v:taxRateRulesService>TaxRateRulesService</v:taxRateRulesService>
</references>
</component>

  创建 payroll 服务 Web 服务入口点:下一步我们将创建名为 PayrollService 的入口点来发布 PayrollService,以便 Web 服务客户机能够访问 PayrollService。需要首先创建 SCA 运行时用于绑定到入口点的 WSDL 定义文件,然后才能在 sca.module 文件中创建入口点。我们向 sca.module 文件添加数行代码来表示 PayrollService 入口点的创建。

  清单 14 显示了添加到上面指定的 sca.module 文件中的代码行。

  清单 14. 添加了额外代码行的指定 sca.module 文件
   
<entryPoint name="PayrollService">
<interface.java interface="services.payroll.PayrollService"/>
<binding.ws port="http://www.innovasolutions.com/PayrollService#
wsdl.endpoint(PayrollService/PayrollServiceSOAP)"/>
<reference>PayrollServiceComponent</reference>
</entryPoint>

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐