使用Eclipse构建Tuscany实例(1)

前言:

本来想自己写一篇实例文章,原文太过琐细,但是,自己按照Tuscany给的实例跑了半天,后来才发现,这个文章给的内容是不全的,所以,只能翻译出来,给大家看看,多探讨一下,咱们一起把程序跑通,呵呵。

 

原文内容:

准备、设置、开始——开始使用Tuscany

这篇文章将向你描述如何下载Tuscany,在Eclipse中将Tuscany添加到用户库中,创建一个名为Store的Java工程实例,然后运行它并通过浏览器访问它。

 tip虽然本指南的很多图片是基于Java SCA 1.3.2版本的,但是你在操作那些必要的步骤是还是应该尽量使用最新版本。

“点击此处,获取本指南视频”

安装Tuscany

你需要做的第一件事情是为你将要下载的Tuscany介质创建一个存放文件夹。

download

接下来,你下载最新版本的介质。登陆浏览器,输入下面网址:
最新版本
- http://cwiki.apache.org/TUSCANY/sca-java-releases.html
将bin文件压缩包和src文件压缩包都下载到你刚创建的文件夹中,下载后,你在文件夹中将看到以下内容:

download result

然后,解压bin文件夹压缩包到本地,解压完成后,你将在你的硬盘上看到如下目录结构:

structure

在Eclipse中配置Tuscany

启动Eclipse并创建一个包含Tuscany运行所必须的所有jar包的用户库。

从菜单栏中选择Window 然后Preferences...打开参数对话框。
在对话框左侧的导航树中点击Java ,再点击Build Path,然后点击User Libraries
点击用户库对话框的右侧的New...按钮创建一个新的用户库Tuscany。

new user library

刚创建的用户库是空的,你需要通过点击右侧的Add JARs...按钮将Tuscany安装目录下的lib子目录中的所有jar包导入到新建的Tuscany用户库中。

new userlibrary add 

你可能对调试Tuscany源码有兴趣,下一步我们将把Tuscany源码包和运行jar包相匹配。在用户库对话框中,下拉滚动条,直到你找到tuscany运行jar包,选择Source attachment

source attachment 

点击Edit... 右侧的编辑按钮,在弹出编辑对话框中点击External File...按钮,然后选中你之前下载的Tuscany的源码包。

source attachment edit 

通过点击OK 按钮,关闭本对话框和参数对话框,完成Eclipse中Tuscany的配置。

创建你的第一个综合服务程序

 

 接下来,将向你展示你即将创建的综合服务程序的综合示意图。 

composition diagram 

你将创建的综合服务程序包括4个服务。所提供的综合服务是一个网上店铺。
这有一个你可以用来查询目录项的目录服务,根据货币代码配置它可以提供目录项的美元或者欧元价格。目录服务并不自己进行外汇汇兑,而是通过汇兑服务来做这项工作。这里还有购物车服务,从目录服务中选择的条目都可以被添加到其中,它被作为一个REST服务来实现的,目录服务结合JSONRPC协议实现,而购物车服务结合ATOM协议实现. 最后,这里还有一个面向用户服务,它提供基于商铺用户界面的浏览服务.商铺服务通过JSONRPC协议和ATOM协议分别使用目录服务、购物车服务。

创建一个Java工程

在这一步,你将在Eclipse中创建一个Java项目来管理这个综合服务程序。

点击工具条上的新建Java工程按钮New project,打开工程创建对话框。然后输入“store”作为工程名,然后在Project Layout 中选择Create separate folders for sources and class filesnew project

 点击Next 按钮,然后在下一界面进入Libraries 标签页。点击右侧Add Library...按钮,为工程添加TUSCANY用户库。

library 

点击Finish 按钮,结束新建Java工程对话框,完成“store”工程的创建。

structure 

构建服务

首先,你需要创建2个源码包文件夹,在稍后的步骤里你将在这2个源码包中实现你的服务。
选中”store”工程,点击工具条上的新建Java包文件夹按钮New package打开新建包文件夹对话框。然后输入”services”作为包文件夹名,点击Finish按钮完成包文件夹的创建。

new java package 

重复之前的步骤创建另一个包为”ufservices”包文件夹。现在”store”工程应该看起来如下图:

structure

接下来,你将在”services”包中实现综合服务程序的常规服务,而在”ufservices”包中实现综合服务程序的用户交互服务。

目录服务

这一步,你将创建目录服务接口并实现它。
选中”services”包文件夹。然后点击新建Java类按钮new class旁边的下拉箭头,从下拉菜单中选中新建接口选项new inteface。在对话框中输入”Catalog”作为接口名,点击Finish按钮关闭对话框。Java编辑器将打开一个新的接口编辑窗口,使用下面代码覆盖编辑窗口原有代码。

package services;

import org.osoa.sca.annotations.Remotable;

@Remotable
public interface Catalog {
	Item[] get();
}

再次选中"services"包文件夹,点击新建Java类按钮new class。在对话框中输入"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”工程应该看起来如下图,

structure

提示: 类” 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"工程应该看起来如下图所示。

structure

 

购物车服务

 

在这一步中,你将创建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”将看起来如下图所示。

structure

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值