前言:
本来想自己写一篇实例文章,原文太过琐细,但是,自己按照Tuscany给的实例跑了半天,后来才发现,这个文章给的内容是不全的,所以,只能翻译出来,给大家看看,多探讨一下,咱们一起把程序跑通,呵呵。
原文内容:
这篇文章将向你描述如何下载Tuscany,在Eclipse中将Tuscany添加到用户库中,创建一个名为Store的Java工程实例,然后运行它并通过浏览器访问它。
虽然本指南的很多图片是基于Java SCA 1.3.2版本的,但是你在操作那些必要的步骤是还是应该尽量使用最新版本。 |
“点击此处,获取本指南视频”
你需要做的第一件事情是为你将要下载的Tuscany介质创建一个存放文件夹。
接下来,你下载最新版本的介质。登陆浏览器,输入下面网址:
最新版本 - http://cwiki.apache.org/TUSCANY/sca-java-releases.html
将bin文件压缩包和src文件压缩包都下载到你刚创建的文件夹中,下载后,你在文件夹中将看到以下内容:
然后,解压bin文件夹压缩包到本地,解压完成后,你将在你的硬盘上看到如下目录结构:
启动Eclipse并创建一个包含Tuscany运行所必须的所有jar包的用户库。
从菜单栏中选择Window 然后Preferences...打开参数对话框。
在对话框左侧的导航树中点击Java ,再点击Build Path,然后点击User Libraries
点击用户库对话框的右侧的New...按钮创建一个新的用户库Tuscany。
刚创建的用户库是空的,你需要通过点击右侧的Add JARs...按钮将Tuscany安装目录下的lib子目录中的所有jar包导入到新建的Tuscany用户库中。
你可能对调试Tuscany源码有兴趣,下一步我们将把Tuscany源码包和运行jar包相匹配。在用户库对话框中,下拉滚动条,直到你找到tuscany运行jar包,选择Source attachment
点击Edit... 右侧的编辑按钮,在弹出编辑对话框中点击External File...按钮,然后选中你之前下载的Tuscany的源码包。
通过点击OK 按钮,关闭本对话框和参数对话框,完成Eclipse中Tuscany的配置。
接下来,将向你展示你即将创建的综合服务程序的综合示意图。
你将创建的综合服务程序包括4个服务。所提供的综合服务是一个网上店铺。
这有一个你可以用来查询目录项的目录服务,根据货币代码配置它可以提供目录项的美元或者欧元价格。目录服务并不自己进行外汇汇兑,而是通过汇兑服务来做这项工作。这里还有购物车服务,从目录服务中选择的条目都可以被添加到其中,它被作为一个REST服务来实现的,目录服务结合JSONRPC协议实现,而购物车服务结合ATOM协议实现. 最后,这里还有一个面向用户服务,它提供基于商铺用户界面的浏览服务.商铺服务通过JSONRPC协议和ATOM协议分别使用目录服务、购物车服务。
在这一步,你将在Eclipse中创建一个Java项目来管理这个综合服务程序。
点击工具条上的新建Java工程按钮,打开工程创建对话框。然后输入“store”作为工程名,然后在Project Layout 中选择Create separate folders for sources and class files。
点击Next 按钮,然后在下一界面进入Libraries 标签页。点击右侧Add Library...按钮,为工程添加TUSCANY用户库。
点击Finish 按钮,结束新建Java工程对话框,完成“store”工程的创建。
首先,你需要创建2个源码包文件夹,在稍后的步骤里你将在这2个源码包中实现你的服务。
选中”store”工程,点击工具条上的新建Java包文件夹按钮打开新建包文件夹对话框。然后输入”services”作为包文件夹名,点击Finish按钮完成包文件夹的创建。
重复之前的步骤创建另一个包为”ufservices”包文件夹。现在”store”工程应该看起来如下图:
接下来,你将在”services”包中实现综合服务程序的常规服务,而在”ufservices”包中实现综合服务程序的用户交互服务。
这一步,你将创建目录服务接口并实现它。
选中”services”包文件夹。然后点击新建Java类按钮旁边的下拉箭头,从下拉菜单中选中新建接口选项。在对话框中输入”Catalog”作为接口名,点击Finish按钮关闭对话框。Java编辑器将打开一个新的接口编辑窗口,使用下面代码覆盖编辑窗口原有代码。
package services;
import org.osoa.sca.annotations.Remotable;
@Remotable
public interface Catalog {
Item[] get();
}
|
再次选中"services"包文件夹,点击新建Java类按钮。在对话框中输入"CatalogImpl"作为类名,并引入” Catalog”接口,然后点击Finish按钮关闭对话框。
Java编辑器将打开一个新的类编辑窗口,使用下面代码覆盖编辑窗口原有代码。
package services;
import java.util.ArrayList;
import java.util.List;
import org.osoa.sca.annotations.Init;
import org.osoa.sca.annotations.Property;
import org.osoa.sca.annotations.Reference;
public class CatalogImpl implements Catalog {
@Property
public String currencyCode = "USD";
@Reference
public CurrencyConverter currencyConverter;
private List<Item> catalog = new ArrayList<Item>();
@Init
public void init() {
String currencySymbol = currencyConverter
.getCurrencySymbol(currencyCode);
catalog.add(new Item("Apple", currencySymbol
+ currencyConverter.getConversion("USD", currencyCode, 2.99)));
catalog.add(new Item("Orange", currencySymbol
+ currencyConverter.getConversion("USD", currencyCode, 3.55)));
catalog.add(new Item("Pear", currencySymbol
+ currencyConverter.getConversion("USD", currencyCode, 1.55)));
}
public Item[] get() {
Item[] catalogArray = new Item[catalog.size()];
catalog.toArray(catalogArray);
return catalogArray;
}
}
|
完成上述步骤后,”store”工程应该看起来如下图,
提示: 类” CatalogImpl”上的红叉是因为我们还没有实现它引用”CurrencyConverter”接口。
在这一步中,你将创建汇兑服务接口并实现它。
依照前边你所学到的步骤创建接口并实现。首先在”services”包中创建一个名为"CurrencyConverter"的接口。使用下面代码覆盖原有代码。
package services;
import org.osoa.sca.annotations.Remotable;
@Remotable public interface CurrencyConverter { public double getConversion(String fromCurrenycCode, String toCurrencyCode, double amount);
public String getCurrencySymbol(String currencyCode); }
|
接下来在”services”包中创建一个名为"CurrencyConverterImpl" 的Java类,并使用下面代码覆盖原有代码。
package services;
public class CurrencyConverterImpl implements CurrencyConverter {
public double getConversion(String fromCurrencyCode, String toCurrencyCode, double amount) {
if (toCurrencyCode.equals("USD"))
return amount;
else if (toCurrencyCode.equals("EUR"))
return ((double)Math.round(amount * 0.7256 * 100)) /100;
return 0;
}
public String getCurrencySymbol(String currencyCode) {
if (currencyCode.equals("USD"))
return "$";
else if (currencyCode.equals("EUR"))
return "E"; return "?";
}
}
|
完成上述步骤后,"store"工程应该看起来如下图所示。
在这一步中,你将创建Item、Cart和Total服务接口,以及实现ShoppingCart类。
重复之前学到的方式创建接口并实现它们。
首先在 "services"包中创建名为"Item"的Java类,并复制下面的代码覆盖原有代码。
package services;
public class Item {
private String name;
private String price;
public Item() {
}
public Item(String name, String price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
|
在 "services"包中创建名为" Cart "的Java接口,并复制下面的代码覆盖原有代码。
package services;
import org.apache.tuscany.sca.data.collection.Collection; import org.osoa.sca.annotations.Remotable;
@Remotable public interface Cart extends Collection<String, Item> {
} |
在 "services"包中创建名为" Total "的Java接口,并复制下面的代码覆盖原有代码.
package services;
import org.osoa.sca.annotations.Remotable;
@Remotable public interface Total { String getTotal(); }
|
在 "services"包中创建名为" ShoppingCartImpl "的Java类,并复制下面的代码覆盖原有代码。
package services;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.apache.tuscany.sca.data.collection.Entry;
import org.apache.tuscany.sca.data.collection.NotFoundException;
import org.osoa.sca.annotations.Init;
import org.osoa.sca.annotations.Scope;
@Scope("COMPOSITE")
public class ShoppingCartImpl implements Cart, Total {
private Map<String, Item> cart;
@Init
public void init() {
cart = new HashMap<String, Item>();
}
public Entry<String, Item>[] getAll() {
Entry<String, Item>[] entries = new Entry[cart.size()];
int i = 0;
for (Map.Entry<String, Item> e : cart.entrySet()) {
entries[i++] = new Entry<String, Item>(e.getKey(), e.getValue());
}
return entries;
}
public Item get(String key) throws NotFoundException {
Item item = cart.get(key);
if (item == null) {
throw new NotFoundException(key);
} else {
return item;
}
}
public String post(String key, Item item) {
if (key == null) {
key = "cart-" + UUID.randomUUID().toString();
}
cart.put(key, item);
return key;
}
public void put(String key, Item item) throws NotFoundException {
if (!cart.containsKey(key)) {
throw new NotFoundException(key);
}
cart.put(key, item);
}
public void delete(String key) throws NotFoundException {
if (key == null || key.equals("")) {
cart.clear();
} else {
Item item = cart.remove(key);
if (item == null)
throw new NotFoundException(key);
}
}
public Entry<String, Item>[] query(String queryString) {
List<Entry<String, Item>> entries = new ArrayList<Entry<String, Item>>();
if (queryString.startsWith("name=")) {
String name = queryString.substring(5);
for (Map.Entry<String, Item> e : cart.entrySet()) {
Item item = e.getValue();
if (item.getName().equals(name)) {
entries.add(new Entry<String, Item>(e.getKey(), e
.getValue()));
}
}
}
return entries.toArray(new Entry[entries.size()]);
}
public String getTotal() {
double total = 0;
String currencySymbol = "";
if (!cart.isEmpty()) {
Item item = cart.values().iterator().next();
currencySymbol = item.getPrice().substring(0, 1);
}
for (Item item : cart.values()) {
total += Double.valueOf(item.getPrice().substring(1));
}
return currencySymbol + String.valueOf(total);
}
} |
提示: 由于Tuscany尚未支持会话服务,因此cart被作为一个黑盒实现。cart被定义为静态的。
完成上述步骤后,工程”store”将看起来如下图所示。